2017-05-01 17 views
1

.netC#で書かれたアプリケーションは、100%のCPUを使用しています。アプリケーションは非常に大きく、大量のコードを含んでいるので、プロジェクトコード全体を提供することは不可能です。私は、スレッドが25%のCPU(1コア)を使用するアプリケーションのスレッドのスタックを取得しようとした、多くの場合、私はこれを得た:このコールスタックを持つスレッドは1つのコア の消費なぜ Hight CPU使用率.netアプリケーション

ntoskrnl.exe!KeSynchronizeExecution+0x2246 
ntoskrnl.exe!KeWaitForMultipleObjects+0x135e 
ntoskrnl.exe!KeWaitForMultipleObjects+0xdd9 
ntoskrnl.exe!KeWaitForMutexObject+0x373 
ntoskrnl.exe!KeStallWhileFrozen+0x1977 
ntoskrnl.exe!_misaligned_access+0x13f9 
ntoskrnl.exe!KeWaitForMultipleObjects+0x152f 
ntoskrnl.exe!KeWaitForMultipleObjects+0xdd9 
ntoskrnl.exe!KeWaitForMutexObject+0x373 
ntoskrnl.exe!NtWaitForSingleObject+0xb2 
ntoskrnl.exe!setjmpex+0x34a3 
ntdll.dll!ZwWaitForSingleObject+0xa 
KERNELBASE.dll!WaitForSingleObjectEx+0x98 
clr.dll!GetMetaDataInternalInterface+0x25b1f 
clr.dll!GetMetaDataInternalInterface+0x25ad3 
clr.dll!GetMetaDataInternalInterface+0x25a92 
clr.dll!GetMetaDataInternalInterface+0x39106 
clr.dll!GetMetaDataInternalInterface+0x39a81 
clr.dll!GetMetaDataInternalInterface+0x394ad 
clr.dll!GetMetaDataInternalInterface+0x39979 
clr.dll!GetMetaDataInternalInterface+0x398c1 
clr.dll!GetMetaDataInternalInterface+0x3539a 
clr.dll!ClrCreateManagedInstance+0x2747 
KERNEL32.dll!BaseThreadInitThunk+0x22 
ntdll.dll!RtlUserThreadStart+0x34 
  • は、誰も私に説明することができます

    私のCPU?
  • 「KeSynchronizeExecution」とは何ですか?
  • このような状況でCPU使用率が高くなるのを避けるにはどうすればよいですか?
+0

このスタックトレースの品質は非常に悪いです。マシンの魂を見たい場合は、オペレーティングシステム用のPDBを入手することが非常に重要です。ツール]> [オプション]> [デバッグ]> [シンボル]> [Microsoft Symbol Servers]にチェックを入れ、シンボルキャッシュディレクトリを選択します。 Fwiw、このトレースはperf問題のまともなヒントを表示しません、WaitForSingleObjectEx()は、スレッドをブロックする同期関数です。あなたが高価なコードを見ることができるように、プロファイラを使うのが一番良い方法です。 –

答えて

0

私は専門家ではありません。

ntoskrnl.exe!KeSynchronizeExecutionルーチンは、指定されたルーチンの実行を1つまたは複数の割り込みオブジェクトのセットに割り当てられた割り込みサービスルーチン(ISR)と同期させます。

ntoskrnl.exeの!KeWaitForMultipleObjectsルーチンは、ディスパッチャーオブジェクトの数のいずれかまたは全てが待機タイムアウトするまで、シグナル状態または(オプション)に設定されるまで、警告可能なまたはnonalertable待ち状態に現在のスレッドを置きます。

NTOSKRNL.EXE所与のミューテックスオブジェクトが待ちタイムアウトするまでシグナル状態又は(任意選択)に設定されるまで!KeWaitForMutexObjectルーチンは、アラート可能又はnonalertable待機状態に現在のスレッドを置きます。

だと思います。ntoskrnl.exe!KEStallWhileFrozen複数のオブジェクトルーチンが解決されないのを待っているときにルーチンが呼び出されます。

ntoskrnl.exe!_misaligned_accessルーチンは、CPUがミスアライメントされたデータを読み取ることができない場合のアラートです。 メモリが不揃いになると、ハードウェアでサポートされていないターゲットでパフォーマンスが大幅に低下する可能性があります。 Ref:https://msdn.microsoft.com/en-us/library/ms253949(v=vs.80).aspx。また、「アラインメントエラーの回避」セクションもチェックしてください。

ntoskrnl.exe!NtWaitForSingleObjectは、指定されたオブジェクトがシグナル状態になるまで待機します。

setjmp関数を呼び出すと、現在の命令アドレスと他のCPUレジスタが保存されます。 longjmp関数を呼び出すと、命令ポインタとレジスタが復元され、setjmp呼び出しの直後に実行が再開されます。

ntdll.dll!ZwWaitForSingleObjectルーチンは、指定されたオブジェクトがSignaledの状態になるまで待機します。オプションのタイムアウトを指定することもできます。

KERNELBASE.dll!WaitForSingleObjectEx待機指定されたオブジェクトがシグナル状態になるまで、I/O完了ルーチンまたは非同期プロシージャコール(APC)は、スレッドにキューイング、またはタイムアウト時間が経過しています。

clr.dll!GetMetaDataInternalInterfaceは、メモリ内のメタデータを読み書きするために使用される内部インターフェイスインスタンスへのポインタを取得します。

0

私はこのためにジェットブレーンズのソリューションを使用しました。そして、それは実際に最適化ポイントを簡単に見つけることができます。私の助言は:https://www.jetbrains.com/profiler/を使用し、どのプロセスと方法高使用CPUを見つける。また、メモリなどを見つけることができます

私はあなたが試してインストールすることができます知っている。試用版をインストールし、問題を解決してください。