net.core.somaxconnについて調べてみた

概要

memcachedtcp_backlogのデフォルト値は1024で、stats settingsにも1024と表示されているのですが、

stats settings
...
STAT tcp_backlog 1024
...
END

↓ net.core.somaxconnがデフォルト値のままだと128に切り詰められてしまい、

# cat /proc/sys/net/core/somaxconn 
128

負荷が高いサーバーでは接続要求を取りこぼしてしまうことがあるそうです。

このnet.core.somaxconn、MemcacheやMySQLなど、高負荷時に多くの接続要求を受け付けるサーバーではチューニングが必要なカーネルパラメータのようです。いったいどういう値なのか、調べてみました。



net.core.somaxconnとは

TCPソケットはlisten()関数の第二引数 backlog に指定した数の、完全に確率された接続要求*1を待ち受けることができるキューを作成します。キューがいっぱいになった状態で新たに接続要求を受け取ると、サーバーはECONNREFUSEDを返します。下位層のプロトコルが再送信をサポートしていれば、ECONNREFUSEDは無視され、リトライが成功するかもしれません。

net.core.somaxconnはTCPソケットが受け付けた接続要求を格納する、キューの最大長です。backlog > net.core.somaxconnのとき、キューの大きさは暗黙にnet.core.somaxconnに切り詰められます。



net.core.somaxconnの影響

net.core.somaxconnはOSレベルの接続キューの最大長として、TCPソケットで待ち受けるサービス全般に影響を与えます。具体的には、アプリケーションレベルで指定した接続キューの最大長 > net.core.somaxconnの場合、接続キューの大きさは暗黙にnet.core.somaxconnに切り詰められている可能性があります。

最大数には、1から2147483647までを指定できます。
本ディレクティブの設定値は、MaxClientsディレクティブで設定したクライアントの同時接続数よりも多くの接続要求があった場合に、Linuxシステム内にキューイングされる数として有効となります。
本ディレクティブの設定値がLinuxシステムに設定されている待機中TCPコネクションの最大値(/proc/sys/net/core/somaxconn)よりも大きい場合は、待機中TCPコネクションの最大値が有効となります。
Linuxシステムに設定されている待機中TCPコネクションの最大値を確認する場合は、sysctlコマンドを使用して以下のように実行してください。
/sbin/sysctl -n net.core.somaxconn

http://software.fujitsu.com/jp/manual/manualfiles/M080179/B1WN9491/05Z202/ihsaa/ihs00123.htm



net.core.somaxconnの確認

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



net.core.somaxconnの変更

sysctlコマンドを使う

sysctlコマンドを使うと、簡単に書き換えることができます。

# sysctl -w net.core.somaxconn=1024

しかし、これだけではリブートすると元に戻ってしまいます。元に戻らないようにするにはsysctl.confを書き換えます。


sysctl.confを書き換える

リブートしても元に戻らないように、sysctl.confを書き換えます。

FILE: /etc/sysctl.conf

--- /etc/sysctl.conf	2011-12-21 16:02:57.000000000 +0900
+++ /etc/sysctl.conf	2011-12-21 16:06:14.000000000 +0900
@@ -39,3 +39,6 @@ xen.independent_wallclock = 1
 
 # xen ntp
 xen.independent_wallclock = 1
+
+# Increase number of incoming connections backlog
+net.core.somaxconn = 1024

sysctlコマンドを使ってsysctl.confをリロードできます。

# sysctl -p



*1:以前は不完全な接続要求でしたが、Linux 2.2で完全な接続要求に変更されました。不完全な接続要求を待ち受ける数はtcp_max_syn_backlogを用いて設定します。