как программно узнать загрузку процессора конкретным процессом #484288


#0 by gr13
у нас есть Диспетчер задач и на закладке процессы есть список процессов. у каждого процесса есть загрузка ЦП в процентах. по какой формуле они считаются и откуда берут исходные данных? самое близкое что я нашел это 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 by NS
Берешь очень мальнький интервал времени, и замеряешь соколько процессорного времени потратил процесс за этот период. Делишь время процесса на время в интервале...
#2 by NS
timebeginperiod; t1:=PProcessInformation.KernelTime; time1:=Timegettime; Sleep; proc:=100*(PProcessInformation.KernelTime-t1)/10000/(timegettime-time1); timeendperiod;
#3 by sapphire
эх... Гера... Win32_PerfFormattedData_PerfProc_Process PercentProcessorTime
#4 by NS
Вот, нашел пример. можно еще если нужна средняя загрузка с самого начала работы процесса воспользоваться createtime. Бред, а не метод, могу привести кучу причин  почему НИКОГДА нельзя пользоваться значением PercentProcessorTime
#5 by sapphire
Приведи. :)
#6 by NS
Медленное обращение к счетчику. Показывает "среднюю температуру по больнице" - загрузку с момента запуска процесса.
#7 by sapphire
Не я конгечно верю, что 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 "у нас есть Диспетчер задач и на закладке процессы есть список процессов. у каждого процесса есть загрузка ЦП в процентах". А задача real-time не стоит. к тому же в Windows есть инструментарий, позволяющий отслеживать пиковые нагрузки и т.д.
#8 by NS
Насчет скорости - представляешь как тормозит WMI? Это средство для ленивых, и в большинстве случаев не очень корректно.
#9 by sapphire
Правда? Сама Microsoft его использует. Конечно, можно и поизголяться. Да, и как же тормозит WMI?
#10 by gr13
нормально отрабатывает, правда я пока не знаю как написать левое соединение для получения этого процента с таблицей win32_process
#11 by NS
правда. Сама майкрософт использует её в одном! приложении, и это функции именно этого приложения. WMI работает через задницу (это средства медленного получения информации), поэтому имеет очень низкую скорость. А так используется
#12 by sapphire
О Гера! google рулит:
#13 by MMF
например, или PDH API или WMI как известно, сложности в деталях, а нюансов в вопросе счетчиков производительности множество. Вариант - верный способ решить задачу не за час, а за неделю.
#14 by gr13
возможен такой вариант решения 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 by NS
В интернете несколько готовых решений именно способом
#16 by Kreont
Я таким пользуюсь: Process Explorer Copyright © 1996-2005 Mark Russinovich Sysinternals - www.sysinternals.com Все норм показывает, его полезно дома иметь) Теперь вроде и на сайте МС где то должно быть, так как купил МС весь sysinternals
#17 by gr13
у меня больше 1000 удаленных точек и ты предлагаешь, чтобы я везде его поставил?
#18 by gr13
(+17) погляжу. интеерсно что из того, что там входит в стандартную поставку вин хр?
#19 by Kreont
Потестируй у себя тот Process Explorer норм штука, работает без инсталяции, когда надо анализировать тогда и запускаешь, зачем инсталить на все. (Та и размер небольшой что б передать по нету на точку)
#20 by gr13
On Error Resume Next strComputer = "." Set objRefresher = CreateObject("WbemScripting.SWbemRefresher") Set objServicesCimv2 = GetObject("winmgmts:\" _    & strComputer & " ootcimv2") 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 by MMF
примерно так: DECLARE 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 & " ootcimv2") 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 =sp_OACreate 'ScriptControl',@script OUT IF <> 0 EXEC sp_OAGetErrorInfo @script exec = sp_OASetProperty @script,'Language', 'VBScript' IF <> 0 EXEC sp_OAGetErrorInfo @script EXEC = sp_OAMethod @script,'AddCode', null, @code IF <> 0 EXEC sp_OAGetErrorInfo @script EXEC = sp_OAMethod @script,'eval', @text out, 'CheckProc' IF <> 0 EXEC sp_OAGetErrorInfo @script EXEC =sp_OADestroy @script IF <> 0 EXEC sp_OAGetErrorInfo @script select @text as txt
#22 by MMF
только нужно сконфигурировать параметры безопасности сервера в sp_config Но все это баловство
#23 by gr13
пасип в пнд поглядим)
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С