問題現象
線上兩臺 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?