[問題の説明] アプリケーション側では、次のエラーが時々表示されます。
パフォーマンス特性: 1. この問題は Connector/NET を使用する場合にのみ発生します。JDBC ドライバーを使用する場合は同様の問題は発生しません。 2. アプリケーション サーバーは複数ありますが、このエラーを報告するのは 1 つだけなので、サーバー側の問題は除外できます。 3. この問題は非常にランダムに発生するため、サーバー/IIS を再起動すると一時的に問題が解決する場合があります。 4. シナリオによっては、アプリケーション サーバーの CPU がそれほど高くなく、このエラーが時々発生することがあります。 クライアントは Windows マシン、ドライバーは MySQL Connector ADO.NET Driver for MySQL (Connector/NET)、使用するバージョンは比較的新しい 6.9.9 です。 詳しい分析と解決策を見てみましょう。 【問題分析】 アプリケーション サーバー側とデータベース側でパケットをキャプチャします。両側でキャプチャされたパケットは一貫しています。ネットワークの問題は除外できます。キャプチャされたパケットと時間ポイントは次のとおりです。
上記のネットワーク パケットの相互作用から判断すると、最初の 3 つのパケットは TCP の 3 ウェイ ハンドシェイク プロトコルです。問題は 6 番目のパケットにあります。データベース サーバーは、データベース接続を終了するために、アプリケーション サーバーに Finish パケットを送信します。データベースは接続がタイムアウトしたことを検出するため、Finish パケットを送信します。 これは、サーバー側の Connect_timeout 変数によって制御されます。その理由は、アプリケーションが 10 秒以上ネットワーク パケットをデータベース サーバーに送信していないためです。ネットワーク パケットの相互作用から判断すると、5 番目と 6 番目のパケット間の時間間隔はちょうど 10 秒です。 上記の正常なデータベース接続と異常なデータベース接続を比較します。 アプリケーション サーバーは、5 番目のパケットをデータベースに送信した後、すぐに次のネットワーク パケットをデータベースに送信する必要があります。このパッケージは主に、アカウント番号、ドライバーのバージョン、オペレーティング システムの情報などをデータベース サーバーに送信します。 [以下は通常のネットワーク パケットのスクリーンショットです]異常なエラーが発生した場合、クライアントはパケットの送信を遅延します。フレーム8で送信されます。この時点で、接続は完了しています。フレーム 9 では、データベースがアプリケーション サーバーにリセット パケットを送信し、接続を完全に終了します。 次に、クライアントがアカウント、ドライバーのバージョン、オペレーティング システムの情報をデータベースに送信するのになぜ時間がかかるのかを詳しく分析してみましょう。この部分のコードは、Connector/NET MySQLAuthenticationPlugin.cs ファイルにあります。 コードのこの部分を変更し、時間追跡を実行して問題をさらに特定します。以下は、時点別に印刷される追跡情報です。 トレースによれば、約30秒の操作遅延があります。 MySQLDefs::OSDetails が返される場合。コードのこの部分は次のとおりです。 [表示名("_os_details")] パブリック文字列 OSDetails { 得る { 文字列 os = 文字列.Empty; 試す { var searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem"); var コレクション = searcher.Get(); foreach (コレクション内の変数 mgtObj) { os = mgtObj.GetPropertyValue("キャプション").ToString(); 壊す; } } 例外 ex をキャッチします { System.Diagnostics.Debug.WriteLine(ex.ToString()); } os を返します。 } } このコードは、WMI クエリを通じてキャプション情報を取得します。つまり、オペレーティングシステムのバージョン情報です。これは WMI 呼び出しなので、多くの依存関係があります。 【問題検証】 このコードを抽出してみましょう。以下に短い再現コードを示します。 静的void Main(文字列[] 引数) { ストップウォッチ watch = new Stopwatch(); (真) { ウォッチを再起動します。 var searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem"); var コレクション = searcher.Get(); foreach (コレクション内の変数 mgtObj) { 文字列 os = mgtObj.GetPropertyValue("キャプション").ToString(); } ウォッチを停止します。 Console.WriteLine(watch.ElapsedMilliseconds); (watch.ElapsedMilliseconds >= 1000)の場合 { Console.WriteLine("--------------"); File.AppendAllText("abc.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") +","+ watch.ElapsedMilliseconds + "\r\n"); } } } 問題のあるアプリケーション サーバーで上記のコードを実行すると、WMI クエリがタイムアウトしたことがわかります。次のポイントは、30 秒以上をキャプチャしたポイントです。
【解決】 WMI クエリが遅くなる理由はいくつか考えられます。たとえば、オペレーティング システムの CPU 使用率が高い場合や、クエリ自体がデッドロックしている場合などです。この問題はさらなる分析が必要です。しかし、コードを見ると、この WMI クエリはオペレーティング システムに関する情報を取得するためだけのものであることがわかります。この情報はキャッシュできます。接続するたびに WMI クエリを実行する必要はありません。 エラーの根本的な原因は、MySQL C# コネクタでオペレーティング システム情報を取得するのに時間がかかりすぎるため、トリガー サーバーへの接続がタイムアウトになることです。この部分(長時間の操作を引き起こす可能性があります)をコメントアウトし、さらに検証を実行します。タイムアウト エラーは発生しません。 パブリック文字列 OSDetails { 得る { dbglog.dolog("MysqlDefs::OSDetails1"); 文字列 os = 文字列.Empty; /*試す { var searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem"); var コレクション = searcher.Get(); foreach (コレクション内の変数 mgtObj) { os = mgtObj.GetPropertyValue("キャプション").ToString(); dbglog.dolog(String.Format("MysqlDefs::OSDetails::foreach{0}", os.ToString())); 壊す; } } catch (例外 ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); }*/ dbglog.dolog("MysqlDefs::OSDetails2"); os を返します。 } } 要約する 上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。 以下もご興味があるかもしれません:
|
<<: nohup /dev/null 2>&1 の使い方の詳しい説明
>>: Centos7.6にTomcat-8.5.39をインストールする方法
個人アカウントのパスワードを変更する一般ユーザーが個人アカウントのパスワードを変更する場合は、他のコ...
目次1. ヘルプコマンド2. ミラーコマンド3. コンテナコマンド1. ヘルプコマンド1. 現在のD...
私はmysql ERROR 1045に遭遇し、この問題に長い時間を費やしました。私はそれを自分で書き...
序文みなさんこんにちは。CSS ウィザードの alphardex です。この記事では、three.j...
方法1:リスピンを使用するには、次の手順に従ってください。 sudo add-apt-reposit...
退屈だったので、ループに関する簡単な演習をいくつかまとめてみました。JS を学び始めたばかりの方に役...
<br />適度に画像を追加すると、Web ページがより美しくなります。 画像タグ &l...
プロジェクト ページの作成中に、子要素が親要素の透明度を継承するという問題に遭遇しました。多くのドキ...
1つ、 G:\MySQL\MySQL Server 5.7\bin> mysqld --ini...
以前、「Web ページにシステムに組み込まれていないフォントを埋め込む」という研究をしたことがありま...
解決策はただ一つ、ソースを変更することです。 github からのソースは基本的にタイムアウトするの...
グリッドレイアウト親要素に追加された属性グリッドテンプレートの列/グリッドテンプレートの行要素の行ま...
問題の説明Windows Server 2012 R2 または Windows Server 201...
入力ボックスが小さい場合、内容を入力した後に、入力内容が拡大されたプロンプト ボックスを表示したいこ...
サーバーB(172.17.166.11)の電源がオンまたは再起動されると、サーバーA(172.17....