Linux 清理占用RAM的Cache、Buffer和Swap
由于内存的高价格,各类操作系统都需要高效的管理内存的使用,GUN/Linux内存管理也有一套内存管理分配的策略。
如果某个进程占用了过多的内存,而你想要清理这部分内存,Linux提供了相应的命令来清理ram cache的使用
如何清除 Linux 中的缓存?
- 只清理PageCache(页缓存)
# sync; echo 1 > /proc/sys/vm/drop_caches |
- 只清理dentries和inode
sync; echo 2 > /proc/sys/vm/drop_caches |
- 全部清理PageCache、dentries和inode
sync; echo 3 > /proc/sys/vm/drop_caches |
解释一下上面运行的命令
sync将会刷新系统的buffer,命令分隔符号 ";" 进行命令的分隔,shell将会等待上一个命令执行完成后再执行下一个命令。
drop_caches文件的编辑将会在不杀掉进程的情况下清理缓存。就像在内核文档中提到的那样。
echo命令进行drop_cache文件的写入
如果只是清理disk cache,echo 1是最安全的,次命令只会清理page cache
生产不建议使用echo 3,除非你清楚的明白你在做什么,echo 3将会清理PageCache、dentries和inode
Linux的设计理念是,读请求访问disk之前先访问disk cache,如果在disk cache中找到要读取的内容,
这个读请求就不会再去请求读disk,如果我们将disk cache清理掉,所有的读请求都将从磁盘读取
数据,然后再缓存至disk cache。因为清理后的第一次请求在disk cache中找不到。另外disk cache
的清理将会导致系统变慢几秒钟,因为所有的请求第一次都会请求到disk
定时清理
我们可以写个shell脚本,通过crontab每天凌晨两点清理cache。
脚本
创建文件clearcache.sh,脚本内容如下
#!/bin/bash # Note, we are using "echo 3", but it is not recommended in production instead use "echo 1" echo "echo 3 > /proc/sys/vm/drop_caches"
授权
# chmod 755 clearcache.sh
定时执行
设置crontab定时2点执行
# crontab -e
添加内容到crontab -e所出现的文本中
0 2 * * * /path/to/clearcache.sh
crontab的详细使用请参照11 Cron Scheduling Jobs.
是否应该定时清理cache呢?
定时清理cache并不是好想法,可能某一天由于未知原因,凌晨两点清理cache后,
用户请求你的网页静态资源等从磁盘加载,导致用户体验很差
如果在清理cache的过后,大量的用户从磁盘读取数据,还会导致服务器压力过大,导致软件crash
redis 和mongodb memcache等占用缓存的服务器,千万不要做cache清理
如何清理Linux 中的Swap?
如果你想要清理swap空间,可以运行以下命令
# swapoff -a && swapon -a
当你完全理解上面命令的意思之后,你可以将以上脚本加入你的crontab任务中,进行定期清理
我们可以将清理swap和清理buffer/cache的脚本融合在一起,写成脚本,用于定时清理或者方便清理操作。