Maxscaleとアプリケーションサーバが同居したサーバで負荷テストを行ったところ、どうも途中でDBとの通信が失敗したりする部分があった。
で、なんでなんだろと調べていく際にssコマンドを実行したところ…
[root@test-server01 ~]# ss -nap | grep ':3306' | wc -l
24299
…えっΣ(゚д゚ )
3306って、確かにMaxscaleのポートだけど…
どうも、すべてTIME-WAIT状態でローカルのTCPポート(CentOS7のデフォルトのローカルポート範囲が「61000-32768=28232」)を使い潰していたようだ。通信内容はほぼすべて「127.0.0.1:ソケットポート ↔ 127.0.0.1:3306」というもの。これはあかん…。
これを対処するには、以下の内容を「/etc/sysctl.conf」に追記してやると良いだろう。
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 1
ファイルに追記後、「sysctl -p」で設定が有効になる。
ちなみに、「net.ipv4.tcp_tw_recycle = 1」は相手からの通信受付時に、TIME-WAIT状態のソケットを高速に再利用するためのカーネル機能の有効化、「net.ipv4.tcp_fin_timeout = 10」はTIME-WAITのタイムアウトまでの秒数を設定している。「net.ipv4.tcp_tw_recycle」については、外部からの通信時に問題が発生するのであまりいい方法とはいえない(問題発生時の動作については、こちらが参考になりそう)のだが、「net.ipv4.tcp_tw_reuse(自分からの通信時にソケットを使い回す)」を有効化にしても、残念ながらローカルポートの食いつぶしは解消できなかった。
基本は、あまりTIME-WAITが発生しないようにタイムアウトまでの時間を少なくし、更にアプリケーションからDBへのセッションがバンバン飛ばないように見直しをするのが良いのだろうか。
とりあえず、しばらくはこれで様子見かなぁ…