長時間実行プロセス中の CPU 使用率レベルを測定しようとしています。タスクマネージャーを実行してデータを表示するたびに、タスクマネージャーの優先度が高いため、プロセスの CPU 使用率が低下すると思われます。プロセスにリアルタイム優先度を与えると、タスク マネージャーが完全にロックして使用できなくなります。CPU サイクルのほとんどをこのプロセス専用にしたいと考えており、それがどれだけ使用しているかを大まかに把握したいと考えています。秒単位のモニターは必要ありませんが、何が起こっているかを知るためのいくつかのスナップショットだけが必要です。どうすればこれを達成できますか?
5 に答える
おそらく procdump - ただし、sysinternals プロセス ツールの 1 つが役立つはずです
C API をプログラムで使用すると、パフォーマンス カウンター API を使用できます。(CPU 使用率は単なる別のカウンターです)。低レベルのレジストリ API を使用して、パフォーマンス カウンターのデータを照会できます。または、PDH API (Performance Data Helper API) を使用することもできます。これはおそらく必要なものです。私は過去に両方を使用しましたが、PDH API は使いやすいです。
使用可能なカウンターの名前を列挙するのに役立つもう 1 つのツールは、perfmon です。(c:\windows\system32\perfmon.exe を実行するだけです)。また、タスク マネージャーの便利な代替手段でもあります。また、ロギングとグラフも行います。また、マルチプロセッサ マシンの論理プロセッサごとにカウンターを設定できます。
タスク マネージャーに関するあなたの懸念が正しいかどうかはわかりません。タスク マネージャーは十分に軽量なので、実行時間の長いプロセスをかき消したり、十分な CPU サイクルを盗んだりすることはありません。プロセスが本当に CPU を消費している場合は、タスク マネージャーに表示されます。プロセスで期待したほどの CPU 使用率が見られない場合は、CPU を大量に使用するためにプロセスに時間がかかるという想定が間違っている可能性があります。おそらく、IO がバインドされているか、イベントを待機しているか、多くのスリープが発生しているため、長時間実行されているプロセスが長時間実行されています。つまり、CPU を使用する以外のことを行います。多くの CPU を使用しているが、100% ではない場合、上記と同じ理由で効率的ではない可能性があります。
@martin Becket: procmon を使用すると、特定のプロセスのプロパティで詳細な CPU 使用率を確認できます
GetProcessTimesを介してその特定のプロセスを (たとえば ID で) クエリする簡単なツールを作成できます。
行の何か:
main()
HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, id);
for(;;) {
GetProcessTimes(h, /*..times.. */);
printf("time taken %d\n", (kerneltime+usertime));
Sleep(1000);
}