Linux 内存使用过高

后台监控程序监控服务器内存使用过高;

排查

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内核进程工作才进行释放,这个阈值的计算方法如下:

  1. grep low /proc/zoneinfo

  1. 将以上3列加起来,乘以4KB,就是这个阈值,通过这个方法计算后发现当前服务器的回收阈值只有84MB,这个阀值比较小,没等系统回收缓存就大量堆积了。

  2. 可以通过设置vm.min_free_kbytes值来提供

$ sudo sysctl -a | grep free_kbytes       
vm.min_free_kbytes = 67584
$ sudo sysctl -w vm.min_free_kbytes=836787  ######1GB
  1. 当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/

转载于:https://my.oschina.net/yale8848/blog/2988650

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值