4

Win32APIを使用してC++で実装されたWindowsサーバーアプリケーションがあります。これは、多くのシリアルおよびTCP/IP通信を実行します。実行すると、CPU使用率は100%に達するまで徐々に増加します。タスクマネージャーは、CPU使用率のほとんど(> 75%)が「システム」プロセスによるものであることを示しています。サーバープロセスを強制終了すると、CPU使用率は通常に戻ります。

問題が何であるかを正確に診断するための「簡単な」方法はありますか?

I / O接続が開いていて、閉じられていないのではないかと思われるため、OSはこれらの要求の処理にますます多くの時間を費やしていますが、問題を解決する前に、それが当てはまるかどうかを確認したいと思います。


更新:をいじっxperfてみたところ、システムプロセスがその時間の半分以上をに費やしていることがわかりましたntoskrnl.exe!KxWaitForSpinLockAndAcquire。これについては何も知りませんが、関数の名前から、デッドロック/競合の問題がある可能性があります。

システムが多く使用している他の関数には、、、、、およびが含まNETIO.SYS!FilterMatchEnumれます。NETIO.SYS!MatchConditionOverlapNETIO.SYS!IsFilterVisibleMpNWMon.sys!NetFlowUpendByCompletionHandle

4

5 に答える 5

3

まだ行っていない場合は、 sysinternalsツールを確認することをお勧めします。

私がとても気に入っているツールの1つは、システムで開いているすべてのファイルを表示するハンドルツールです。

シナリオに直接適用できると思われるもう1つの方法は、 ProcDumpです。これを使用すると、特定のプロセスがCPU使用率のx%を超えたときにプロセス情報をダンプできます。

于 2010-07-27T15:10:29.897 に答える
2

Process Explorerを使用しますが、システムプロセスではなく独自のプロセスを開きます。システムプロセスは、おそらくあなたの要求に応答しているだけです。あなたはそれのためのコードを持っていないので、あなたはそれが何をしているのかを知るのに苦労するでしょう

あなた自身のプロセスのために:

  • ハンドル数などを表示する[パフォーマンス]タブを開きます。
  • 接続を表示する[tcp-ip]タブを開きます。
  • イベントやファイルなどを表示しているプロセスについては、ProcessExplorerの下半分のペインも確認してください。

うまくいけば、それらの1つからどのリソースが過剰に使用されているかを確認できます。

Portmonは、アクティビティが期待どおりであるかどうかを確認する価値があるかもしれません。

于 2010-07-29T22:36:44.840 に答える
1

sysinternalのProcessMonitorとPortmonを使用することをお勧めします。これにより、TCP接続のステータスとシリアルポートのアクティビティが表示されます。

それとCPU使用率の間に相関関係が見られる場合は、良いリードがあります。

于 2010-07-29T22:55:24.897 に答える
1

ユーザーダンプ。この状況にあるときに、プロセスのユーザーダンプを取得します。次に、ダンプをwinDbgにロードし、それが何をしているのかを確認します。本当に便利なコマンドの1つは!runawayです。これにより、どのスレッドが最も多くのCPUを使用しているかがわかります。次に、それらのスレッドを見て、それらが何をしているかを確認します。

于 2010-08-01T17:49:50.897 に答える
0

あなたのハンドル数は何ですか-それが増加している場合、それは何かが閉じられていないことを示します。

于 2010-07-29T20:23:46.093 に答える