Как я могу получить win32pdhutil для запроса счетчика производительности с sla sh? - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь запросить Windows Счетчики производительности, используя win32pdhutil из пакета pywin32 в Python, но я сталкиваюсь с ошибкой, когда имя счетчика имеет sla sh.

Например, этот код работает нормально:

import win32pdhutil

query = win32pdhutil.GetPerformanceAttributes("Memory", "Available Bytes")

Но этот код не работает:

import win32pdhutil

query = win32pdhutil.GetPerformanceAttributes("Memory", "Cache Faults/sec")

Сообщение об ошибке:

Traceback (most recent call last):
  File "<path>\Python\Python38-32\lib\site-packages\win32\lib\win32pdhutil.py", line 61, in GetPerformanceAttributes
    type, val = win32pdh.GetFormattedCounterValue(hc, format)
pywintypes.error: (-1073738810, 'GetFormattedCounterValue', 'The data is not valid.')

I Я пробовал несколько разных счетчиков и столкнулся с этой проблемой, только когда в имени счетчика есть sla sh.

Мой оригинальный код использует win32pdh.AddCounter и win32pdh.CollectQueryData с той же проблемой, но пример выше демонстрирует это в одной строке.

Я нашел похожую тему здесь , без очевидного решения.

1 Ответ

1 голос
/ 05 марта 2020

Вам нужно подождать, пока "ошибки кеша / se c" соберет достаточно данных. Вот пример c ++ для msdn для счетчиков производительности api:

Просмотр счетчиков производительности

И в python, если я жестко запишу код (только для теста) в GetPerformanceAttributes функции в win32pdhutil.py, как показано ниже:

def GetPerformanceAttributes(object, counter, instance = None, inum=-1,
                             format = win32pdh.PDH_FMT_LONG, machine=None):
    # NOTE: Many counters require 2 samples to give accurate results,
    # including "% Processor Time" (as by definition, at any instant, a
    # thread's CPU usage is either 0 or 100).  To read counters like this,
    # you should copy this function, but keep the counter open, and call
    # CollectQueryData() each time you need to know.
    # See http://support.microsoft.com/default.aspx?scid=kb;EN-US;q262938
    # and http://msdn.microsoft.com/library/en-us/dnperfmo/html/perfmonpt2.asp
    # My older explanation for this was that the "AddCounter" process forced
    # the CPU to 100%, but the above makes more sense :)
    path = win32pdh.MakeCounterPath( (machine,object,instance, None, inum,counter) )
    hq = win32pdh.OpenQuery()
    try:
        hc = win32pdh.AddCounter(hq, path)
        try:
            win32pdh.CollectQueryData(hq)
            time.sleep(1)
            win32pdh.CollectQueryData(hq)
            type, val = win32pdh.GetFormattedCounterValue(hc, format)
            return val
        finally:
            win32pdh.RemoveCounter(hc)
    finally:
        win32pdh.CloseQuery(hq)

Тогда "Cache Faults/sec" работает для меня, вы может попытаться настроить собственную функцию m_GetFormattedCounterValue, а затем дать сборщику достаточно времени для сбора данных, как в примере выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...