Имена экземпляров для системных счетчиков производительности локализованы?
Имена счетчиков производительности в Windows локализованы, например, счетчик \Processor(_Total)\% Processor Time
что-то еще называется в других языковых версиях Windows. Это означает, что для того, чтобы найти правильное имя, нужно сначала найти индекс счетчика, а затем использовать функцию PdhLookupPerfNameByIndex, чтобы получить локализованное имя (использование PdhAddEnglishCounter отсутствует, если Windows XP должна поддерживаться).
Это все хорошо для объекта производительности (Processor
) и счетчик (% Processor Time
) части пути счетчика выше, но как насчет имени экземпляра (_Total
)? Я не могу найти эту строку в реестре, поэтому я предполагаю, что она предоставляется любым системным компонентом, который предоставляет информацию.
Гарантируется ли одинаковое имя экземпляра для предоставленных системой счетчиков производительности в разных языковых версиях Windows?
Если нет, как я могу определить, какой экземпляр соответствует _Total
пример?
2 ответа
Согласно этой поддержке KB, только объекты и счетчики имеют понятные имена:
Однако экземпляры не имеют удобного имени на каждом языке.
Таким образом, это приводит меня к мысли, что имена экземпляров для данного счетчика получаются либо динамически (например, ProcessId для процесса), либо статически (например, жестко запрограммированы). Конечно, ничто не мешает кому-то жестко запрограммировать "_Total" в английской сборке и что-то еще в немецкой сборке, хотя кажется, что обычной практикой является сохранение языкового материала в реестре и работа с объектами и счетчиками с помощью Индекс и экземпляры по динамическим или статическим именам. Я думаю, что Microsoft постоянно использует "_Total", как я видел это на нескольких инсталляциях на иностранных языках.
Люк прав. Чтобы получить локализованную версию 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" на итальянском языке.