centos6 系统slab内存一直线性增长

一、问题描述

原本一直运行比较稳定的阿里云服务器,突然有一天内存告警,大概使用95%左右。因当时事情比较多,清理系统内存缓存后,此事就搁置了。但前几天又收到内存告警短信,抽了点时间处理相关问题。以下将记录问题从定位到解决的整个过程。

二、问题追踪

1).查看各进程占用的内存情况

使用top后按内存排序,发现各进程使用率不高。最高的0.5%,平均0.2%左右。
进程使用内存汇总
从上图可以看出,进程使用的内存不到10%.

2). 查看内存使用分布情况

a). 运行cat /proc/meminfo命令查看内存使用分布情况。

在这里插入图片描述

从上图我们可以看出系统总内存16G,而slab占用大概16G的内存。其中slab内存大部分可以回收释放,不可释放的只有48M。

b). 运行slabtop查看slab分布。

在这里插入图片描述
从上图可以看出dentry几乎占了14G的空间。

c).查看slab dentry状态。

运行 cat /proc/sys/fs/dentry-state命令
在这里插入图片描述
第一项: 系统当前申请的dentry数目
第二项: 系统当前未使用的dentry数目
第三项 :当内存不足时,系统延迟回收的时间(秒)
可以看出,有大量未使用的dentry,猜测可能有比较频繁的文件相关操作。

d).strace追踪

带着上面的疑问,加上内存监控信息,逐个分析内存增长前最近有调整过的业务进程。经过逐一分析,逐个脚本定位追踪,发现可能与curl https有关。

与一台正常调用的服务器执行curl https命令对比,结果如下:

strace -f -e trace=open,unlink,close curl "https://www.baidu.com" 

正常服务器调用日志:
在这里插入图片描述
异常服务器调用日志:
在这里插入图片描述
从上面两张图,我们可以看出第二台服务器的curl https时,系统会创建临时文件,而且这些文件又很快的被删除。我们都知道,linux为了提高IO读写性能,会将文件的inode等信息缓存在内存。虽然系统删除文件,但这些文件的inode dentry缓存信息还保留在内存,从而造成内存使用越来越多。

三、解决办法

1). 通过脚本修改内核参数,定时清理空间。但这种办法治根不治本,笔者不太推荐。

sync
echo 2 > /proc/sys/vm/drop_caches

2). 升级到更高版本的nss版本。

yum upgrade nss
yum upgrade curl
curl -V


笔者升级到nss3.44版本后发现问题仍未解决。

3). 目前很多网站的https采用openssl密码库,可以使用openssl替代nss。网上有很多相关查阅资料,在此不再赘述。

四、总结

从排查->定位->解决问题,整个过程虽然花了蛮长时间,但总体来说,收获还是挺大的。在以后遇到类似系统方面的"疑难杂症"时,解决思路有一定的借鉴之处。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值