sql >> データベース >  >> RDS >> Mysql

mysql TIME_WAIT;接続の問題が多すぎます

    クライアントが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」のようなローカルにインストールされたプロキシを使用することです。これにより、新規接続と閉じた接続の数が減ります。



    1. 日時vs日時Mysql

    2. MSSQLServerでのDBAの一般的な間違い

    3. パスワードプロンプトなしでmysqldumpを実行する方法は?

    4. 日ごとにグループ化し、行のない日を表示しますか?