長時間実行されるバックグラウンドプログラムに取り組んでいます。デバッグ時にリアルタイムで監視するために、定期的にいくつかの値をフィードする外部ロギングプログラム( SmartInspect )があります。 。
タスクマネージャーやIARSN TaskInfoなどの複数のプログラムを単純に起動できることはわかっていますが、このために自分のプログラムにすべてを保持したいのです。 X%CPU、ログでこれにフラグを立てます。
メモリ消費量、ワーキングセットなどの統計をSmartInspectに定期的に送信するバックグラウンドスレッドがあります。
このスレッドが消費するコンピューターのCPUリソースの量をかなり正確に測定することは可能ですか?メインプログラムはシングルスレッドアプリケーション(統計をログに記録するウォッチドッグスレッドを除く)であるため、テクニックがシングルスレッドの使用量に制限されている場合、それは良いことですあまりにも。
LinuxおよびC用のrusageと呼ばれるものに関連するいくつかのエントリを見つけました。これに使用できる同様のものはありますか?
編集:わかりました、パフォーマンスカウンターの方法を試しましたが、呼び出されるたびにかなりの量のGCデータが追加されたので、メモリ使用量とガベージコレクションが急増しました。とりあえず、この部分は省略します。
System.Diagnostics。Process.TotalProcessorTime と System.Diagnostics。ProcessThread.TotalProcessorTime これは、 article で説明されているように、プロセッサの使用状況を計算するプロパティです。
見て System.Diagnostics.PerformanceCounter
。実行した場合perfmon.exe
、使用可能なパフォーマンスカウンターの範囲が表示されます( 'パフォーマンスオブジェクト'を 'Process'に設定)。そのうちの1つは '%Processor Time'です。
System.Diagnostic.PerformanceCounterクラスを使用できます。 CPU使用率を監視している人の例を次に示します。
これには昇格された特権が必要であることに注意してください。また、それを使用するとパフォーマンスが低下する可能性があります。
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());
}
リモートシステムからもプロセスを監視できます。