問題タブ [perfview]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
989 参照

performance - PerfView で高価なメソッドを確認するにはどうすればよいですか

簡単なコンソール アプリを作成し、Run Command -> PerfMonTest.exe を介して PerfView から実行しました。

ログファイルを取得し、アプリのプロセスを確認します。予想どおり高価です (99% CPU ) が、高価なメソッドにドリルダウンしたい場合、それらは高価なメソッドのリストに表示されません。

それらを見えるようにするためにできることはありますか?

プロセスを選択したときのビューは次のとおりです。リストには CallExpensive と CallCheap が含まれていると思います。

ここに画像の説明を入力

メインメソッドを選択しても、呼び出されたメソッドをさらに掘り下げる機会がありません

ここに画像の説明を入力

アプリは次のとおりです。

0 投票する
1 に答える
313 参照

asp.net - ASP.Net Web アプリのメモリリーク調査

Asp.Net 4.0 で実行されている Web サイトでパフォーマンスの問題を調査するには、アドバイスが必要です。

ウェブサイトの背景:

この Web サイトは、e コマース フレームワークに基づいて構築された Web ショップであり、多くのプロジェクトで安定性と信頼性が証明されています。Webshop はかなり長い間 (1 年) 安定して動作していましたが、顧客が ERP (MS Dynamics NAV) を新しいバージョンにアップグレードした後、パフォーマンスの問題がすぐに発生し始めました。

問題自体:

アプリケーション プールは正常に起動しますが、その結果、使用可能なメモリをほぼすべて消費します。したがって、明らかにこれはメモリリークの状況です。

より具体的な例: 昨夜、アプリケーション プールが再起動され、使用メモリは約 500 メガバイトでした。約 16 ~ 18 時間で、プールはすでに約 2 ギガバイトで実行されていました。ほぼすべてのメモリが消費され、アプリケーションが非常に遅くなるまで、プールはさらに拡大し続けます。

アプリケーション プールのメモリ スナップショットは、プールの再起動後と 2 ギグでもPerfViewで取得されました。
スナップショットの差分を以下に添付します。 ヒープ スナップショットが 500Mb と 2Gb の間で異なる

ご覧のとおり、一番上の行はmscrolib!LocalDataStoreHolderです。それについての詳細を開こうとすると、次のような参照元ビューが表示されます LocalDataStoreHolder の参照元ビュー 。そのため、何がメモリを消費しているのか、現時点ではわかりません。
参考になる場合は、RefTree のスクリーンショットを以下に示します。ここでは、強力なハンドルが 92.2% を占めていることがわかります。 RefTree ビュー

質問は、より詳細にドリルダウンする方法について、ヒントやアイデアを提供できる人はいますか? メモリリークの原因を突き止める方法は?

前もって感謝します

編集:RedGate ANTSメモリプロファイルも試しました。これは、ここのさまざまなスレッドで多くのアドバイスを受けています。これは、いくつかのメモリ スナップショットを撮った後の概要図です。最新のスナップショットは 20 時間後に作成され、app-pool は約 3.7 Gb の RAM を消費しています。ご覧のとおり、左側の巨大な赤いチャンクは「管理対象外」で、サイズは 2.5 Gb です。ANTS が言うように、これは CLR 自体、グラフィック データ、または P/Invoke または COM+ を介してアクセスされる管理されていないデータによって使用されます。それでも、より詳細な情報を取得する方法はわかりません。 ここに画像の説明を入力

0 投票する
5 に答える
2112 参照

.net-4.5 - EventSource のサブクラスにインターフェイスを実装すると、実行時に例外がスローされるのはなぜですか?

.NET 4.5 に含まれていたEventSourceクラスを介して、.NET アプリケーションでEvent Tracing for Windows (ETW)を使用しようとしています。私は次のようにサブクラス化し、 (モック目的で)インターフェイスを実装しようとしています:EventSourceMyEventSourceIMyEventSource

PerfViewを実行してこのコードを実行すると、IndexOutOfRangeExceptionへの呼び出しで が発生しWriteEventます。コードを変更してインターフェイスを削除すると...

...その後、すべてが正常に機能します。

両方のケースでテストに使用したコードは次のとおりです。

EventSource単純にインターフェイスを実装しているのに、サブクラスが壊れるのはなぜですか?

関連記事はこちら。

0 投票する
1 に答える
1313 参照

.net - PerfView にカスタム .Net 4.5 EventSource ETW プロバイダーからのイベントがない

ASP.NET WebApi アプリケーションで EventSource (WebApiEventSource) を作成しました (ITraceWriter 実装として):

EventSource のメソッドが実行時にエラーなしで呼び出されることを確認しました。

次に、PerfView を実行し、そのログで、プロバイダー (EventSource) を確認できることを確認しました。

解析仕様 *WebApi 有効化プロバイダー:*WebApi レベル:クリティカル キーワード:0x0 オプション:なし 値: Guid:fc7bbb67-1b01-557b-5e0e-c1c4e40b6a24

次に、フィルター「*WebApi」を使用して「collect」を実行し、アプリで何らかのアクションを実行して停止します。

しかし、etl ファイルには私のプロバイダーからのイベントはありません! セクション「イベント」には、プロバイダーの名前すら含まれていません。

私は何を取りこぼしたか?

更新: 理由が見つかりました。以下の回答を参照してください。

0 投票する
0 に答える
4716 参照

asp.net-mvc - IIS ワーカー プロセスが継続的にメモリ使用量を増加させる

16 GB RAM、IIS 8.5、および .Net 4.5.2 を搭載したマシンで Web サイトを実行しています。

Web サイトをリサイクルした後、w3wp プロセス メモリは 1 日で 9 GB に増加しました。

(マシン全体のビューですが、Web サイトのワーカー プロセスのメモリ使用量のみが増加します) マシン全体のビューですが、Web サイトのワーカー プロセスのメモリ使用量のみが増加します

PerfView を使用してワーカー プロセスへのヒープ スナップショットを取得すると、ほとんどのメモリが MemoryCache によって保持されていることがわかります

スナップショット後の最初のビュー

MemoryCache の詳細に移動すると、3 つの名前付きキャッシュが表示されます。そのうちの 1 つはデフォルトのもので、何も配置しません。もう 1 つは timeless と呼ばれ、リサイクルまで存続する少量のデータを配置します。最大のもの (_cache という名前) は、html 出力を配置し、70K ~ 80K のアイテムに増加し、キャッシュ時間は約 10 ~ 30 分です。

メモリーキャッシュの詳細

_cache アイテムを右クリックして [メモリ] > [オブジェクトの表示] を開くと、次のようなリストが表示されます。

キャッシュアイテム一覧

キャッシュ アイテムとそのサイズのリストを取得して合計しようとすると、アイテムの合計サイズが 100 MB 未満であることがわかります。

継続的に増加しているものを確認する方法はありますか?

0 投票する
1 に答える
829 参照

c# - ETW EventSource で名前階層を定義する方法は?

私のプロジェクトでは、次のように System.Diagnostics.Tracing.EventSource を使用します。

"Additional Providers" フィールドで "*kafka4net" を定義して、動的プロバイダー機能で PerfView を使用します。これにより、プロバイダーがその名前で解決されます。うまく動作します。1 つの例外を除いて。私が見ているイベントは kafka4net/Connecting のものですが、kafka4net/ConnectionTrace/Connecting を見たいと思っています。

一般的に言えば、イベントを製品/サブシステム/イベントにしたいと考えています。「Microsoft-Windows-DotNETRuntime/GC/Start」など、一部のシステム コンポーネントがこの構造を持っていることがわかります。

[EventSource(Name = "kafka4net-Connection")] を配置しようとしましたが、「kafka4net-Connection、kafka4net-Fetcher」などのすべてのサブシステムを列挙する必要があるため、PerfView で動的イベントとして使用することはできません。 . そして、これはいけません。

EventSource には Name プロパティがあり、最上位の「製品」にすることができ、関数名はイベント名階層の最下位レベルとして使用されます。イベント名階層の中間要素「サブシステム」に固執するにはどうすればよいですか?

0 投票する
1 に答える
2647 参照

c# - PerfView: データベース呼び出しを含むアプリのパフォーマンスの分析

現在、(C#) アプリのパフォーマンス分析のために PerfView を使用しています。ただし、通常、これらのアプリは多くのデータベース呼び出しを使用します。そこで、次のような質問を自問しました。 - リポジトリでどれくらいの時間が費やされているか - (SQL クエリが返されるのを待つのにどれくらいの時間が費やされていますか?) -> これが PerfView で発見できるかどうかさえわかりません

しかし、私のトレースからは、有用な結果はほとんど得られません。「Any Stacks」ビューでは、(リポジトリでグループ化を使用すると)リポジトリで1.5秒が費やされることがわかります(呼び出し全体は約45秒です)。リポジトリはデータベースを大量に呼び出すため、これは実際には真実ではないことを私は知っています。

CPU はこの期間に何もすることがないため、SQL クエリが完了するのを待っているときに CPU メトリックがキャプチャされないため、私の時間にはリポジトリのデータ変換時間などが含まれているだけですか?

助けてくれてありがとう!

編集:

私が見逃したのは、スレッド時間オプションをオンにして、ブロックされたコードの時間を取得することです(これは、データベース呼び出し中に起こっていると思います)。これですべてのスタックを取得しました。興味のないものを除外するだけです。しかし、私はどこにも行かないようです。

「スレッド時間」を使用するときに特に興味深いのは、BLOCKED_TIME です。しかし、それで時代はずれていると思います。スクリーンショットを見ると、CPU_TIME が 28,384 であることがわかります。これはミリ秒 (afaik) ですが、BLOCKED_TIME は 2,314,732 であり、ミリ秒にはなりません。したがって、CPU_TIME のパーセンテージは 1.2% と非常に低くなりますが、70 秒のうち 28 秒は依然として多いです。したがって、包括的パーセンテージの時間は、ここではリンゴとオレンジを比較しています。誰か説明できますか?

パフォーマンス ビュー