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



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



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



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



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



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





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

668   5  

5 ответов:

Вы также можете использовать Систему .Диагностика.Процесс.TotalProcessorTime и система.Диагностика.ProcessThread.TotalProcessorTime свойства для расчета использования процессора, как описано в статье .

Взгляните на 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. Многие инструменты управления приложениями, мониторинга работоспособности или мониторинга приложений поддерживают WMI из коробки.

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

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

Чтобы получить представление о WMI и получить список процессов, смотрите ниже: - Win32_PerfFormattedData_PerfProc_Process чтобы получить процессорное время, фильтр 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

Comments

    Ничего не найдено.