正德厚生,臻于至善

在 Linux 上如何清除内存的 Cache、Buffer 和交换空间

sudo su - root
sync; echo 1 > /proc/sys/vm/drop_caches; echo 0 > /proc/sys/vm/drop_caches

drop_caches的值可以是0-3之间的数字,代表不同的含义:

0:不释放(系统默认值);默认情况下表示不释放内存,由操作系统自动管理;
1:释放页缓存;To free pagecache.
2:释放dentries和inodes;To free dentries and inodes.
3:释放所有缓存;To free pagecache, dentries and inodes.
其中cache缓存清空命令有三个:

释放完内存后改回去让系统重新自动分配内存。

(1)、清理pagecache(页面缓存)
sync        # sync命令可以多执行几遍;
echo 1 > /proc/sys/vm/drop_caches     或者 sysctl -w vm.drop_caches=1
(2)、清理dentries(目录缓存)和inodes
sync        # sync命令可以多执行几遍;
echo 2 > /proc/sys/vm/drop_caches     或者 sysctl -w vm.drop_caches=2
(3)、清理pagecache、dentries和inodes
sync        # sync命令可以多执行几遍;
echo 3 > /proc/sys/vm/drop_caches     或者 sysctl -w vm.drop_caches=3
(4)、上面三种方式都是临时释放缓存的方法,要想永久释放缓存,需要在/etc/sysctl.conf文件中配置:vm.drop_caches=1/2/3,然后sysctl -p生效即可!
(5)、另外,可以使用sync命令来清理文件系统缓存,还会清理僵尸(zombie)对象和它们占用的内存

echo 0 >/proc/sys/vm/drop_caches
注:在2.6.x系列的内核中可以设置为0,3系列的内核中设置为0就会报错,write error: Invalid argument。只能重启服务器恢复。
free -m #看内存是否已经释放掉了。

清除Linux中缓存(Cache)
每个 Linux 系统有三种选项来清除缓存而不需要中断任何进程或服务。

(LCTT 译注:Cache,译作“缓存”,指 CPU 和内存之间高速缓存。Buffer,译作“缓冲区”,指在写入磁盘前的存储再内存中的内容。在本文中,Buffer 和 Cache 有时候会通指。)

仅清除页面缓存(To free pagecache)
# sync; echo 1 > /proc/sys/vm/drop_caches; echo 0 > /proc/sys/vm/drop_caches

清除目录项和inode(To free dentries and inodes)
# sync; echo 2 > /proc/sys/vm/drop_caches; echo 0 > /proc/sys/vm/drop_caches
   
清除页面缓存,目录项和inode(To free pagecache, dentries and inodes)
# sync; echo 3 > /proc/sys/vm/drop_caches; echo 0 > /proc/sys/vm/drop_caches
上述命令的说明:

sync 将刷新文件系统缓冲区(buffer),命令通过“;”分隔,顺序执行,shell在执行序列中的下一个命令之前会等待命令的终止。正如内核文档中提到的,写入到drop_cache将清空缓存而不会杀死任何应用程序/服务,echo命令做写入文件的工作。

如果你必须清除磁盘高速缓存,第一个命令在企业和生产环境中是最安全,"...echo 1> ..."只会清除页面缓存。 在生产环境中不建议使用上面的第三个选项"...echo 3 > ..." ,除非你明确自己在做什么,因为它会清除缓存页,目录项和inodes。

说明,释放前最好sync一下,防止丢数据。
因为LINUX的内核机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以增加文件以及的读写速度。

清除Linux的交换空间:
swapoff -a && swapon -a
定时释放
[root@dehetu]# mkdir -p /root/scripts
[root@dehetu]# vim /root/scripts/freemem.sh
#!/bin/bash

used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`

echo "===========================" >> /var/log/mem.log
date >> /var/log/mem.log
echo "Memory usage | [Use:${used}MB][Free:${free}MB]" >> /var/log/mem.log

if [ $free -le 100 ] ; then
                sync && echo 1 > /proc/sys/vm/drop_caches
                sync && echo 2 > /proc/sys/vm/drop_caches
                sync && echo 3 > /proc/sys/vm/drop_caches
                echo "OK" >> /var/log/mem.log
else
                echo "Not required" >> /var/log/mem.log
fi

将脚本添加到crond任务,定时执行。
[root@dehetu]# echo "*/30 * * * * root /root/scripts/freemem.sh" >> /var/spool/cron/root

https://linux.cn/article-5627-1.html

http://blog.chinaunix.net/uid-24020646-id-2939696.html

https://blog.51cto.com/moerjinrong/2141884

赞(0) 打赏
未经允许不得转载:徐万新之路 » 在 Linux 上如何清除内存的 Cache、Buffer 和交换空间
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏