■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回のメモリ
  使用量が多い場合は頻繁にプロセスを作り直してメモリを開放した方が
  良さそうです。

  結果は成功でサーバが遅くなる事は無くなりました。
  どんな使い方をするかで設定は変えないと駄目なようです。
  たとえば使う人数が多く、一人当たりの使用するメモリが少ない場合は
  今回の設定ではプロセスの作り直しが多くなりすぎてかえって
  遅くなると思います。色々と勉強になりました。

トップへ戻る