Может ли программа на C# каким-то образом измерить собственную загрузку процессора?
Я работаю над фоновой программой, которая будет работать в течение длительного времени, и у меня есть внешняя программа регистрации (SmartInspect), которую я хочу периодически кормить некоторыми значениями, чтобы отслеживать ее в реальном времени при отладке.
Я знаю, что могу просто запустить несколько программ, таких как Диспетчер задач или IARSN TaskInfo, но я хотел бы сохранить все в моей собственной программе для этого, так как я также хочу добавить некоторые простые правила, например, если программа использует более X% CPU, отметьте это в бревно.
У меня есть фоновый поток, который периодически передает некоторую статистику SmartInspect, например потребление памяти, рабочий набор и т. д.
Возможно ли для этого потока получить достаточно точную меру того, сколько ресурсов процессора компьютера он потребляет? Основная программа-это однопоточное приложение (кроме сторожевого потока, который регистрирует статистику), поэтому если метод ограничен , сколько использует один поток , то это было бы хорошо тоже.
Я нашел некоторые записи, связанные с чем-то под названием rusage для Linux и C. Есть ли что-то подобное, что я могу использовать для этого?
Edit: хорошо, я попробовал использовать счетчик производительности, но он добавлял довольно много GC-данных при каждом вызове, поэтому график использования памяти и сбора мусора взлетел до небес. Пожалуй, я пока оставлю эту часть в стороне.
5 ответов:
Вы также можете использовать Систему .Диагностика.Процесс.TotalProcessorTime и система.Диагностика.ProcessThread.TotalProcessorTime свойства для расчета использования процессора, как описано в статье .
Взгляните на
System.Diagnostics.PerformanceCounter. Если вы запуститеperfmon.exe, вы увидите диапазон доступных вам счетчиков производительности (установите "объект производительности" в "процесс"), одним из которых является "% процессорного времени".
Вы можете через систему.Диагностический.Класс PerformanceCounter. Вот пример того, как кто-то следит за использованием процессора:
Обратите внимание, что для этого требуются повышенные привилегии. И там может быть хит производительности, используя его.
Хорошо, что вы регистрируетесь на мониторах, таких как 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# - профайлеров с открытым исходным кодом:
Comments