■CentOS
■サーバの反応がやけに遅くなった為調査しました。
ApacheのHPの表示が遅い、PostgreSQLの検索に時間が
かかったり落ちたりしていました。
サーバを見に行くと物凄い勢いでディスクにアクセスしています。
■調査
●logwatchには
WARNING: Kernel Errors
Present
[<c0860247>] ? error_code+0x73/0x78
...: 1
Time(s)
※上記が出ておりカーネルログを見たところ「oom_kill_process」がでていました。
確認した所、メモリ不足でプロセスを強制停止してメモリを確保しているとの事。
メモリ不足の為反応が遅くなっていたり検索が強制停止していたようです。
●freeコマンドで確認した所確かにメモリはほとんど使い切っており空きが無い状態でした
total
used free
shared buffers
cached
Mem:
1022064 553740
468324
0 8812
238344
-/+ buffers/cache:
306584 715480
Swap:
4194296
0
4194296
※上記は正常な時の物で使用中のusedは少ないですが当時はusedが多く、空きのFreeが
ほとんど無い状態でした。
●ps
auxで確認した所、Apacheの使用メモリが非常に多くなっていました。
USER
PID %CPU %MEM VSZ RSS
TTY STAT START TIME
COMMAND
apache 1159 0.0 0.6 29248
6728 ? S
17:02 0:00 /usr/sbin/httpd
apache 1160
0.0 0.3 28776 3920 ?
S 17:02 0:00
/usr/sbin/httpd
apache 1161 0.0 0.3
28776 3916 ? S
17:02 0:00 /usr/sbin/httpd
apache 1162
0.0 0.3 28776 3916 ?
S 17:02 0:00
/usr/sbin/httpd
※上記は正常な時の物でメモリを表すVSZ,RSSがそれほど多くありませんが当時は2桁ほど多かったです。
■設定の見直し
原因はメモリ不足でApacheがメモリを使用している事が分かりました。
どうやら設定を見直すと良い様子
●初期設定
# vi /etc/httpd/conf/httpd.conf
<IfModule
prefork.c>
StartServers
8
最初に起動する子プロセスの数
MinSpareServers
5
待機する子プロセスの最小数
MaxSpareServers
20
待機する子プロセスの最大数
ServerLimit
256
最大接続数の制限
MaxClients
256
生成する子プロセスの最大数
MaxRequestsPerChild 4000
それぞれの子プロセスを何回再利用するか
●対応
ps
auxを見直した所、STARTが3〜4日前になっていました。
MaxRequestsPerChildが4000になっているので4000回再利用する為
再利用を繰り返し、メモリが足りなくなったようです。
ここで原因を考えてみました。
サーバで使用しているApacheは主にPHPでPostgreSQLからデータを
検索して表示したりデータをダウンロードしています。
使い方としてはアクセスするのは少人数で一人当たりのメモリ消費
が多い(ダウンロードファイルを作る為多くのメモリが必要)使い方をしています。
この使い方で再利用を4000回する設定の為、プロセスの使用メモリが
かなり大きくなりメモリ不足になったようです。またメモリが足りず
スワップを使用しているためメモリ確保や開放の為ディスクアクセスが
増えてしまったようです。
対策として再利用や扱うプロセス数を減らします。
StartServers
4
MinSpareServers
2
MaxSpareServers
10
ServerLimit
100
MaxClients
100
MaxRequestsPerChild
50
かなり減らしました。正直どの位か分からないのでネットで調べて参考に
しました。50というのはかなり少ないかとも思いましたが1回のメモリ
使用量が多い場合は頻繁にプロセスを作り直してメモリを開放した方が
良さそうです。
結果は成功でサーバが遅くなる事は無くなりました。
どんな使い方をするかで設定は変えないと駄目なようです。
たとえば使う人数が多く、一人当たりの使用するメモリが少ない場合は
今回の設定ではプロセスの作り直しが多くなりすぎてかえって
遅くなると思います。色々と勉強になりました。
トップへ戻る