現象は以下。
・Socket.ioでクライアントと接続している
・同時接続数が700ぐらいになると新規に接続出来なくなる
・しばらくすると既存の接続も切れ始める
最初はファイルディスクリプタの上限設定を疑ったが、上限を変更しても改善しなかった。
原因はip_conntrack_maxの設定値だった。
2013-06-05 - 日々精進で紹介したように、iptablesを使ってポートフォワーディングしていたんだけど、やりとりするパケットの数が多すぎるとポートフォワーディングのキューから溢れてパケットが捨てられてしまうらしい。
そのキューの大きさを決めるのがip_conntrack_max。これを大きくすると問題が解決した。
以下を/etc/sysctl.confに書いておくとよい。
net.ipv4.netfilter.ip_conntrack_max = 32768 net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_tw_reuse = 0 net.ipv4.tcp_orphan_retries = 1 net.ipv4.tcp_fin_timeout = 25 net.ipv4.tcp_max_orphans = 8192 net.ipv4.ip_local_port_range = 32768 61000
サーバは難しいなぁ。。
参考:apache 2.2 - What limits the maximum number of connections on a Linux server? - Server Fault