Storage for Amazon S3 Addon を使うときは、 NSS Softoken のバージョンとキャッシュに注意しよう。

#

こんにちは、岩本です。

とあるサーバーで、運用開始以後、大きな負荷もないのにメモリ利用率が上昇していく現象が発生しました。

グラフを見る限りメモリがリークしており、運用する側としてはとても嫌な図です。

 

ps コマンドや top コマンドで調べてみても、Apacheやその他のプロセスでのメモリ使用量は搭載メモリ全体の数%にしかならず、メモリが大量に消費されている原因が不明でした。

 

$ free -m
total used free shared buffers cached
Mem: 7986 7657 329 33 99 312
-/+ buffers/cache: 7246 740
Swap: 0 0 0

$ top
top - 12:40:32 up 36 days, 12:26, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 96 total, 1 running, 95 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8178636k total, 7832896k used, 345740k free, 101484k buffers
Swap: 0k total, 0k used, 0k free, 319688k cached
 
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17350 apache 20 0 658m 43m 27m S 0.0 0.6 0:00.07 httpd
7983 root 20 0 547m 36m 28m S 0.0 0.5 0:26.69 httpd
17351 apache 20 0 656m 35m 21m S 0.0 0.5 0:00.05 httpd
17357 apache 20 0 655m 35m 21m S 0.0 0.4 0:00.03 httpd
17364 apache 20 0 655m 35m 21m S 0.0 0.4 0:00.03 httpd
17367 apache 20 0 655m 35m 21m S 0.0 0.4 0:00.03 httpd


$ ps aux --sort -rss
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
apache 17350 0.0 0.5 673948 45024 ? S 12:35 0:00 /usr/sbin/httpd
root 7983 0.0 0.4 560160 37628 ? Ss Jul12 0:26 /usr/sbin/httpd
apache 17351 0.0 0.4 671812 36808 ? S 12:35 0:00 /usr/sbin/httpd
apache 17357 0.0 0.4 671548 36244 ? S 12:35 0:00 /usr/sbin/httpd
apache 17364 0.0 0.4 671548 36244 ? S 12:38 0:00 /usr/sbin/httpd
apache 17367 0.0 0.4 671548 36244 ? S 12:38 0:00 /usr/sbin/httpd

調査の中で、古いバージョンの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のキャッシュの有効化に注意ください。

参考:プロセスのメモリ使用量が少ないのにメモリ使用量が増加していた時に調査、対応したこと


コメント欄を読み込み中