后台监控程序监控服务器内存使用过高;
排查
free 405M , buff/cahce 6.4G , availabe: 6.5G
availabe很高,但是真正剩余能直接使用的内存free很低,大部分内存被cache了,cache这部分内存是系统缓存的内存;
atop后发现slab占用5.2G内存,上面的cache中绝大部分都是slab占用了,那什么是slab?
slab是Linux操作系统的一种内存分配机制,slab分配算法采用cache 存储内核对象。slab 缓存、从缓存中分配和释放对象然后销毁缓存的过程必须要定义一个 kmem_cache 对象,然后对其进行初始化这个特定的缓存包含 32 字节的对象;
slabtop
#:slabtop
发现dentry占中最大,而且100%都是激活的,系统无法释放;
首先,弄清楚dentry_cache的概念及作用:目录项高速缓存,是Linux为了提高目录项对象的处理效率而设计的;它记录了目录项到inode的映射关系。因此,当应用程序发起stat系统调用时,就会创建对应的dentry_cache项更进一步,如果每次stat的文件都是不存在的文件,那么总是会有大量新的dentry_cache项被创建)。
既然是缓存的,如何清除掉呢?
既然是系统缓存的,理论上系统是可以释放掉的,无需应用关心的,但是如果是应用或这系统有问题(小概率),会导致cache堆积不能正常释放,可能会影响到其它或者自身应用时就要考虑是否缓存了
自动释放缓存1
系统会在到了内存临界阈值后,触发kswapd内核进程工作才进行释放,这个阈值的计算方法如下:
- grep low /proc/zoneinfo
-
将以上3列加起来,乘以4KB,就是这个阈值,通过这个方法计算后发现当前服务器的回收阈值只有84MB,这个阀值比较小,没等系统回收缓存就大量堆积了。
-
可以通过设置vm.min_free_kbytes值来提供
$ sudo sysctl -a | grep free_kbytes
vm.min_free_kbytes = 67584
$ sudo sysctl -w vm.min_free_kbytes=836787 ######1GB
- 当low阈值被设置为1GB的时候,当系统free的内存小于1GB时,观察到kswapd进程开始工作(进程状态从Sleeping变为Running),同时dcache开始被系统回收,直到系统free的内存介于low阈值和high阈值之间,停止回收。
自动释放缓存2
我们可以提高slab内存释放的优先级, Linux 提供了 vfs_cache_pressure 这个参数, 默认为100, 设置为高于100的数, 数值越大slab回收优先级越高(root 身份运行):
echo 10000 > /proc/sys/vm/vfs_cache_pressure
vfs_cache_pressure的设置并不会在系统中马上体现出来, dentry 和inode cache会有一个到高峰后突然下降,然后逐渐正常波动的过程. 因此需要运行个24小时再来下效果定论; vfs_cache_pressure 适合于控制directory 和inode 缓存的回收:
手动释放
# root 权限
# To free pagecache:
sync && echo 1 > /proc/sys/vm/drop_caches;
# To free dentries and inodes:
sync && echo 2 > /proc/sys/vm/drop_caches;
# To free pagecache, dentries and inodes:
sync && echo 3 > /proc/sys/vm/drop_caches;
# sudo 权限
# To free pagecache:
sudo sh -c "sync && echo 1 > /proc/sys/vm/drop_caches;";
# To free dentries and inodes:
sudo sh -c "sync && echo 2 > /proc/sys/vm/drop_caches;";
# To free pagecache, dentries and inodes:
sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches;";
无论是手动还是让系统释放,都是不建议的,一般出现这种情况,要排查是哪个应用出现的问题;
查看文件占用
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
其中第一行是打开的文件句柄数量,第二行是进程号,得到进程号后,我们可以通过ps命令得到进程的详细内容。
ps -aef|grep 17401
参考
https://blog.csdn.net/zhongbeida_xue/article/details/78830468
https://yq.aliyun.com/articles/161186
https://colobu.com/2017/03/07/what-is-in-linux-cached/
http://blog.chinaunix.net/uid-27177626-id-4197018.html
http://farll.com/2016/10/high-memory-usage-alarm/