|
как программно узнать загрузку процессора конкретным процессом ₽ | ☑ | ||
---|---|---|---|---|
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) пасип в пнд поглядим)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |