web-dev-qa-db-ja.com

MySQLのwait_timeout構成パラメーターを減らす理由

質問

MySQLと通信するためにApache Tomcatの接続プールを使用するアプリケーションに取り組んでいます。なぜあなたはより小さなものを使いたいのかと思っていました wait_timeout デフォルトの28,800秒よりも?待機タイムアウトを減らすことには多くの欠点がありますが、利点は何ですか?

背景

パラメータ wait_timeout と定義されている

サーバーが非対話型接続を閉じる前に、その接続のアクティビティを待機する秒数。

問題

Wait_timeoutを小さくしすぎると、MySQLは、私のWebアプリケーションが使用している接続プールでまだ有効な接続を強制終了します。私の状況では、いつでもアプリケーションを現在使用している唯一の人なので、テストしていないときは当然、db接続はアイドル状態になります。 MySQLのwait_timeoutを非常に大きなものに拡張するだけでこの問題を解決できるため、2週間デスクから離れていても、プールがデッド接続を返さないようにすることができます。

質問

  • なぜ誰もがこれまでよりも短いwait_timeを望みますか?
  • 接続を保存するオーバーヘッドはそれほど悪いですか?
  • 接続プールは接続の作成のオーバーヘッドを軽減することを理解していますが、アイドル状態の接続をメモリに保持することはそのような問題ですか?
3
Usman Mutawakil

あなたはwait_timeoutをうまく拡張する必要があります

MySQLのwait_timeoutの最大値に注意してください 5.5.15.55.6

  • Linux:31536000秒(365日、1年)
  • Windows:2147483秒(2 ^ 31ミリ秒、24日20時間31分23秒)

これらの最大値はmysqldには存在しなかったため、それらを処理できませんでした。

接続プールは、代わりにオーバーヘッドを節約するだけです。つまり、新しいDB接続用のメモリを破棄して再割り当てします。これにより、DBサーバーのOSがメモリをより多く交換するために、より多くのスワッピングを行う可能性があります。

私はこれについて1年以上前に書きました: DB接続の開閉はどれくらいコストがかかりますか?

PHPおよびDB接続用のApacheオブジェクトはまだインスタンス化されているので、DB接続が早期に警告なしで終了することを決定しているため、wait_timeoutを下げると、Apacheが混乱する可能性があります。その場合、 netstatをスキャンしてTIME_WAITポート3306またはMySQLが使用している任意のポートを介した接続。

そのようなものが存在し、Apacheが新しい接続を開くのを妨げている場合は、自分でTIME_WAITを強制終了する必要があります。私のFeb 01, 2012 ServerFault post MySQLがwait_timeoutの値を下げて開いている接続の数を減らす 方法。

3
RolandoMySQLDBA

接続プーリングのないWebアプリがあるとします。

次に、Webアプリが接続をリークするとします(たとえば、Javaでfinallyブロックを使用しないことにより、接続を適切に閉じません)。待ち時間の長いタイムアウト(デフォルトは8時間)を使用すると、接続の漏れははるかに問題になります。アプリはすぐに接続を使い果たします(mysqlの「Too many connections」エラー)。

典型的なWebアプリでは、1つのhttpリクエストのスコープ内で接続が開閉されます。したがって、接続は数秒間以上必要ありません。待機タイムアウトを短くすると、コードを修正しなくても、「接続が多すぎる」という問題を解消できます。

そうは言っても、正しい解決策は、コードを修正してリークのある接続を排除することです。

1
Dave Ford

テストをまったく行わないことは、非常に高速なアプローチであり、必ずしも最もスケーラブルであるとは限りません。参照しているドキュメントは、接続の信頼性よりも速度を優先するアプリの場合でも、アイドル接続の不定期のテストに推奨されていることに注意してください:「かなり長いidleConnectionTestPeriodを設定し、チェックアウトとチェックインをまったくテストしないことは、優れた高性能アプローチ。"

プールが非常に大きい場合を除いて、かなり長い時間は約300秒程度です。 (接続テストはミリ秒のオーダーで行われるため、特に効率的なpreferredTestQueryを設定する場合、特に5分ごとに50のオーバーヘッドは非常に低くなります(これを試してくださいSELECT 1 MySqlで。)

c3p0は、接続タイムアウトを処理するためのたくさんのツールを提供します-接続テストスキームは、タイムアウトした接続をパージします。テストしない場合は、構成パラメーターmaxIdleTimeまたはmaxConnectionAgeを使用できます。

0
Steve Waldman