古い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つのオプションをmy.cnf
に追加することで修正できる場合があります。
skip-Host-cache
skip-name-resolve
次に、MySQLサーバーを再起動します。
または、Host_CACHE_SIZE
を増やすことができます。
これを行う前に、名前解決を無効にするとどうなるかを確認するために、マニュアルを確認してください。
接続が遅いのは、割り当てられている各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つの選択肢があります