さくらの VPS でスワップが大量発生した原因と対処

この記事は KainokiKaede Advent Calendar 2014 12日目の記事です(大嘘)

さくらの VPS のメモリ 1GB のプランを利用しているのだが、かなり重くなったりしたので原因を調べてみた。

Munin で見てみるとスワップがGB単位で発生していて、どうやらこれが重くなる原因と考えられた。

どのプロセスがスワップしているのかを調べるため、 スワップの量の順にソートする Perl スクリプト を書いてくださった方がいらっしゃったので利用させていただく。

$ perl swaplist.pl | head -40
--------------------+----------+---------------+
       Swap size classified by processes       |
--------------------+----------+---------------+
    Process Name    |   PID    |   Swap Size   |
--------------------+----------+---------------+
clamd               |       997 |       273028KB |
ruby                |     23761 |       103788KB |
httpd               |     23749 |        43288KB |
httpd               |      7753 |        30132KB |
httpd               |      5002 |        25880KB |
ruby                |      4732 |        23536KB |
mysqld              |      1135 |        22408KB |
httpd               |     23753 |        13296KB |
httpd               |     16240 |        12824KB |
httpd               |      7756 |         9744KB |
httpd               |     16239 |         9724KB |
httpd               |      7754 |         7380KB |
httpd               |      7758 |         5648KB |
httpd               |     23750 |         5580KB |
httpd               |      7755 |         5124KB |
munin-node          |      1332 |         5056KB |
httpd               |     16238 |         4872KB |
httpd               |     23747 |         4824KB |
httpd               |      7759 |         4800KB |
httpd               |      7757 |         4664KB |
httpd               |      1246 |         4660KB |
httpd               |     23748 |         4260KB |
httpd               |     23751 |         4012KB |
httpd               |     23752 |         3320KB |
httpd               |     21920 |         3196KB |
httpd               |     23746 |         3060KB |
python              |      1707 |         2584KB |
rsyslogd            |       920 |         1096KB |
tmux                |      5325 |         1000KB |
qmgr                |      1242 |          876KB |
master              |      1233 |          808KB |
PassengerHelper     |     23731 |          744KB |
udevd               |       378 |          716KB |
udevd               |       662 |          712KB |
sshd                |       958 |          616KB |

これを見ると問題点がわりと明確になる。

  1. ClamAV がメモリを食いつぶしている。
  2. httpd が大量に生成されてメモリを食いつぶしている。

1.

対症療法(笑):$ sudo service clamd restart

参考URL

スキャン対象のディレクトリを制限してやるのが良いようだ。具体的には /proc/ /sys/ を除外するとか。

$ sudoedit /etc/clamd.conf
- #ExcludePath ^/proc/
- #ExcludePath ^/sys/
+ ExcludePath ^/boot/
+ ExcludePath ^/proc/
+ ExcludePath ^/sys/
+ ExcludePath ^/var/
+ ExcludePath ^/etc/
$ sudo service clamd restart
Starting Clam AntiVirus Daemon: LibClamAV Warning: Detected duplicate databases /var/lib/clamav/main.cvd and /var/lib/clamav/main.cld, please manually remove one of them

$ sudo rm /var/lib/clamav/main.cld
$ sudo service clamd restart

2.

参考URL

$ sudoedit /etc/httpd/conf/httpd.conf
<IfModule prefork.c>
- StartServers       8
- MinSpareServers    5
- MaxSpareServers   20
- ServerLimit      256
- MaxClients       256
- MaxRequestsPerChild  4000
+ StartServers        4
+ MinSpareServers     2
+ MaxSpareServers    10
+ ServerLimit       128
+ MaxClients        128
+ MaxRequestsPerChild 30
# MaxMemFree 1024
</IfModule>
$ sudo service httpd restart