障害が起きた時の話
現象としては処理の詰まり
結構何度か起きていたんだけど今までは
- 分間2000アクセスくらい発生(MySQLの同一レコードへのupdateが発生)
- 同一レコードへのロックが発生してロック待ち
- バックエンドの同時接続数がオーバーしてアラート
っていう流れでした。
同一レコードへのupdateは性質上変えるのが難しいという事で大掛かりな修正で対応する予定だったのですが
先日同じ現象が起きた時は分間500位しかなかったので別の原因があるのではという流れに
同時位にmemcachedのアラートも飛んでいたので調べてみる
$ ps aux | grep memcached 498 25486 0.4 0.2 340052 10644 ? Ssl 18:59 0:00 memcached -d -p 11211 -u memcached -m 3072 -c 2048 -P /var/run/memcached/memcached.pid
グラフで接続数を見ると2000超えてる!
アプリケーション側でのmemcacheへの接続timeout秒数はデフォルトで25秒のようなのでこのmemcacheが詰っていた可能性が高いかも
バックエンドのアラートが上がったのとcacheへのsetエラーが出てきたのもほぼ同時なのでほぼ間違いないかと判断
$ cat /etc/sysconfig/memcached PORT="11211" #ポート USER="memcached" #ユーザー MAXCONN="4096" #同時接続上限数 CACHESIZE="3072" #キャッシュサイズ OPTIONS="" #オプション
MAXCONNを書き換えて4096にしました。
$ /etc/init.d/memcached restart $ ps aux | grep memcached 498 25486 0.4 0.2 340052 10644 ? Ssl 18:59 0:00 memcached -d -p 11211 -u memcached -m 3072 -c 4096 -P /var/run/memcached/memcached.pid
$ ps aux | grep memcached 25486
ファイルディスクリプタも変更されているのを確認
cat /proc/25486/limits Max open files 4096 4096 files
これでとりあえず様子見
もしかしたら他にも原因があるのかも知れないけど現状落ち着いたので恐らく問題無いかなと。。。