7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232
|
||||||
1 | ||||||
Расчет нагрузки на CPU для отдельно взятого приложения01.11.2018, 08:41. Показов 4015. Ответов 9
Метки нет Все метки)
(
Всем привет!
Есть задача найти загрузку CPU для всех процессов определенного приложения. Фактически я ее решил, но есть несколько вопросов. С помощью Get-Process и Get-WMIObject Win32_Process я нахожу все процессы, связанные с определенным exe-файлом. Расчитываю нагрузку на CPU в % с помощью следующей формулы:
$TimeKernelProc2 + $TimeUserProc2 - Процессорное время всех процессов приложения через 1 секунду $iTimeIdleCPU1 - Время простоя процессора в начальный момент времени $iTimeIdleCPU2 - Время простоя процессора через 1 секунду Когда запускаю свой скрипт и провожу нагрузочное тестирование, то в целом результаты нагрузки совпадают с показаниями виндовозного менеджера задач. Но в некоторые моменты мой скрипт может показывать нагрузку более 100%. И вот я думаю с чем это связано, есть ли в этой формуле изъян. Кто что думает по этому поводу? Добавлено через 6 минут $TimeKernelProc ищется по свойству KernelModeTime объекта Win32_Process $TimeUserProc ищется по свойству UserModeTime объекта Win32_Process $TimeIdleCPU ищется по свойству KernelModeTime объекта Win32_Process у процесса с именем "System idle Process"
0
|
|
01.11.2018, 08:41 | |
Ответы с готовыми решениями:
9
Расчет нагрузки CPU Верная организация данных для снижения нагрузки CPU Как убрать border у миниатюры отдельно взятого поста ?
|
1883 / 1106 / 427
Регистрация: 22.01.2016
Сообщений: 3,050
|
|
01.11.2018, 09:57 | 2 |
А не пробовали просто использовать Get-Counter?
Добавлено через 3 минуты Например: Мониторинг рабочих станций (процессы, загрузка ЦП, ОЗУ, HDD) Скрипт PowerShell информация о загрузке процессора
0
|
7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232
|
|
01.11.2018, 11:21 [ТС] | 3 |
К сожалению, этот вариант не подойдет. Так как родительский процесс может генерировать целую кучу подпроцессов с рандомными именами, плюс родительских процессов может быть несколько и их число непостоянно. Подсчитывать их в этом случае через счетчики даже не знаю как. Максимум какую я нашел привязку - поиск процессов по пути исполняемого файла, для всех он един, а имена могут быть рандомные.
Кстати, ошибся в описании формулы, на самом деле она такая: ( ($TimeKernelProc1 + $TimeUserProc1 ) - ($TimeKernelProc1 + $TimeUserProc1 ) ) / ( $AllProcessTime - $AllProcessTime ) * 100 $TimeKernelProc ищется по свойству KernelModeTime объекта Win32_Process для суммы искомых процессов $TimeUserProc ищется по свойству UserModeTime объекта Win32_Process для суммы искомых процессов $AllProcessTime ищется как UserModeTime + KernelModeTime объекта Win32_Process для всех найденных процессов в системе.
0
|
1883 / 1106 / 427
Регистрация: 22.01.2016
Сообщений: 3,050
|
||||||
01.11.2018, 11:43 | 4 | |||||
Т.е. InstanceName из этого примера разные?
0
|
7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232
|
|
01.11.2018, 12:24 [ТС] | 5 |
Еще столкнулся с проблемой, что запросы к WMI жрут очень много процессорного времени, когда запускаю свой скрипт в цикле, то он сжирает до половины ресурсов CPU, это вообще прикол
0
|
Покинул форум
6598 / 1481 / 355
Регистрация: 07.05.2015
Сообщений: 2,902
|
|
01.11.2018, 13:44 | 6 |
Dimasio, предоставленная вами формула(???) расчета загрузки ЦП каким-то процессом, да еще и с использованием WMI, заведомо порочный путь. К слову, использование счетчиков производительности также порочно в виду кривизны их реализации. Если желаете простое решение - используйте kernrate или нечто в этом роде. Более сложное, но идеологически правильное решение, подразумевает использование NTAPI, в частности NtQuerySystemInformation.
0
|
7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232
|
|
01.11.2018, 18:12 [ТС] | 7 |
Есть 3 exe-файла с апачем, например, они лежат в папках
C:\apache1\httpd.exe C:\apache2\httpd.exe C:\apache3\httpd.exe Каждый из них порождает минимум 2 процесса с именем httpd (все 6 процессов будут иметь одинаковое имя). С помощью счетчиков можно определить нагрузку на сервер для всех процессов с именем httpd, а мне нужно сделать конкретную выборку, выбрать только нагрузку тех процессов, которые принадлежат C:\apache2\httpd.exe, например. С помощью счетчиков даже не представляю как это можно сделать. Хотелось бы решение без установки дополнительного ПО, максимум portable и чтобы к нему можно было обращаться через cmd и снимать стату. По поводу NTAPI, к сожалению кроме powershell пока ничего не знаю. Добавлено через 8 минут Kernrate Viewer вроде годная утилита, но поддерживает максимум WinXP(
0
|
1883 / 1106 / 427
Регистрация: 22.01.2016
Сообщений: 3,050
|
||||||
01.11.2018, 18:40 | 8 | |||||
0
|
7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232
|
|
02.11.2018, 06:06 [ТС] | 9 |
KDE777, интересное решение, только вот $_.CookedValue не равнозначно $Process.Id. В первом хранится процент загруженности, а во втором PID, поэтому не работает вариант
![]()
0
|
1883 / 1106 / 427
Регистрация: 22.01.2016
Сообщений: 3,050
|
|
02.11.2018, 09:45 | 10 |
Ну надо же! Глаза открыли
![]() А если серьёзно, если не захотели проверить показанный пример, то хотя бы внимательно прочитайте название счётчика. Или у счётчиков памяти или дисковой активности, в свойстве CookedValue тоже хранится процент загруженности?
0
|
02.11.2018, 09:45 | |
Помогаю со студенческими работами здесь
10
Определить, по какому предмету лучше успеваемость у отдельно взятого класса школы Java, 100% нагрузки CPU % нагрузки CPU и GPU в играх [WIN XP] (ищу программу) Зависание и рандомная перезагрузка ПК. Температура CPU в переделах нормы без нагрузки 33-37. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |