こんにちは、岩本です。
とあるサーバーで、運用開始以後、大きな負荷もないのにメモリ利用率が上昇していく現象が発生しました。
グラフを見る限りメモリがリークしており、運用する側としてはとても嫌な図です。
ps コマンドや top コマンドで調べてみても、Apacheやその他のプロセスでのメモリ使用量は搭載メモリ全体の数%にしかならず、メモリが大量に消費されている原因が不明でした。
こんにちは、岩本です。
とあるサーバーで、運用開始以後、大きな負荷もないのにメモリ利用率が上昇していく現象が発生しました。
グラフを見る限りメモリがリークしており、運用する側としてはとても嫌な図です。
ps コマンドや top コマンドで調べてみても、Apacheやその他のプロセスでのメモリ使用量は搭載メモリ全体の数%にしかならず、メモリが大量に消費されている原因が不明でした。
調査の中で、古いバージョンのNSSライブラリにバグがあり、原因の可能性があることがわかりました。
Curlリクエストを多く実行し(例えばphp: Curlを利用している等)、OSに充分な空きメモリがある場合は、
これらのリクエストはキャッシュとしてOS上に蓄積されるようです。
「Storage for Amazon S3 アドオン」では、サムネイルの取得などにcurlを多用しているため、
この挙動により、OS上にキャッシュが蓄積されているのではと推測されます。
このバグは、NSS(3.16.0)よりも新しいバージョンでは修正されていますが、
OS上でNSS_SDB_USE_CACHEを有効にする必要があります。
では、実際に対策を実施していきます。
# キャッシュの解放
$ echo 2 >> /proc/sys/vm/drop_caches
# NSS Softokenのバージョンが古い場合、バージョン確認、アップデート
$ yum list nss-softokn # 3.16.0 またはそれ以上であることを確認
$ sudo yum update -y nss-softokn # アップデート
# NSS_SDB_USE_CACHEを有効化
$ echo "export NSS_SDB_USE_CACHE=YES" >> /etc/sysconfig/httpd
# Apacheの再起動
$ sudo service httpd restart
上記の対応を実施したことで、メモリの開放が行われました。
実施後、約3日経過しましたが以前のようにメモリが上昇していく傾向もなく、現象が収束したと考えられます。
Storage for Amazon S3 アドオンを利用する際は、NSSのバージョンとNSSのキャッシュの有効化に注意ください。