クライアントがMySQLサーバーに接続する場合、通常はローカルポートを開きます(例:
)。 localhost:12345 -> mysqlserver:3306
クライアントが接続を閉じると、クライアントはTIME_WAITを取得します。 TCPルーティングが原因で、パケットが一時ポートに遅れて到着する場合があります。 TIME_WAITの接続は、これらのパケットを破棄するだけです。 TIME_WAITがないと、ローカルポートが別の接続に再利用され、以前の接続からパケットを受信する可能性があります。
リクエストごとにmysql-connectionを開くWeb上の頻繁なアプリケーションでは、大量のTIME_WAIT接続が予想されます。何も問題はありません。
ローカルポートの範囲が低すぎると、問題が発生する可能性があります。そのため、発信接続を開くことができなくなります。通常のタイムアウトは60秒に設定されています。そのため、低範囲で1秒あたり400を超えるリクエストで問題が発生する可能性があります。
確認:
TIME_WAITの量を確認するには、次のコマンドを使用できます。
$ cat /proc/net/sockstat
sockets: used 341
TCP: inuse 12 orphan 0 tw 33365 alloc 23 mem 16
UDP: inuse 9 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
「tw」の後の値(この場合は33365)は、TIME_WAITの量を示します。
解決策:
a。 TIME_WAITチューニング(LinuxベースのOSの例):
TIME_WAITのタイムアウトを減らします:
# small values are ok, if your mysql server is in the same local network
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
ローカルポートのポート範囲を拡大します:
# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
設定/proc/sys/net/ipv4/tcp_tw_recycle
および/proc/sys/net/ipv4/tcp_tw_reuse
面白いかもしれません。 (ただし、これらの設定で奇妙な副作用が発生したため、回避することをお勧めします。この回答
)
b。永続的な接続
一部のプログラミング言語とライブラリは、永続的な接続をサポートしています。別の解決策は、「ProxySQL」のようなローカルにインストールされたプロキシを使用することです。これにより、新規接続と閉じた接続の数が減ります。