もくじ
環境
- 2CPU
- 8GB
- LAMP
- サイト数:20程度
Apacheのメモリが足りなくてOOMさんにぶった切られていた・・・!
# tail -n 10000 /var/log/messages ・・・ Apr 2 10:05:12 ip-172-32-3-252 kernel: [231010.642871] [15704] 48 15704 126988 5603 191 4 0 0 httpd Apr 2 10:05:12 ip-172-32-3-252 kernel: [231010.660303] [15705] 48 15705 126988 5603 191 4 0 0 httpd ●OOM killer発動 Apr 2 10:05:12 ip-172-32-3-252 kernel: [231010.671708] Out of memory: Kill process 2502 (httpd) score 14 or sacrifice child Apr 2 10:05:12 ip-172-32-3-252 kernel: [231010.680947] Killed process 2502 (httpd) total-vm:713292kB, anon-rss:115548kB, file-rss:0kB, shmem-rss:576kB Apr 2 10:05:12 ip-172-32-3-252 kernel: [231010.706890] oom_reaper: reaped process 2502 (httpd), now anon-rss:0kB, file-rss:0kB, shmem-rss:576kB ●リブートの発生 Apr 2 11:14:24 ip-172-32-3-252 kernel: imklog 5.8.10, log source = /proc/kmsg started. Apr 2 11:14:24 ip-172-32-3-252 rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="2951" x-info="http://www.rsyslog.com"] start
最大のApacheプロセスを確認する
# ps aux | grep [h]ttpd | grep [a]pache | awk 'BEGIN{x=0}{x+=$6}END{ print x/NR }' 110752
だいたい110MB利用している、多い気がするな。1プロセス60~70MBぐらいが普通かな。
チューニング
LAMP環境のサーバで2CPU8GBだから
- システム:1GB
- MySQL:2GB
- Apache:5GB
だいたいで計算する
5000/110 = 45.454 ≒ 45プロセス
/etc/httpd/httpd.conf
<IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule> ↓変更 <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 45 MaxClients 45 MaxRequestsPerChild 300 </IfModule>
- ServerLinmit, MaxClients
45クライアントでエラーを発生させる
少なすぎかもしれないがサーバ全体がダウンするよりマシ - MaxRequestsPerChild
子プロセスが処理できる最大のリクエスト数、
プロセス数が多すぎてダウンしたので300に減らしてすぐにプロセスを開放させる。
本当にしたいこと
- ApacheからNginxに変更
- サーバで動くサイト数が多すぎる
→減らす - サーバスペックアップ(スケールアップ)
- サーバスケールアウト
バランサとか。
料金とかお客さんの要望とかあるのでこれらは難しいです、お客様の要望第一なので仕様がない。
とにかくサイト数、WEBアプリが多いし、ドキュメントがないので迂闊に構成変更が出来ない・・・。サーバを増やして少しずつこのサーバに載っているサイト数を減らす方向が良いと思う。