系统性能计数器的实例名称是不是已本地化?

Posted

技术标签:

【中文标题】系统性能计数器的实例名称是不是已本地化?【英文标题】:Are instance names for system performance counters localized?系统性能计数器的实例名称是否已本地化? 【发布时间】:2011-08-25 07:47:23 【问题描述】:

Windows 中的性能计数器名称是本地化的,因此例如计数器 \Processor(_Total)\% Processor Time 在其他语言版本的 Windows 中被称为其他名称。这意味着为了找到正确的名称,必须首先找到计数器的索引,然后使用PdhLookupPerfNameByIndex 函数来获取本地化名称(如果应支持 Windows XP,则使用 PdhAddEnglishCounter 不可用)。

这对于上面计数器路径的性能对象 (Processor) 和计数器 (% Processor Time) 部分都很好,但是实例名称 (_Total) 呢?我在注册表中找不到这个字符串,所以我想它是由提供信息的任何系统组件提供的。

系统提供的性能计数器的实例名称是否保证在不同语言版本的 Windows 中相同?

如果不是,如何确定哪个实例对应于_Total 实例?

【问题讨论】:

【参考方案1】:

根据this support KB,只有对象和计数器有友好名称:

但是,实例在每种语言中都没有用户友好的名称。

所以这让我相信给定计数器的实例名称是动态获得的(例如进程的 ProcessId)或静态(例如硬编码)。当然,没有什么能阻止某人在英语版本中硬编码“_Total”,而在德语版本中硬编码其他东西,尽管似乎常见的做法是将语言内容限制在注册表中并通过以下方式处理对象和计数器通过动态或静态名称索引和实例。我认为微软一直使用“_Total”,因为我在一些外语安装中看到过它。

【讨论】:

【参考方案2】:

卢克是正确的。为了获得 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”。

【讨论】:

以上是关于系统性能计数器的实例名称是不是已本地化?的主要内容,如果未能解决你的问题,请参考以下文章

OMS 逻辑磁盘性能计数器不存在磁盘实例名称

PDH 性能计数器实例名称

性能计数器实例名称与进程名称

服务模型性能计数器实例名称

如何读取 Windows 性能计数器?

常见性能计数器及分析