Linux apache mod_cache 高負荷

linux

先日、とあるサイトのリプレース(サーバ更新)を行ったところ、サーバが高負荷(元から負荷は高かったが)になって、レスポンスが悪くテンパりまくった時の話。人によって環境や動作は全然違うと思うので個人の備忘。

環境(更新後サーバ情報のみ)

  • centOS7 * 2台
    • CPU:32core
    • Memory:64G
    • HDD(SAS)
  • MW
    • apache2.4
    • mysql5.6
    • php7.1
  • DB冗長
    • drbd
    • pacemaker
    • corosync
  • サイト説明
    • サイト本体のコンテンツは持っておらず、画像だけが呼び出されるようなサーバ。画像はDBに保管されていてphpで呼び出される。生成された画像はmod_cacheでローカルDISKの中にキャッシュされ、期限切れになるまでDBアクセスはなくなる。

状況

  • LoadAverage
    • 500-1000を推移(おかしくね?と思いつつも。。。旧サーバもこんなもんで動いてた)
  • Memory
    • DB稼働系でswap大量発生
  • CPU
    • idleは70-80%程度
    • iowaitが結構20%ぐらい常時いてる感じ
  • DISK I/O
    • キャッシュ保管先においてreadが100 IOPS、writeが1000 IOPS
  • その他
    • DBが稼働していないサーバ側でもMemory以外の負荷が非常に高い

結論

DB参照で生成される画像ファイルのキャッシュ書き込みが著しくサーバレスポンスを低下させていた。apacheのmod_cache設定は下記のような感じ。

<IfModule mod_cache.c>
   <IfModule mod_cache_disk.c>
      CacheRoot /var/cache/apache
      CacheEnable disk /hoge/fuga1.php
      CacheEnable disk /hoge/fuga2.php
      CacheIgnoreCacheControl On
      CacheIgnoreNoLastMod    On
      CacheDefaultExpire      600
      CacheMaxExpire          600
   </IfModule>
</IfModule>

apacheの設定を見直すところはありそうな気がするけど、急ぎの対応だったのでDB負荷に問題無いことを確認しながら、キャッシュ設定を無くした。

負荷の変化

※図は、mackerelで可視化したもの

  • LoadAverage
    • 劇的に下がった
  • cpu
    • iowaitが減り全体的に軽くなった
  • Memory
    • 少し減ったのはapacheの再起動による解放
    • DBでガッツリ取ってるのでその分の変化は無し
    • swapは徐々に解放されていってるので、変化としては見にくい
  • DISK IOPS(※見にくかったので該当のもののみ表示)
    • 劇的に下がった
    • 緑色がwrite、黄色がread
  • traffic
    • キャッシュで返す処理がなくなり、DBへのアクセスが増えたので増加

その他、調査時の備忘

mysql> show engine innodb status\G
# curl -H "Host:hoge.com" https://10.0.0.1/hoge/fuga1.php?test.jpg  -s -o /dev/null -w  "%{time_starttransfer}\n"
  • swap確認
# sar -W 1
# sar -S
  • mysqlのプロセスリスト
# while :; do date; "SHOW FULL PROCESSLIST;" | mysql -h db -u root --password=PassW0rd ; sleep 20; done
  • apacheレスポンス1秒以上経過抽出
    • $nは出力したいものを選択(ログの出し方によって変わる)
    • $NFがレスポンスタイムの部分
# tail -f /var/log/httpd/access.log | awk '{ if ($NF>1000000) print $NF,$1,$4,$5,$6,$7,$9,$NF }'

コメント