linux使用top查看buff/cache过高

查看

top
效果如下:
KiB Mem :  16000000 total,   4000000 free,  4000000 used,   8000000 buff/cache

发现,使用不高,但是可用很低,是因为 buff/cache 占用了很多。

原因

linux存取文件会导致内存被用光,即便是程序结束后也不会被正常释放,这就会导致buffers和cached占用过高。

total:是指计算机总物理内存
used:已用的内存
free:空余的内存
total = used + free总内存
shared:被多个进程共享的内存
buffers:用于存放要输出到disk(块存储)的数据,在这里buff是指被OS buffer住的内存
cached:存放从disk上读出的数据;buffer和cache是为了提高IO性能并由OS管理

解决方法

linux有先进的缓存机制,会针对dentry、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作用来提高读写效率。但是在进行了大量文件操作之后,缓存会把内存资源基本用光,虽然文件读取效率提高了,但是物理内存会逐渐被吃光。
服务进行了频繁的文件读写操作,但是为什么操作系统不会主动回收呢,是因为drop_caches的默认参数设置的就是不释放的。

drop_caches的值可以是0-3之间的数字,代表不同的含义:
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存

启动定时任务

crontab -e

如下定时任务:

0 3 * * * /usr/bin/sh /app/free_mem.sh

SH 文件

#! /bin/sh
used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`
echo "===========================" >> /app/logs/mem.log
date >> /app/logs/mem.log
echo "Memory usage before | [Use:${used}MB][Free:${free}MB]" >> /app/logs/mem.log
if [ $free -le 6000 ] ; 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
        used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`
        free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`
        echo "Memory usage after | [Use:${used_ok}MB][Free:${free_ok}MB]" >> /app/logs/mem.log
        echo "OK" >> /app/logs/mem.log
else
        echo "Not required" >> /app/logs/mem.log
fi
exit 1

你可能感兴趣的:(linux,buff/cache)