notebook

都内でWEB系エンジニアやってます。

memcachedでトラブル?

障害が起きた時の話

現象としては処理の詰まり

結構何度か起きていたんだけど今までは

  • 分間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

これでとりあえず様子見

もしかしたら他にも原因があるのかも知れないけど現状落ち着いたので恐らく問題無いかなと。。。

ってかバランサー(httpd)の接続数増やした時にmemcachedも増やしておくべきでしたね