2011年 7月 9日 はてなブックマーク -

このサーバは接続を受け入れきれずに、SYNを取りこぼしてしまっているみたいです。memcachedのbacklogはデフォルト値を使用しているので1024になっているはずです。

$ memcached -h | grep backlog
-b            Set the backlog queue limit (default 1024)

これって、本当に1024で足りなくなっているのでしょうか。単純にバックログを増やせば解決する問題かなと期待しつつも、どうも釈然としなかったので 、man listen をじっくりと読み返していたところ、

backlog 引き数が /proc/sys/net/core/somaxconn の値よりも大きければ、backlog の値は暗黙のうちにこの値に切り詰められる。このファイルのデフォルト 値 は128 である。バージョン 2.4.5 以前のカーネルでは、この上限値はコード埋め込みの固定値 SOMAXCONN であり、その値は 128 であった。

いやーな予感がしたので、おもむろにコマンドを叩いてみると・・・・・

# sysctl net.core.somaxconn
net.core.somaxconn = 128

あちゃあ!
実際はこれ、128になっていたわけですね!

# sysctl -w net.core.somaxconn=1024

としてmemcachedを再起動したところ、大幅に性能が改善されました。

DSAS開発者の部屋:高負荷サイトのボトルネックを見つけるには

TCP接続のリトライが起きているなら変更しておきたい所ですね。
上記設定だとマシンを再起動したら消えてしまう気がします。以下の様に実行すればOKです。
echo “net.core.somaxconn = 1024” » /etc/sysctl.conf
sysctl -p


10ヶ月前 | | 2011年 7月 9日 | このエントリーを含むはてなブックマーク