如何通过PyVmomi的PerfManager获取ESXi服务器原始性能统计数据
嗨,作为PyVmomi新手能摸到PerfManager这一步已经很棒啦!你想获取最细粒度的存储性能统计,思路完全正确——用vim.PerformanceManager.QuerySpec指定maxSample=1确实能拿到未经聚合的原始采样数据,而不是时间范围内的汇总值。
下面给你梳理下具体的实现细节和注意点:
实现细粒度存储性能查询的关键步骤
- 锁定细粒度指标:首先要确保你选的
metricId是对应存储的细粒度指标,比如磁盘读写延迟(disk.read.latency)、IOPS(disk.numberReadAveraged.average)这类。可以通过perfManager.QueryAvailablePerfMetric()查询该ESXi主机支持的所有存储相关指标,并且指定最小的采样间隔(通常ESXi默认最小采样间隔是20秒,不同版本可能有差异)。 - 构造精准的QuerySpec:你提到的
maxSample=1是核心,它会强制只返回一个样本,也就是时间范围内最匹配的那一条原始数据。startTime和endTime建议设置成一个覆盖最小采样间隔的窄窗口(比如前后相差30秒),这样能确保抓到最近的那一次采样。 - 权限与版本兼容:要确认你的ESXi账号拥有
Performance.Modify或Performance.Read权限,同时不同ESXi版本的PerfManager参数可能略有差异,建议先通过perfManager.QueryPerfInterval()确认当前主机的所有可用采样间隔。
附上一段可参考的代码示例:
from datetime import datetime, timedelta import pyVim.connect # 假设你已经完成了ESXi主机的连接,拿到了perfManager和host对象 # (连接代码这里省略,你应该已经有这部分逻辑了) # 1. 获取存储相关的细粒度性能指标 # 先查询主机支持的最小采样间隔 perf_intervals = perfManager.QueryPerfInterval() min_interval = min(interval.samplePeriod for interval in perf_intervals) # 查询该间隔下的所有存储相关指标 available_metrics = perfManager.QueryAvailablePerfMetric( entity=host, intervalId=min_interval ) storage_metric_ids = [metric for metric in available_metrics if "disk" in metric.nameInfo.key] # 2. 设置时间窗口,获取最近30秒内的采样 end_time = datetime.now() start_time = end_time - timedelta(seconds=30) # 3. 构造查询Spec query_spec = vim.PerformanceManager.QuerySpec( maxSample=1, entity=host, metricId=storage_metric_ids, startTime=start_time, endTime=end_time ) # 4. 执行查询并解析结果 perf_results = perfManager.QueryPerf(querySpec=[query_spec]) for result in perf_results: print(f"查询到的采样时间: {result.sampleInfo[0].timestamp}") for metric_val in result.value: metric_key = metric_val.id.nameInfo.key metric_value = metric_val.value[0] # 因为maxSample=1,所以取第一个元素 print(f"存储指标 {metric_key}: {metric_value}")
如果遇到查询返回空的情况,可以检查下时间范围是否覆盖了ESXi的采样周期,或者指标是否选对了。另外,有些指标的数值需要结合unitInfo来解读(比如延迟单位是毫秒),可以通过metric_val.id.unitInfo.key查看。
内容的提问来源于stack exchange,提问作者Bruce C
相关产品推荐
相关产品推荐

