2014年12月31日水曜日

ログローテーション時Apacheが突然死することがある。

バーチャルホストをたくさん切っているサーバで、年に数回Apacheが突然死することがあって、
プロセスがたくさん立ち上がっているわけでも、SWAP食いつぶしてOOMKillerさんに殺された形跡もないのに不思議だなぁ。と思っていたのですが、また落ちたので少々まじめに調べてみました。

まずは基本のerrorlogの調査。すると、なんか定期的にSIGHUP信号を受けてApacheが再起動しているようです。
お?自動再起動Cronなんて仕掛けたっけ?と調べるも該当なし。
しかも、ある時間帯に集中して、数分おきに再起動しています。
Zabbixによると、その後Apacheがお亡くなりになったようです。
バックアップの時間帯と近かったので、メモリ不足を疑いましたが、OOMKillerさんの形跡はなし。
メモリ使用率やディスクの枯渇もない様子。


ローテーションか!と/var/log/cronを調べたところ、cron.dailyが走っていました。
原因としては、

  1. cron.dailyがキックされる。
  2. ログローテーションが起動。
  3. logrotate.d配下にある各バーチャルホストたちのログローテーションが動き出す。
  4. ログローテーションのスクリプトにはApacheをreloadするように書かれている。
  5. バーチャルホストたちのログがローテーションするまで頻繁にreloadされる。(多分非同期?)
  6. Apache数分おきにreloadされコケる。

あたりと推測されます。
対策としては、

  • reloadをやめてgrasefulにする。ただし、ログ書き出しのタイミングが不明なのでsleepを入れる。参考 ただ、grasefulにした場合のsleep時間は結構問題かも。参考
  • そもそもローテーション時Apacheを再起動しない。ただし、ログファイルコピー中のログは保存されない。参考
  • ログローテーションをしない(ぉ

かなぁ。
皆さん色々苦労されているようで。

0 件のコメント:

コメントを投稿