Имена экземпляров для системных счетчиков производительности локализованы? - PullRequest
3 голосов
/ 25 августа 2011

Имена счетчиков производительности в Windows локализованы, поэтому, например, счетчик \Processor(_Total)\% Processor Time называется в других языковых версиях Windows как-то иначе.Это означает, что для того, чтобы найти правильное имя, сначала нужно найти индекс счетчика, а затем использовать функцию PdhLookupPerfNameByIndex , чтобы получить локализованное имя (использование PdhAddEnglishCounter , если Windows XPдолжно поддерживаться).

Это все хорошо для частей объекта производительности (Processor) и счетчика (% Processor Time) вышеупомянутого пути счетчика, но как насчет имени экземпляра (_Total)?Я не могу найти эту строку в реестре, поэтому я предполагаю, что она предоставляется любым системным компонентом, который предоставляет информацию.

Имя экземпляра для предоставленных системой счетчиков производительности, гарантированно одинаковых для разныхязыковые версии Windows?

Если нет, то как определить, какой экземпляр соответствует экземпляру _Total?

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

Согласно этой поддержке KB , только объекты и счетчики имеют понятные имена:

Однако экземпляры не имеют понятного имени на каждом языке.

Таким образом, это заставляет меня поверить, что имена экземпляров для данного счетчика получаются либо динамически (например, ProcessId для процесса), либо статически (например, жестко закодированы).Конечно, ничто не мешает кому-то жестко запрограммировать «_Total» в английской сборке и что-то еще в немецкой сборке, хотя кажется, что обычной практикой является сохранение языковых ресурсов в реестре и работа с объектами и счетчиками с помощьюИндекс и экземпляры по динамическим или статическим именам.Я думаю, что Microsoft постоянно использует "_Total", как я видел это на нескольких инсталляциях на иностранных языках.

1 голос
/ 03 мая 2013

Люк прав. Чтобы получить локализованную версию Processor (_Total) \% Processor Time, мы должны получить локализованные имена каждого из компонентов пути «Processor» и «% Processor Time» с постоянным значением «(_Total)» , Индексы могут варьироваться в зависимости от версии ОС, поэтому вы должны обнаруживать их при каждом запуске. Модуль win32pyutil содержит методы, которые загружают карту с указанием индекса в английский, но сохраняют ее, и, поскольку она не маленькая, если она вам нужна только один раз, это может привести к потере памяти. Мы используем следующее:

def _find_pdh_counter_localized_name(eng_names,machine_name=None):
    '''
    Create a map of english names to indexes. We then lookup the english 
    name in the map to get the localized name.

    Shamefully lifted from win32pdhutil, only this one uses a transient map 
    instead of a persistent one.

    Will throw KeyError if a name is asked for that is not in the list.
    '''
    import win32api, win32con
    counter_reg_value = win32api.RegQueryValueEx(
        win32con.HKEY_PERFORMANCE_DATA, "Counter 009"
    )
    counter_list = counter_reg_value[0]
    eng_map={}
    for i in range(0, len(counter_list) - 1, 2):
        try:
            counter_id = int(counter_list[i])
        except ValueError:
            continue
        eng_map[counter_list[i+1].lower()] = counter_id
    ret = [] 

    for name in eng_names:
        ret.append(win32pdh.LookupPerfNameByIndex(
            machine_name, eng_map[name.lower()])
        )
    del eng_map
    return tuple(ret)

Для построения имени счетчика:

    names = _find_pdh_counter_localized_name(['processor','% processor time'])
    counter_name = r'\%s(_Total)\%s' % names

, что дает желаемое значение. например, "\ Processore (_Total) \% Tempo Processore" на итальянском языке.

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