web-dev-qa-db-ja.com

TIME_WAIT接続を避ける

Netstatコマンドを使用すると、次のように表示されます。

tcp 0 0 localhost:18056 localhost:mysql TIME_WAIT
tcp 0 0 localhost:16683 localhost:mysql TIME_WAIT
tcp 0 0 localhost:16701 localhost:mysql TIME_WAIT
tcp 0 0 localhost:16888 localhost:mysql TIME_WAIT
tcp 0 0 localhost:16832 localhost:mysql TIME_WAIT
tcp 0 0 localhost:17725 localhost:mysql TIME_WAIT
tcp 0 0 localhost:17682 localhost:mysql TIME_WAIT
tcp 0 0 localhost:17414 localhost:mysql TIME_WAIT
tcp 0 0 localhost:17606 localhost:mysql TIME_WAIT
tcp 0 0 localhost:17737 localhost:mysql TIME_WAIT
tcp 0 0 localhost:16632 localhost:mysql TIME_WAIT
tcp 0 0 localhost:16825 localhost:mysql TIME_WAIT
tcp 0 0 localhost:17807 localhost:mysql TIME_WAIT
tcp 0 0 localhost:17715 localhost:mysql TIME_WAIT
tcp 0 0 localhost:17304 localhost:mysql TIME_WAIT
tcp 0 0 localhost:17217 localhost:mysql TIME_WAIT
tcp 0 0 localhost:18098 localhost:mysql TIME_WAIT
tcp 0 0 localhost:17624 localhost:mysql TIME_WAIT
tcp 0 0 localhost:17734 localhost:mysql TIME_WAIT

Time_wait接続は約2000です。

これを避けるために、net.ipv4.tcp_fin_timeout = 30を/etc/sysctl.confに追加しました

しかし、それでも私はいくつかの問題を抱えています、それを避ける方法は?

6
Himanshu Matta

TIME_WAITには理由があり、その理由はTCPパケットが遅延して順序が狂って到着する可能性があることです。それを混乱させると、成功したはずの接続が余分に壊れてしまいます。 ここでのすべての優れた説明

あなたの問題は、アプリ内でMySQL接続を再利用するのではなく、SQLクエリを実行するたびに新しい接続を作成することです。これには、TCP接続をセットアップするだけでなく、それを介して認証資格情報を渡すことも含まれます。これはすべてのクエリ(または少なくともすべてのフロントエンドWebリクエスト)で発生し、無駄であり、時間がかかる。

使用している言語で永続的なMySQL接続プーリングを有効にする方法がわからない場合は、StackOverflowを使用するとよいでしょう。

18
Ladadadada