Liunx中 Buff/Cache占比过高解决方法
一、问题背景
free -h时看到buff/cache占比过高,导致free过低无法正常使用业务服务。
二、参数解释
1.参数对比
Mem Swap
total 系统总的可用物理内存 系统总的可用交换内存
userd 已经被使用的物理内存 已经被使用的交换内存
free 空闲的物理内存 空闲的交换内存
shared 被共享使用的物理内存 N/A
buff/cache buffer和cache使用的物理内存之和 N/A
available 可用的物理内存大小 N/A
2.free与available区别
free就是真正尚未被使用的物理内存大小;
available就是从应用程度的角度看到的可用内存数量。(Linux内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是buff/cache。当应用程序没有足够的free内存可用,内核就会从buffer和cache中回收一部分内存来满足应用程序的需求。理论上来说available=free+buffer+cache,但实际上available会小于三者之和,因为不是所有的free/buffer都能释放)。
三、解决方案
Linux具有先进的缓存机制,会针对dentry、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作用来提高读写效率。但是在进行了大量文件操作之后,缓存会把内存资源基本用光,虽然文件读取效率提高了,但是物理内存会逐渐被吃光。
因为服务进行了频繁的文件读写操作,但是为什么操作系统不会主动回收呢,原来是因为drop_caches的默认参数设置的就是不释放的。
1.drop_caches含义
drop_caches的值可以是0-3之间的数字,代表不同的含义:0:不释放(系统默认值);1:释放页缓存;2:释放dentries和inodes;3:释放所有缓存。
2.释放命令
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
3.定时脚本
> vim clean.sh
#!/bin/bash#每两小时清除一次缓存
echo "开始清除缓存"
sync;sync;sync #写入硬盘,防止数据丢失
sleep 20#延迟20秒
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
> chmod +x clean.sh
> crontab -e
# 每两小时执行一次
0 */2 * * * /opt/clean.sh