先日、とあるサイトのリプレース(サーバ更新)を行ったところ、サーバが高負荷(元から負荷は高かったが)になって、レスポンスが悪くテンパりまくった時の話。人によって環境や動作は全然違うと思うので個人の備忘。
環境(更新後サーバ情報のみ)
- 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のinnodbがbufferpool_size内に収まっているかどうか
mysql> show engine innodb status\G
- apacheレスポンスタイム確認
# 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 }'
コメント