申し訳ありませんが、あなたにトラブルをもたらすために、この失敗は、ご了承ください。
アラウンド10時54分今朝は、私たちは、アプリケーションログのクエリタイムアウトエラーで表示され、データベースのCPUが突然90%以上に急増したサービス(SQL Serverの2016のStandard EditionのRDSアリクラウドインスタンス)、大規模なデータベースを使用します。
Microsoft.Data.SqlClient.SqlException(0x80131904):実行タイムアウトになりました。タイムアウト期間は、操作が完了する前に、またはサーバが応答しない経過しました。 ---> System.ComponentModel.Win32Exception(258):不明なエラー258
私たちは、アラーム通知を受信し、スイッチ、通常のデータベースCPUバックを完了するために、メインaliyunのRDSスタンバイスイッチングの11時06分、11時08分に開始、問題を確認したとき。しかし、鍵がドッキングウィンドウの群れは、データベースが正常に戻った後、ブログサイトの展開がドッキングウィンドウ群れクラスタノードの異常事態を持って、要求の50倍間違った部分がクラスタからこの異常なノードを表示され、11の後に新しいノードを開始する時期は常に悪いです:15は正常に戻りました。
CloudDBAアリクラウドRDSコンソールによってほぼ100%のCPUのSQL文の間に実行の非常に大きな数を発見しました。
SELECT TOP @__ P_1 [ B ]。[ のTagName ] AS [ 名]、[ B ]。[ タグID ] AS [ 同上]、[ B ]。[ UseCount ]、[ B ]。【のblogid ] FROM [ blog_Tag ] [ B ] WHERE [ B ]。【のblogid ] = @__ blogId_0 と @__ blogId_0 IS NOT NULL と [ B ]。[ UseCount ] > ? ORDER BY [ B ]。【UseCount ] DESC
EFコア3.0以上のSQL文が太字れ、生成された IS NOT NULLは EFコア3.0で悪名高い悪名高いバグではありません-追加の生成SQL文を生成しますが NULLではない クエリ。
誰が考えただろう(でも、マイクロソフト自身が期待していなかった)が、この一見無害な余計な致命的なリスクは-いくつかのケースでは、データベース全体のサーバーのCPUが100%(またはほぼ100%)を引き続き行います。スタートは、この問題が発生した場合、我々は期待していなかったので、またアリ雲(非難する誤ったボーエンリンクを、元の犯人の発見は過剰EFコア生成された後、我々はアリクラウドデータベースの専門家で直面する問題)を解析します「NULLではない」、それはいくつかのケースでは、SQL Serverのキャッシュのパフォーマンスの結果は、実施計画(非常にCPUを消費し)、その後、フォローアップのお問い合わせは、この実施計画を取っている極めて低いだろう、CPUが高くなります。消費巨大なデータベースCPUは、対応するクエリで得つつが正常に完了することができないので、memcachedのにクエリの結果をキャッシュすることができないときにこのエラー実行プランは、デュアルマス破壊を有し、よりので、この照会実行プランのため、なだれ効果が生じます。唯一の解決策は、間違った実行計画のキャッシュを削除するスイッチオーバーまたは単に実施計画シンプルで、粗メソッドのキャッシュをクリアし、サーバーを再起動することです。
我々はこの問題が発生し始める前に、すでにのGitHubにされているフィードバックこの質問:
うん、これはできるだけ早く修正する必要があります。私達はちょうど用途3.0とは、単純なクエリは、私たちのSQL AzureのCPU使用率を爆破したため、すぐに2.2に戻す必要があったことを、コードを展開します。50%〜100%の下から行って、我々はロールバックされるまでそこに居ました。
しかし、Microsoftは、私たちが実際にMicrosoftの問題は、我々のフィードバックのMicrosoft .NETチームへの問題、マイクロソフトの注目を得るために、この時間はすぐに修復されたされた不当な扱いを受けたアリ雲を知った後、再度実行してくださいするのに十分な引き起こさなかったが、 .NETのコアでリリースされた、我々は非本番環境でテスト3.0のプレビュー版は、 NOT NULLであるプレビュー版で、プラス.NETコア3.1最終版は、今年の年末までにリリースされるよう、我々は生産を持っていないので、実際に修正修理環境を更新し、問題がDapperの持つ複雑なSQL文の最後の出現箇所のみではなく、ストアドプロシージャを呼び出します。その後、アリクラウドデータベースの専門家が分析のための私達のデータベースでも通常のデータベースCPUバリを促進するために関連付けられている(時には高い揮発性を実行する) IS NOT NULL 関連します。
これは、この障害の背景で、我々は、このプロセスがピットされている.NETのコア3.1のバグフィックスの正式版を待って、そして最後の違いは、この問題は非常に単純なSQL文で、一つだけ「であるということですNOT NULL」、我々は破壊のピットを見ることができます。
ピットは十分な有人.NETのコアの年代記で、別の私たちはアリクラウド.NETコア・ピットについて間違っていることも覚えてみましょうすると、実際に処分して逃したのSqlClientで、.NETのコアの正式版である、見る雲道路の計算-アリ氏は述べています:アリクラウドRDSコアからマイクロソフトへの真実のために万人を超えるデータベース接続、.NETを。