Colfusion -> mysql 通信で謎のハングスレッドが発生する原因
-
26-09-2019 - |
質問
Coldfusion のさらに興味深い「機能」の 1 つは、外部リクエストの処理方法です。その基本的な要点は、クエリが外部ソースに対して行われるとき、 <cfquery>
または、外部リクエストを特定のドライバーに渡し、その時点で CF 自体がそのリクエストを一時停止できないような、その他の外部リクエスト。タイムアウトがクエリまたは cfsetting で指定されていても、すべての外部リクエストに対して完全に無視されます。
http://www.coldfusionmuse.com/index.cfm/2009/6/9/killing.threads
それを念頭に置いて、私たちが遭遇した問題は、CF サーバーと mySQL サーバーの間の通信が何らかの理由で時々失敗し、ハングしたスレッドが残るということです。以下のような特徴があります。
- ハングしたスレッドは CF に表示され、FusionReactor から強制終了することはできません。
- がある いいえ mySQL にはハングしたスレッドが表示されますが、アクティブな実行中のクエリはありません (通常のスリープだけです)。
- データベースは他の呼び出しに応答しており、正しく動作しているようです。
- DB またはユーザーの最大接続数に達していません。
私にとって唯一可能性の高い候補は、何らかの理由で CF がリクエストを作成し、mySQL がそのリクエストに応答しているが、その応答が CF によって無視され、mySQL からの応答を待ってスレッドを開いたままにし続けているということです。これで、データベースには問題の兆候が見られないのに、CF がスレッドを開いたままにして謎の答えを待っている理由が説明できます。
いつもの これらのハングしたスレッドは、それ以外では動作しているスクリプト (ニュース記事へのコメントの投稿など) 上にランダムに表示されます。そのスクリプトに対して 1 つのスレッドがハングしている間でも、そのスクリプトに対する他のリクエストは通過します。これは、必ずしもスクリプトに問題があるのではなく、スクリプトの実行時に直面した状況に問題があることを意味します。
mysql で生成された max_connections エラーではないことを確認するためにテストを実行しました...ユーザーを作成し、最大接続数を 1 に設定し、その接続を sleep(1000) クエリに結び付けて、別のクエリを実行しました。残念ながら、ハングしたスレッドは生成されずに正しくエラーになりました。
したがって、現時点では何が問題になっているのかまったくわかりません。他に接続制限やタイムアウトがあり、サーバー間の通信に問題が発生する可能性はありますか?
解決 3
簡単に言うと、Coldfusion の CF8 画像処理が原因だったと思います。それはただバグがあっただけで、CF9 ではそのような問題は二度と見られません。
他のヒント
検討し始める必要があるものの 1 つは、2 つのサーバー間のハードウェアです。ルーター、ブリッジ、または NIC が時折パケットをドロップしている可能性があります。これにより、CF サーバーがそこに留まり、完全な応答を無期限に待機している間、mySQL ボックスはタスクが完了したと認識し、ハングしたスレッドが作成される可能性があります。
3com では、パケット損失のテストについて詳しく説明しています。 http://support.3com.com/infodeli/tools/netmgt/tncsunix/product/091500/c11ploss.htm#22128
MS SQL サーバーでも同様の問題が発生しました。そこでは、根本原因は、何らかの理由でサーバーがシャットダウンしていると認識し、スレッドがハングするという既知の問題でした (サーバーが明らかにシャットダウンしていないにもかかわらず)。
この問題を排除することはできませんでしたが、プールされた DB 接続をオフにし、接続のリフレッシュ レートを調整することで問題を軽減することができました。(このラベルは正しかったと思います。新しい職場では管理者へのアクセス権がありません。) どちらも管理者の接続プロパティにあります。
ちょっとしたメモ:問題は完全に CF にあるわけではありません。どうやら、この問題はすべての Java アプリに影響を及ぼします。だからといって、私がこのことでどれだけイライラするかは決して軽減されません。