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

StackOverflow https://stackoverflow.com/questions/275957

Вопрос

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

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

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

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

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


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

Это было полезно?

Решение

Вы также можете использовать Система.Диагностика.Процесс.Общее время обработки и Система.Диагностика.Processsthread.Общее время обработки свойства для расчета использования вашего процессора следующим образом Статья описывает.

Другие советы

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

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

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

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

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

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

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

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

WMI Упростили для 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());
} 

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

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

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

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

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

http://csharp-source.net/open-source/profile

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top