サーバ負荷の原因を探る
最近になって下書きのまま止まっている投稿記事があったので再度見直しいろいろと調べて修正してアップしました。
2016年9月中旬よりサーバのハングアップが多くなり色々と調べていくうちに少し原因と思われるものが見えてきました。
まず、サーバが(朝方3時とか4時とか)ハングアップしてoom-killerが発動、という流れのなかでその時間帯のアクセスなのかhttpdプロセスが増殖している事態が見受けられました。
まず初めに行ったことは、
crontabにtopコマンドを10分ごとに発行しそれをログファイルに書き込むようにしました。
# crontab -e */10 * * * * /usr/bin/top -b -n 2 -d 10 >> /var/log/toplog
これで細部ハングアップしている状況が確認できます。
下記がTOPコマンドの詳細ログです。
top - 04:49:01 up 20:40, 0 users, load average: 74.81, 71.82, 65.32 Tasks: 178 total, 1 running, 177 sleeping, 0 stopped, 0 zombie Cpu(s): 0.1%us, 0.1%sy, 0.0%ni, 0.0%id, 99.7%wa, 0.0%hi, 0.0%si, 0.1%st Mem: 1019952k total, 969040k used, 50912k free, 4260k buffers Swap: 2097148k total, 1710920k used, 386228k free, 18956k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1590 mysql 20 0 1341m 22m 2612 S 0.2 2.2 32:36.63 mysqld 11342 apache 20 0 302m 37m 3844 D 0.1 3.8 0:00.82 httpd 11338 apache 20 0 302m 31m 3784 D 0.1 3.2 0:00.90 httpd 47 root 20 0 0 0 0 D 0.0 0.0 0:16.78 kswapd0 7740 apache 20 0 303m 12m 2812 D 0.0 1.2 0:34.43 httpd 9286 apache 20 0 299m 11m 3304 D 0.0 1.1 0:10.26 httpd 11183 apache 20 0 282m 9736 3520 D 0.0 1.0 0:01.83 httpd 11232 apache 20 0 303m 9.8m 2924 D 0.0 1.0 0:01.31 httpd 11311 postfix 20 0 81532 1144 912 D 0.0 0.1 0:00.06 pickup 11339 apache 20 0 299m 12m 3756 D 0.0 1.3 0:00.73 httpd 11353 apache 20 0 303m 30m 3820 D 0.0 3.0 0:00.80 httpd 11390 apache 20 0 275m 9408 3044 D 0.0 0.9 0:00.08 httpd 11405 root 20 0 98.6m 800 692 D 0.0 0.1 0:00.01 sadc 11410 root 20 0 15036 1268 920 R 0.0 0.1 0:00.03 top ・ ・
httpdプロセスが50個くらいに増えていました。
httpdプロセスが多くなりswapファイルも食いつくしサーバで処理できなくなってoomkillerでハングアップ状態になるようです。
1行目のload averageも 74.81などととんでもない値になっています。
この時間帯に特に大きなCRONも設定せず夜中の0時~6時の間で分散しているのでCRONではないようです。
色々と毎日の負荷を見ているとhttpdプロセスが30個を越えたあたりでSWAP領域もメモリを消費してハングアップするようです。
ここで 「 apacheの同時接続数(MaxClients)を検証する 」 で説明していますが一個当たりのhttpdプロセスのメモリ使用量は、
約35557.3(35M) です。
そのためhttp.confでそのように変更しなければまたハングアップするので変更しました。
下記の設定以降(2016年10月)上記のような障害は発生しなくなりました。
他のサイトと違い、当サーバは、CPUやメモリが弱小なのでこのような設定になりました。
余裕を持って
serverlimitは、30ではなく28にしました。
もしかしたら、MaxRequestsPerChildは、もう少し大きな値でもいいのかもしれませんが安定しているのでこのまま運用してます。
**********************
参考までに現在のサーバ環境
centos6
メモリ 1 GB
ディスク HDD 100 GB
CPU 2コア
wordpress+apache+mysqlなどなど
基本的なブログサーバです
**********************
KeepAlive Off MaxKeepAliveRequests 50 KeepAliveTimeout 10 <IfModule prefork.c> StartServers 7 MinSpareServers 5 MaxSpareServers 10 ServerLimit 28 MaxClients 28 MaxRequestsPerChild 50 MaxMemFree 1024 </IfModule>
参考にしてみてください。また、ご指摘・質問等ありましたらコメントにてお願いします。
ちなみに半年間なにも障害等発生してません。(2016年8月3日以降起動中です。H29.4.18)
*****************************************************************************