Имя: Пароль:
IT
 
как программно узнать загрузку процессора конкретным процессом

0 gr13
 
26.05.10
13:02
у нас есть Диспетчер задач и на закладке процессы есть список процессов.
у каждого процесса есть загрузка ЦП в процентах.

по какой формуле они считаются и откуда берут исходные данных?

самое близкое что я нашел это
http://msdn.microsoft.com/en-us/library/aa394372(v=VS.85).aspx
Win32_Process Class

у него есть поле:
KernelModeTime

   Data type: uint64
   Access type: Read-only

   Time in kernel mode, in 100 nanosecond units. If this information is not available, use a value of 0 (zero).

но как из него получить вот эти самые проценты?
1 NS
 
26.05.10
13:10
Берешь очень мальнький интервал времени, и замеряешь соколько процессорного времени потратил процесс за этот период. Делишь время процесса на время в интервале...
2 NS
 
26.05.10
13:16
timebeginperiod(1);
t1:=PProcessInformation.KernelTime;
time1:=Timegettime;
Sleep(100);
proc:=100*(PProcessInformation.KernelTime-t1)/10000/(timegettime-time1);
timeendperiod(1);
3 sapphire
 
26.05.10
13:18
эх... Гера...

Win32_PerfFormattedData_PerfProc_Process

PercentProcessorTime

http://msdn.microsoft.com/en-us/library/aa394277(VS.85).aspx
4 NS
 
26.05.10
13:26
Вот, нашел пример.
http://tripsin.narod.ru/notes/CpuUsaseForProcess.htm
можно еще если нужна средняя загрузка с самого начала работы процесса воспользоваться createtime.
(3) Бред, а не метод, могу привести кучу причин  почему НИКОГДА нельзя пользоваться значением PercentProcessorTime
5 sapphire
 
26.05.10
13:28
(4) Приведи. :)
6 NS
 
26.05.10
13:32
(5)
Медленное обращение к счетчику.
Показывает "среднюю температуру по больнице" - загрузку с момента запуска процесса.
7 sapphire
 
26.05.10
13:34
(4) Не я конгечно верю, что Windows создан не Microsoft, а тобою лично, но из msdn:

The Win32_PerfFormattedData_PerfProc_Process formatted data class provides precalculated data from performance counters that monitor running application and system processes. All the threads in a process share the same address space and have access to the same data.

This class represents the Process object in System Monitor and returns the same data you see in System Monitor. The original data source is the PerfProc performance library. This class derives its raw data from the corresponding raw class Win32_PerfRawData_PerfProc_Process. Data is provided dynamically for this class from the performance library object by the WmiPerfInst provider.

Коли англицким владеешь, то returns the same data you see in System Monitor is equals to "у нас есть Диспетчер задач и на закладке процессы есть список процессов.
у каждого процесса есть загрузка ЦП в процентах".

(6) А задача real-time не стоит. к тому же в Windows есть инструментарий, позволяющий отслеживать пиковые нагрузки и т.д.
8 NS
 
26.05.10
13:43
(7) Насчет скорости - представляешь как тормозит WMI?
Это средство для ленивых, и в большинстве случаев не очень корректно.
9 sapphire
 
26.05.10
14:02
(8) Правда? Сама Microsoft его использует. Конечно, можно и поизголяться.
Да, и как же тормозит WMI?
10 gr13
 
26.05.10
14:34
(8)нормально отрабатывает, правда я пока не знаю как написать левое соединение для получения этого процента с таблицей win32_process
11 NS
 
26.05.10
14:40
(9) правда. Сама майкрософт использует её в одном! приложении, и это функции именно этого приложения. WMI работает через задницу (это средства медленного получения информации), поэтому имеет очень низкую скорость.
А так используется

http://msdn.microsoft.com/en-us/library/ms724509(VS.85).aspx
12 sapphire
 
26.05.10
15:26
13 MMF
 
26.05.10
15:31
например, http://www.rsdn.ru/article/baseserv/perfcounters1.xml или PDH API или WMI
как известно, сложности в деталях, а нюансов в вопросе счетчиков производительности множество. Вариант (1) - верный способ решить задачу не за час, а за неделю.
14 gr13
 
26.05.10
17:08
возможен такой вариант решения
exec xp_cmdshell 'wmic path Win32_Process get Caption,ExecutablePath,Handle, ProcessId,VirtualSize, WorkingSetSize /FORMAT:"csv.xsl"'
exec xp_cmdshell 'wmic path Win32_PerfFormattedData_PerfProc_Process get idProcess, PercentProcessorTime /FORMAT:"csv.xsl"'

потом распарсивание таблиц и объединение их по полю idProcess

но во первых запрос к Win32_PerfFormattedData_PerfProc_Process  всегда показывает 100% у ожидание системы и еще у одного процесса тоже 100%, чего не может быть
а во вторых мне не нравится разделение запусков на 2 процедуры, хорошо было бы сделать в одной
15 NS
 
26.05.10
19:09
(13) В интернете несколько готовых решений именно способом (1)
16 Kreont
 
26.05.10
19:46
Я таким пользуюсь:
Process Explorer
Copyright © 1996-2005 Mark Russinovich
Sysinternals - www.sysinternals.com

Все норм показывает, его полезно дома иметь)

Теперь вроде и на сайте МС где то должно быть, так как купил МС весь sysinternals
17 gr13
 
26.05.10
20:22
(16) у меня больше 1000 удаленных точек и ты предлагаешь, чтобы я везде его поставил?
18 gr13
 
26.05.10
20:23
(+17) погляжу. интеерсно что из того, что там входит в стандартную поставку вин хр?
19 Kreont
 
27.05.10
11:02
(18) Потестируй у себя тот Process Explorer норм штука, работает без инсталяции, когда надо анализировать тогда и запускаешь, зачем инсталить на все.
(Та и размер небольшой что б передать по нету на точку)
20 gr13
 
27.05.10
13:30
http://msdn.microsoft.com/en-us/library/aa393026(v=VS.85).aspx

On Error Resume Next
strComputer = "."
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set objServicesCimv2 = GetObject("winmgmts:\\" _
   & strComputer & "\root\cimv2")
If Err = 0 Then
Set objRefreshableItem = _
   objRefresher.AddEnum(objServicesCimv2 , _
   "Win32_PerfFormattedData_PerfProc_Process")
objRefresher.Refresh
' Loop through the processes three times to locate  
'    and display all the process currently using
'    more than 1 % of the process time. Refresh on each pass.
For i = 1 to 1
   Wscript.Echo "Refresh number " & i
   objRefresher.Refresh
   For Each Process in objRefreshableItem.ObjectSet
       If Process.PercentProcessorTime > 1 then
           WScript.Echo Process.Name & _
               vbnewLine & Process.PercentProcessorTime & "%"
       End If
   Next
Next
Else
   WScript.Echo Err.Description
End If


теперь бы еще придумать как это реализовать на tsql или просто его запустить не создавая файла и получить результат)
21 MMF
 
28.05.10
15:02
(20) примерно так:
DECLARE hr int
DECLARE @script int
DECLARE @text varchar(8000)
DECLARE @code varchar(8000)
set @text = ''
set @code =
'Function checkProc()
On Error Resume Next
strComputer = "."
checkProc = ""
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set objServicesCimv2 = GetObject("winmgmts:\\" _
  & strComputer & "\root\cimv2")
If Err = 0 Then
Set objRefreshableItem = _
  objRefresher.AddEnum(objServicesCimv2 , _
  "Win32_PerfFormattedData_PerfProc_Process")
objRefresher.Refresh
For i = 1 to 1
  Wscript.Echo "Refresh number " & i
  objRefresher.Refresh
  For Each Process in objRefreshableItem.ObjectSet
      If Process.PercentProcessorTime > 1 then
          checkProc = checkProc & Process.Name & _
              vbnewLine & Process.PercentProcessorTime & "%"
      End If
  Next
Next
Else
  checkProc = checkProc &  Err.Description
End If
End Function
'
EXEC hr=sp_OACreate 'ScriptControl',@script OUT
IF hr <> 0 EXEC sp_OAGetErrorInfo @script
exec hr = sp_OASetProperty @script,'Language', 'VBScript'
IF hr <> 0 EXEC sp_OAGetErrorInfo @script
EXEC hr = sp_OAMethod @script,'AddCode', null, @code
IF hr <> 0 EXEC sp_OAGetErrorInfo @script
EXEC hr = sp_OAMethod @script,'eval', @text out, 'CheckProc'
IF hr <> 0 EXEC sp_OAGetErrorInfo @script
EXEC hr=sp_OADestroy @script
IF hr <> 0 EXEC sp_OAGetErrorInfo @script
select @text as txt
22 MMF
 
28.05.10
15:03
только нужно сконфигурировать параметры безопасности сервера в sp_config
Но все это баловство
23 gr13
 
28.05.10
20:17
(21) пасип в пнд поглядим)