このサーバは接続を受け入れきれずに、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

