Может ли программа на C # измерить загрузку своего процессора? - PullRequest
39 голосов
/ 09 ноября 2008

Я работаю над фоновой программой, которая будет работать в течение длительного времени, и у меня есть внешняя программа ведения журнала ( SmartInspect ), которую я хочу периодически вводить с некоторыми значениями, чтобы отслеживать ее в реальном времени при отладке.

Я знаю, что могу просто запустить несколько программ, таких как Диспетчер задач или IARSN TaskInfo, но я бы хотел сохранить все в своей собственной программе для этого, так как я также хочу добавить несколько простых правил, например, если программа использует более X% ЦП, отметьте это в журнале.

У меня есть фоновый поток, который периодически передает некоторую статистику в SmartInspect, такую ​​как потребление памяти, рабочий набор и т. Д.

Возможно ли, чтобы этот поток получил достаточно точную оценку того, сколько ресурсов процессора компьютера он потребляет? Основная программа - это однопоточное приложение (кроме сторожевого потока, который регистрирует статистику), поэтому, если метод ограничен , сколько один поток использует , тогда это тоже будет хорошо.

Я нашел некоторые записи, связанные с чем-то, что называется rusage для Linux и C. Есть ли что-то подобное, что я могу использовать для этого?


Редактировать: Хорошо, я пробовал счетчик производительности, но он каждый раз вызывал довольно много GC-данных, поэтому график использования памяти и сбора мусора взлетел до небес. Думаю, я просто пока оставлю эту часть.

Ответы [ 5 ]

49 голосов
/ 09 ноября 2008

Вы также можете использовать System.Diagnostics. Process.TotalProcessorTime и System.Diagnostics. ProcessThread.TotalProcessorTime свойства для вычисления вашего использование процессора, как описывает статья .

8 голосов
/ 09 ноября 2008

Посмотрите на System.Diagnostics.PerformanceCounter. Если вы запустите perfmon.exe, вы увидите диапазон доступных вам счетчиков производительности (установите для «объекта производительности» значение «Процесс»), одним из которых является «% времени процессора».

4 голосов
/ 09 ноября 2008

Вы можете через класс System.Diagnostic.PerformanceCounter. Вот пример того, как кто-то отслеживает использование процессора:

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

Обратите внимание, что для этого требуются повышенные привилегии. И это может привести к снижению производительности.

3 голосов
/ 09 ноября 2008

Хорошо, что вы входите в мониторы, такие как smartinspect. Но сама Windows собирает данные для каждого ресурса в этом случае вашей программы (или процесса). WMI является стандартом для мониторинга приложений. Мы можем просмотреть данные, захваченные WMI. Многие инструменты управления приложениями, мониторинга работоспособности или мониторинга приложений поддерживают WMI "из коробки".

Поэтому я бы не советовал вам регистрировать загрузку процессора в приложении в файл журнала.

Если вы считаете, что доступность и производительность имеют решающее значение, выберите такие решения, как решение Microsoft Operations Manager.

Чтобы получить представление о WMI и список процессов, см. Ниже: - Win32_PerfFormattedData_PerfProc_Process чтобы получить время процессора, фильтр - это processID См. Эту статью - Вы можете получить processID из класса Win32_process.

WMI Made Easy для C # Кевин Мэтью Госс

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());
} 

Вы также можете следить за процессом из удаленной системы.

0 голосов
/ 11 мая 2010

Эта статья проекта кода описывает, как использовать высокопроизводительный таймер:

http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx

Вы можете использовать его для определения времени выполнения вашего кода.

Здесь вы можете найти ряд профилей C # с открытым исходным кодом:

http://csharp -source.net / с открытым исходным кодом / профиль

...