ソーシャルゲームのインフラ担当をしていた時の失敗談です。
なぜか接続が混みあう
・運用開始後は特に問題なく動いていたが、イベント開始した次の日にユーザから接続できないというお問い合わせが大量にくる。
↓
・イベントだったので、サーバ台数を増やしていたこともありサーバの負荷には問題がない。
↓
・アプリ開発者にインフラは問題ないと伝える。
↓
・memcachedサーバがアクセス数に比べて負荷が低いのがおかしいと言われる。
↓
・memcachedの何かがおかしい。調べることにする
下記が調べた結果になります。
memcachedの設定値
memcached -d -p 11211 -m 2048 -c 10000
同時接続数:10000
メモリ割当:2GB
memcachedの設定は問題なさそう
やっぱりインフラに問題ないと言おうかと思ったが、アクセス数とmemcachedサーバの負荷が比例していないのがおかしい。もしかしたら、memcachedにうまく接続できていないのじゃないかと思い、接続関係を調べなおす。
原因
ググっていたら同じような現象がおきたブログを発見。
どうも「net.core.somaxconn」の設定が原因の可能性があるとわかり、調べてみる
# sysctl net.core.somaxconn
net.core.somaxconn = 128
この設定だと128に切り詰められてしまい、負荷が高いサーバでは接続要求を取りこぼしてしまうことがあるとのこと
対応
/etc/sysctl.conf
net.core.somaxconn = 10000
memcachedを再起動
設定変更後は、接続できないというお問い合わせはこなくなりました。
net.core.somaxconnは大量コネクションを必要とするサーバ設定の定番チューニングみたいです。
net.core.somaxconnの影響
net.core.somaxconnはOSレベルの接続キューの最大長として、TCPソケットで待ち受けるサービス全般に影響を与えます。具体的には、アプリケーションレベルで指定した接続キューの最大長 > net.core.somaxconnの場合、接続キューの大きさは暗黙にnet.core.somaxconnに切り詰められている可能性があります。
参考
http://tetsuyai.hatenablog.com/entry/20111220/1324466655
http://dsas.blog.klab.org/archives/51977201.html