Имя: Пароль:
IT
Админ
Как получить имя процесса, занимающего большую часть процессорного времени в Per
0 Lex_Liven
 
23.10.12
08:30
Всем день.
В системе Windows XP есть монитор ресурсов системы (Perfomance Monitor). У меня есть программа, позволяющая получить из него значение любого счетчика в реальном времени. Мне нужно, чтобы эта программа знала самый "тяжелый" по процессорному времени процесс. Как это можно сделать? Какой счетчик выбрать?
1 Птах
 
23.10.12
08:45
Смотря за какой период "самый тяжелый". Можно выбрать по "Среднее для ЦП", а можно по всего затраченному процессорному времени.
2 Lex_Liven
 
23.10.12
08:50
(1) Тот, который через Ctrl+Alt+Del показан с самым большим процентом нагрузки.
3 Lex_Liven
 
23.10.12
08:54
(1) То есть "самый тяжелый" на данный момент. За последнюю секунду, если нужен именно период.
4 Lex_Liven
 
23.10.12
08:55
+(0) Та же программа может получать данные из WMI. Если есть вариант с его использованием - тоже можно рассмотреть.
5 Fedot200
 
23.10.12
08:56
(4) Да через WMI смотри.
6 Fedot200
 
23.10.12
08:58
7 Lex_Liven
 
23.10.12
08:58
(5) Отличный совет. Где именно там искать? И как?
Программа - Samurize, если это что-то скажет.
8 Fragster
 
гуру
23.10.12
08:58
поставь procmon
9 Fedot200
 
23.10.12
09:00
(7) вот что он может показать http://msdn.microsoft.com/en-us/library/windows/desktop/aa394372(v=vs.85).aspx
10 Fragster
 
гуру
23.10.12
09:00
11 Fedot200
 
23.10.12
09:00
(7) А какая цель? Можно, например, смотреть прямо из 1С.
12 Fedot200
 
23.10.12
09:02
(10) А она точно все покажет что в (9)?
13 Fragster
 
гуру
23.10.12
09:03
(12) вроде да. только она еще журнал пишет, а вызов WMI - тольок для текущих процессов...
14 Lex_Liven
 
23.10.12
09:05
(8) Нет, мне это нужно именно в Samurize вывести.
(9) Сам класс и его свойства я вижу, но так я смогу получить только информацию по конкретному процессу. А мне нужно что-то вроде "SELECT FIRST 1 ProcessName ... ORDER BY ProcessorUsage DESC" (приблизительно). При этом сам текст запроса я написать не могу.
15 Fragster
 
гуру
23.10.12
09:08
(14) блин, типа в виджет, чтоли? у меня 95% времени десктоп не видлен, но запущен process explorer (рядом с прокмоном висит), который выводит графики загрузки в трей. если навести на значек трея - то выведет имя самого жручего процесса для графика процессора, коммит чардж для графика памяити, скорость для сети и т.п.
16 Lex_Liven
 
23.10.12
09:11
(15) Блин, типа давайте по теме, что-ли? Как смотреть на виджет, это мои проблемы. Есть конкретный вопрос с конкретными условиями задачи, давайте по ним и работать. Procmon не умеет сохранять свой вывод в png для просмотра статуса сервера по html.
17 Fragster
 
гуру
23.10.12
09:12
(16) png, html...
18 Fedot200
 
23.10.12
09:14
(14)вот кусок кода на 1С который я делал, может чем поможет:
ИмяП="1cv8.exe";
   pEnum=objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '"+ИмяП+"'");  
   Для Каждого Object Из pEnum Цикл
       Про=Object.Properties_;
       Для Каждого Свойство Из Про Цикл
           Если Свойство.Name="ProcessId" Тогда
19 Lex_Liven
 
23.10.12
09:18
SELECT * FROM Win32_Process WHERE Name = '"+ИмяП+"'

Возвращает список процессов, у которых имя совпадает с указанным. К сожалению, я не могу найти у Win32_Process свойства "% загрузки ЦП". Единственное более-менее близкое по смысу - это KernelModeTime, но оно, кажется, содержит полное время работы процесса (в процессорном времени) с момента его запуска.
20 Fedot200
 
23.10.12
09:52
(19) Вот проще код:
ИмяП="1cv8.exe";
pEnum=objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '"+ИмяП+"'");  
Для Каждого Object Из pEnum Цикл
   Если Число(Object.OtherOperationCount)<4500 Тогда
       //убиваем процесс
       Object.Terminate();
   КонецЕсли;
КонецЦикла;

Этим я проверял нормально ли запустилась 8-ка, просто я заметил,  что если OtherOperationCount < 4 500 то восьмерка висит на вводе пароля пользователя.

Может тоже какое свойство поможет.
21 Fedot200
 
23.10.12
10:09
+ (20) кажись вот так называется свойство "PercentProcessorTime "
22 Lex_Liven
 
23.10.12
10:17
(21) У Win32_Process такого свойства нет. Да и в других классах не могу найти.
23 Fedot200
 
23.10.12
10:37
(22) Ага, точно. Вот у этого есть Win32_PerfRawData_PerfProc_Process
Здесь надыбал http://forum.sources.ru/index.php?showtopic=279727
24 Fedot200
 
23.10.12
10:37
25 Lex_Liven
 
23.10.12
10:53
Интересно, win32_perfformatteddata_perfproc_process и Win32_PerfRawData_PerfProc_Process  у меня пустые. Ни свойств, ни результатов запроса по ним...
26 Fedot200
 
23.10.12
10:57
(25) скрипт в (23) пробовал?
27 Lex_Liven
 
23.10.12
11:02
Пробовал. Ошибка 80041010. Без описания.
28 Lex_Liven
 
23.10.12
11:04
Попытался оформить в виде скрипта, чтобы Самурайз получал значение функции. Ошибка та же.

Function TopConsumerProcess(strComputer)
   If strComputer = "" Then strComputer = "."
   Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
   Set ProcessSet =  objWMIService.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process",,48)
   
   MaxConsume = 0
   TopProcessConsumer = ""
   For each Process in ProcessSet    <Вот на это строке падает>
       If Process.PercentProcessorTime > MaxConsume Then
           TopProcessConsumer = Process.Caption
           MaxConsume = PercentProcessorTime
       End If
   Next
   TopConsumerProcess = TopProcessConsumer
End Function
29 Lex_Liven
 
23.10.12
11:07
Все, разобрался.
1. Нужно было запустить службу "Расширения драйверов WMI (Windows Management Instrumentation)".
2. Выполнить в комстроке "wmiadap /f"
Пошел ответ от WMI... Буду теперь его разбирать.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.