问题现象
线上两台 keepalived + lvs
机器,内存都被 slab
占光了,观察是 dentry
所占用的,经过排查,是因为keepalived
的 misc
调用 bash
脚本引起的。即使不是 misc
调用, bash
自己的正常的调用也会引起 slab
内存持续升高(使用 while 命令进行测试)。但是测试环境不是这样。
查找原因
...略过许多排查步骤。
使用 strace
命令跟踪脚本的调用,发现 B
脚本的系统调用特别多,而且此脚本的运行速度明显慢于 A 脚本。
这两个脚本的区别在于一个检测 http 服务,一个检测 https 服务。那么可能就是在 https 这里出的问题。
什么原因呢?于是将 strace
的结果输出到一个文件里,在文件里观察发现最多的就是 access("/etc/pki/nssdb/.273583784_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
。查看此目录是由 nss 这个包产生的
[root@SZ-CORE-LVS-02 keepalived]# rpm -qf /etc/pki/nssdb/
nss-3.28.4-4.el6_9.x86_64
,然后搜索了 /etc/pki/nssdb/.273591295_dOeSnotExist_.db
这个错误,发现了下面的几个链接,
原来这是 nss-softokn 的一个 bug, 有修改源码的方式,但是那样还得重新编译,最简单的方式就是
配置一个环境变量。export NSS_SDB_USE_CACHE=no
,一句话,立竿见影,slab 稳定了。世界安静了。
总结:
centOS6
当使用 curl
命令访问 https
服务的时候就会产生这个情况(因为nss-softokn
这个包的 bug ),调用频繁就会使得 slab 内存持续明显上升。
参考如下:
- https://access.redhat.com/solutions/2968211 : Application is slow sometimes and slab usage is high
- https://bugzilla.mozilla.org/show_bug.cgi?id=956082 : Avoid call to sdb_measureAccess in lib/softoken/sdb.c s_open if NSS_SDB_USE_CACHE is "yes" or "no"
- https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=1044666 : Can curl HTTPS requests make fewer access system calls?
- https://bugzilla.redhat.com/show_bug.cgi?id=1044666 : Bug 1044666 - Can curl HTTPS requests make fewer access system calls?
转载于:https://blog.51cto.com/beyondhf/2086365