年中アイス

いろいろつらつら

Linuxでメモリ使用量が増え続けた

AmazonLinux 2017.03にnginx乗せて稼働させてたら、なぜかメモリ使用量が、1日ちょっとで2GB後半にさしかかりました。cacheではなくusedを徐々に消費してたので、これは何かリークしてる疑い。

プロセス等を見てもメモリを使っているものもいないし、疑いのあるプロセスをrestartしても改善しませんでした。

何だろうなーと調べてみたらすぐ出てきました。特にAmazonLinuxは関係なし。

dev.classmethod.jp

上記ページと同じく、NSSの問題で、curlがdentryというディレクトリ階層構造の管理をしているキャッシュを多く消費してしまうと。curlhttpsの監視が動いており、それが5分に1回なので、徐々にリークした様子。1時間に100MB程度ずつ増加していたようです。

回避策は、NSS_SDB_USE_CACHE=YESという環境変数を指定すること。とりあえず監視スクリプトexport NSS_SDB_USE_CACHE=YESを追加したら、増加が止まりました。

溜まったキャッシュは、以下のようにして解放されました。

echo 2 > /proc/sys/vm/drop_caches

>>でも>でもどっち動きますが多分>の方が適切?2という値は対象のキャッシュによって異なります。

クリアする対象キャッシュ
1 ページキャッシュ
2 dentry,inode
3 ページキャッシュ,dentry,inode

まとめ

じわじわ増えてく系のメモリリークは怖いです。調べたらたくさん出てきたので、割とメジャーな要因みたいですね。

Slabは知らなかったので調べてみたら、ざっくり言うとカーネル側のキャッシュとのこと。細かいメモリ周りはやっぱよくわかってない感。

参考