大量のトラフィック(約17リクエスト/秒)のあるアプリケーションがあります。このアプリは.Net Core 2.0(最近アップグレードされたばかり)で構築されたREST APIです。.Net Core 2.0 Web API - デストラクタで問題が発生したためサーバーがクラッシュする
アプリはAzureでホストされており、サーバが非常にゆっくり(1週間以上)すべてのハンドラとリソースを消費し、最終的にクラッシュするというメモリリークのような問題が発生しています。
私はMSサポートに相談して問題を絞りました。ここでは彼らの最後のメールには、次のとおりです。
はこの後、彼らは基本的にアズールのせいではなかったと私は は、だから私は代わりにここに来ています...およそ$ 500のコスト「コード」サポートチケットを開くために必要なことを言いました。 :)「私たちは、ラージオブジェクト( 85000バイトを超える文字列や配列)の高い量は、GCヒープの断片化とアプリケーションでより高いメモリ 使用状況につながることができます見ている私たちが調査しました。どのよう デストラクタを管理し、私はあなたに次のドキュメントを提供することができます?なぜファイナライズ/デストラクタの例は、.NETのコアでは動作しません
- をWhy does the Finalize/Destructor example not work in .NET Core? (ない、Microsoftの公式文書が、それは、参照として使用することができます)
ASP.NETケーススタディ:バッドPERF、高いメモリ使用量と高い
GCでのCPU - ViewStateのことで死:
https://blogs.msdn.microsoft.com/tess/2006/11/24/asp-net-case-study-bad-perf-high-memory-usage-and-high-cpu-in-gc-death-by-viewstate/.NETコアの デストラクタに関連するその他のドキュメントを探していきます。
私は15年以上にわたって.Net開発者でしたが、これは初めて.Net Coreを使用したときでした。私はこの偉大な記事を見つけ、API(https://chsakell.com/2016/06/23/rest-apis-using-asp-net-core-and-entity-framework-core/)のバックボーンとして使用しました。
これを他の.Netコアの例と比較したとき、私は「ベストプラクティス」に従っていると合理的に確信していますが、間違っている可能性があります。
私の懸念は、.Net Core(MSがちょっと参考にしたそれらの記事)に根本的な問題がありますが、答えを見つける方法がわかりません。私はこのためにコードを書き直す必要はありませんが、時にはサーバーを再起動する以外に、自分のオプションが何であるかわかりません。
思考?
根本的な問題は、あまりにも多くを依存するため、ファイナライザではなく、あなたのプログラムには本当にないようですラージオブジェクトヒープ(メモリの断片化と高価な圧縮プロセスが発生する)最初に答えなければならないのは、その割り当てがどこから来ているのかということです。 –
私はKuduからダンプの作成/ダウンロードを開始します:https://blogs.msdn.microsoft.com/jpsanders/2017/02/02/how-to-get-a-full-memory-dump-in- azure-app-services /その後、ビジュアルスタジオと "Debug Managed Memory"で開く –
あなたのコードはわかりません。マネージドメモリを必要とするサービス用のIDisposableパターンを正しく実装していますか? – Tseng