Linux 清理占用RAM的Cache、Buffer和Swap

由于内存的高价格,各类操作系统都需要高效的管理内存的使用,GUN/Linux内存管理也有一套内存管理分配的策略。

如果某个进程占用了过多的内存,而你想要清理这部分内存,Linux提供了相应的命令来清理ram cache的使用

Linux 清理占用RAM的Cache、Buffer和Swap_第1张图片

如何清除 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的脚本融合在一起,写成脚本,用于定时清理或者方便清理操作。

你可能感兴趣的:(linux)