web-dev-qa-db-ja.com

MySQL接続を開くのが非常に遅い場合がある

古いMySQLサーバー(v5.0.45)とJavaアプリケーションで非常に奇妙な問題があります。

時々、データベースから接続を取得するのに7秒、15秒、30秒など(ほとんどが15秒です)、またはタイムアウトすることがあります。これは時々起こります。それが起こるとき、私はパターンを見ません。残りの時間は2〜3ミリ秒で作成されます。

データベースはLinux CentOS 6.4で実行されています。接続中に問題が発生するサーバーはLinux CentOS 7上にあります。最新のMySQLコネクタ(現在はv5.1.38)を使用していますJava 8、接続プールあり) Tomcatまたはc3p0)、または接続プールなし(接続の開閉のみ)、サーバーの負荷、クライアント数の少なさ、同時接続数の少なさ、最大100接続など、同じ結果です。

複数のサーバー上の複数のアプリケーションがこのデータベースに接続します。そのうちの2つでのみこれが発生し、残りは問題がなく、ネットワークは正常に見え、他のマシンは同じネットワーク内にあります。

質問

  • この問題をデバッグして原因を見つけるにはどうすればよいですか?
  • 誰かが以前にこの動作を見たことがありますか?

編集:私たちは問題を実際のサーバーに適用しました。ハードウェアの問題なのか、OS /カーネル/ドライバーの問題なのかわからない。まだ調査中です。

2
bdem

ホスト名を解決すると、以前に会ったような問題が発生する可能性があります。

これらの2つのオプションをmy.cnfに追加することで修正できる場合があります。

skip-Host-cache
skip-name-resolve

次に、MySQLサーバーを再起動します。

または、Host_CACHE_SIZEを増やすことができます。

これを行う前に、名前解決を無効にするとどうなるかを確認するために、マニュアルを確認してください。

2
walter

接続が遅いのは、割り当てられている各DB接続が消費するメモリ量が原因である可能性があります。

2012年4月24日に、私は投稿に回答しました DB接続のオープンとクローズはどのくらいのコストがかかりますか? 。その投稿では、1つのDBセッションに接続されている多くのバッファーがあることを説明しました。

JavaアプリケーションがDB接続を厳密に閉じ、新しい接続を開かずに開く場合は、その古い接続に接続されている複数のデータバッファーと通信パケットの割り当てを解除することを検討してください。

それを悪意のあるTIME_WAIT状態に入るDB接続と組み合わせると(私の投稿 Too Many Connections を参照)、リソースが解放される前に、OSでかなり長く接続が維持されます(たとえmysqldがすでに接続を閉じている場合)。

Sort_buffer_size、read_buffer_size、join_buffer_sizeのサイズを減らす必要があるかもしれません。

1つのステートメントで複数の結合を実行するクエリがある場合、その接続には複数の結合バッファーが含まれます(私の投稿 「NOT IN」の高速な代替案 を参照)。その場合、2つの選択肢があります

  • Join_buffer_sizeを増やして、結合レベル全体がメモリに収まるようにします(DBサーバーにさらにRAMが必要))
  • 2つ以上のテーブルを2つのテーブル間の個々の結合に結合する複数の結合クエリを分解します
2
RolandoMySQLDBA