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 в % с помощью следующей формулы:

PowerShell
1
( ($TimeKernelProc1 + $TimeUserProc1 ) - ($TimeKernelProc1 + $TimeUserProc1 ) ) / ( $iTimeIdleCPU1 - $iTimeIdleCPU2 ) * 100
$TimeKernelProc1 + $TimeUserProc1 - Процессорное время всех процессов приложения в начальный момент времени
$TimeKernelProc2 + $TimeUserProc2 - Процессорное время всех процессов приложения через 1 секунду

$iTimeIdleCPU1 - Время простоя процессора в начальный момент времени
$iTimeIdleCPU2 - Время простоя процессора через 1 секунду

Когда запускаю свой скрипт и провожу нагрузочное тестирование, то в целом результаты нагрузки совпадают с показаниями виндовозного менеджера задач. Но в некоторые моменты мой скрипт может показывать нагрузку более 100%. И вот я думаю с чем это связано, есть ли в этой формуле изъян.

Кто что думает по этому поводу?

Добавлено через 6 минут
$TimeKernelProc ищется по свойству KernelModeTime объекта Win32_Process
$TimeUserProc ищется по свойству UserModeTime объекта Win32_Process

$TimeIdleCPU ищется по свойству KernelModeTime объекта Win32_Process у процесса с именем "System idle Process"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2018, 08:41
Ответы с готовыми решениями:

Расчет нагрузки CPU
Добрый вечер. Powershell знаю очень поверхностно, но недавно появилась задача написать скрипт...

Верная организация данных для снижения нагрузки CPU
Что будет давать меньше нагрузки ? Суть значит такая я хочу выяснить что будет меньше нагрузки...

Как убрать border у миниатюры отдельно взятого поста ?
Ребят, есть такая проблема ! Как убрать border у миниатюры нужного поста ? Как везде пишут, что...

Замена элементов отдельно взятого столбца (строки) матрицы на элементы вектора
Замена элементов отдельно взятого столбца (строки) матрицы на элементы вектора

9
1883 / 1106 / 427
Регистрация: 22.01.2016
Сообщений: 3,050
01.11.2018, 09:57 2
Цитата Сообщение от Dimasio Посмотреть сообщение
Расчитываю нагрузку на CPU в % с помощью следующей формулы
А не пробовали просто использовать Get-Counter?

Добавлено через 3 минуты
Например:

Мониторинг рабочих станций (процессы, загрузка ЦП, ОЗУ, HDD)
Скрипт PowerShell информация о загрузке процессора
0
7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232
01.11.2018, 11:21  [ТС] 3
Цитата Сообщение от KDE777 Посмотреть сообщение
А не пробовали просто использовать Get-Counter?
К сожалению, этот вариант не подойдет. Так как родительский процесс может генерировать целую кучу подпроцессов с рандомными именами, плюс родительских процессов может быть несколько и их число непостоянно. Подсчитывать их в этом случае через счетчики даже не знаю как. Максимум какую я нашел привязку - поиск процессов по пути исполняемого файла, для всех он един, а имена могут быть рандомные.

Кстати, ошибся в описании формулы, на самом деле она такая:

( ($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
Цитата Сообщение от Dimasio Посмотреть сообщение
К сожалению, этот вариант не подойдет. Так как родительский процесс может генерировать целую кучу подпроцессов с рандомными именами
Т.е. InstanceName из этого примера разные?

PowerShell
1
(Get-Counter -Counter $CounterPath -SampleInterval 1 -MaxSamples 10 -ComputerName $pc -EA SilentlyContinue).CounterSamples | ? CookedValue -ne 0 | group 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
Цитата Сообщение от KDE777 Посмотреть сообщение
Т.е. InstanceName из этого примера разные?
Есть 3 exe-файла с апачем, например, они лежат в папках

C:\apache1\httpd.exe
C:\apache2\httpd.exe
C:\apache3\httpd.exe

Каждый из них порождает минимум 2 процесса с именем httpd (все 6 процессов будут иметь одинаковое имя). С помощью счетчиков можно определить нагрузку на сервер для всех процессов с именем httpd, а мне нужно сделать конкретную выборку, выбрать только нагрузку тех процессов, которые принадлежат C:\apache2\httpd.exe, например. С помощью счетчиков даже не представляю как это можно сделать.

Цитата Сообщение от greg zakharov Посмотреть сообщение
Если желаете простое решение - используйте kernrate или нечто в этом роде. Более сложное, но идеологически правильное решение, подразумевает использование NTAPI, в частности NtQuerySystemInformation.
Хотелось бы решение без установки дополнительного ПО, максимум portable и чтобы к нему можно было обращаться через cmd и снимать стату. По поводу NTAPI, к сожалению кроме powershell пока ничего не знаю.

Добавлено через 8 минут
Kernrate Viewer вроде годная утилита, но поддерживает максимум WinXP(
0
1883 / 1106 / 427
Регистрация: 22.01.2016
Сообщений: 3,050
01.11.2018, 18:40 8
Цитата Сообщение от Dimasio Посмотреть сообщение
Есть 3 exe-файла с апачем, например, они лежат в папках
C:\apache1\httpd.exe
C:\apache2\httpd.exe
C:\apache3\httpd.exe
Каждый из них порождает минимум 2 процесса с именем httpd (все 6 процессов будут иметь одинаковое имя). С помощью счетчиков можно определить нагрузку на сервер для всех процессов с именем httpd, а мне нужно сделать конкретную выборку, выбрать только нагрузку тех процессов, которые принадлежат C:\apache2\httpd.exe, например. С помощью счетчиков даже не представляю как это можно сделать.
PowerShell
1
2
3
4
5
foreach ($Process in Get-Process | ? Path -eq 'C:\apache1\httpd.exe')
{
    $CounterPath = ((Get-Counter "\Процесс(*)\Идентификатор процесса").CounterSamples | ? {$_.CookedValue -eq $Process.Id}).Path
    Get-Counter $CounterPath
}
А есть ещё такой счётчик - "Код (ID) создавшего процесса"...
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
Цитата Сообщение от Dimasio Посмотреть сообщение
только вот $_.CookedValue не равнозначно $Process.Id. В первом хранится процент загруженности, а во втором PID
Ну надо же! Глаза открыли

А если серьёзно, если не захотели проверить показанный пример, то хотя бы внимательно прочитайте название счётчика. Или у счётчиков памяти или дисковой активности, в свойстве CookedValue тоже хранится процент загруженности?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2018, 09:45
Помогаю со студенческими работами здесь

Определить, по какому предмету лучше успеваемость у отдельно взятого класса школы
вот нужно код написать по задаче: В структурах А, G, F содержатся оценки учащихся по алгебре,...

Java, 100% нагрузки CPU
Почему java грузит 90-100% цп системы? Как убрать нагрузку цп?

% нагрузки CPU и GPU в играх [WIN XP] (ищу программу)
Вопрос в названии

Зависание и рандомная перезагрузка ПК. Температура CPU в переделах нормы без нагрузки 33-37.
Виснет в BIOSе, иногда не сразу а через час. Бывает удается загрузить ОС. Температура CPU в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru