web-dev-qa-db-ja.com

C#プログラムは、自分のCPU使用率を何らかの方法で測定できますか?

長時間実行されるバックグラウンドプログラムに取り組んでいます。デバッグ時にリアルタイムで監視するために、定期的にいくつかの値をフィードする外部ロギングプログラム( SmartInspect )があります。 。

タスクマネージャーやIARSN TaskInfoなどの複数のプログラムを単純に起動できることはわかっていますが、このために自分のプログラムにすべてを保持したいのです。 X%CPU、ログでこれにフラグを立てます。

メモリ消費量、ワーキングセットなどの統計をSmartInspectに定期的に送信するバックグラウンドスレッドがあります。

このスレッドが消費するコンピューターのCPUリソースの量をかなり正確に測定することは可能ですか?メインプログラムはシングルスレッドアプリケーション(統計をログに記録するウォッチドッグスレッドを除く)であるため、テクニックがシングルスレッドの使用量に制限されている場合、それは良いことですあまりにも。

LinuxおよびC用のrusageと呼ばれるものに関連するいくつかのエントリを見つけました。これに使用できる同様のものはありますか?


編集:わかりました、パフォーマンスカウンターの方法を試しましたが、呼び出されるたびにかなりの量のGCデータが追加されたので、メモリ使用量とガベージコレクションが急増しました。とりあえず、この部分は省略します。

39

System.Diagnostics。Process.TotalProcessorTimeSystem.Diagnostics。ProcessThread.TotalProcessorTime これは、 article で説明されているように、プロセッサの使用状況を計算するプロパティです。

49
axk

見て System.Diagnostics.PerformanceCounter。実行した場合perfmon.exe、使用可能なパフォーマンスカウンターの範囲が表示されます( 'パフォーマンスオブジェクト'を 'Process'に設定)。そのうちの1つは '%Processor Time'です。

8
Sunlight

System.Diagnostic.PerformanceCounterクラスを使用できます。 CPU使用率を監視している人の例を次に示します。

http://blogs.msdn.com/dotnetinterop/archive/2007/02/02/system-diagnostics-performancecounter-and-processor-time-on-multi-core-or-multi-cpu.aspx

これには昇格された特権が必要であることに注意してください。また、それを使用するとパフォーマンスが低下する可能性があります。

4
Keltex

Smartinspectなどのモニターにログを記録しているのは良いことです。ただし、Windows自体はこの場合はプログラム(またはプロセス)の各リソースのデータを収集します。 WMIはアプリケーション監視の標準です。 WMIによってキャプチャされたデータを表示できます。多くのアプリケーション管理、ヘルスモニタリング、またはアプリケーションモニタリングツールは、そのままでWMIをサポートします。

したがって、アプリケーション内のCPU使用率をログファイルに記録することはお勧めしません。

可用性とパフォーマンスが重要であると思われる場合は、Microsoft Operations Managerソリューションなどのソリューションを検討してください。

WMIについてのアイデアを取得し、プロセスのリストを取得するには、以下を参照してください。-Win32_PerfFormattedData_PerfProc_Process CPU時間を取得するには、フィルターはprocessIDです この記事を参照 -Win32_processクラスからprocessIDを取得できます。

WMI Made Easy for C# by Kevin Matthew Goss

oConn.Username = "JohnDoe";
oConn.Password = "JohnsPass";

System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn);    

//get Fixed disk stats
System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

//Execute the query 
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery);

//Get the results
ManagementObjectCollection oReturnCollection = oSearcher.Get();   

//loop through found drives and write out info
foreach( ManagementObject oReturn in oReturnCollection )
{
    // Disk name
    Console.WriteLine("Name : " + oReturn["Name"].ToString());
    // Free Space in bytes
    Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString());
    // Size in bytes
    Console.WriteLine("Size: " + oReturn["Size"].ToString());
} 

リモートシステムからもプロセスを監視できます。

3