Get-Stat查询不到datastore.totalReadLatency.average指标如何解决
VMware PowerCLI获取存储延迟指标失败排查方案
一、代码存在的已知错误
- 指标请求不全:你定义的
$stat数组仅包含两个延迟指标,但后续代码还使用了datastore.numberReadAveraged.average、datastore.numberWriteAveraged.average两个IOPS指标,未加入请求列表会导致对应值为空。 - 哈希表覆盖bug:你先初始化
$dsTab = @{}为哈希表,后续又将Get-Datastore遍历结果直接赋值给$dsTab,会直接覆盖哈希表结构,导致后续通过UUID匹配datastore名称的逻辑完全失效。
二、无法获取延迟指标的核心原因及修复方案
1. vCenter统计级别配置不足
datastore.totalReadLatency.average、datastore.totalWriteLatency.average属于统计级别3的指标,默认vCenter的统计配置仅开启级别2,不会收集这两个指标:
操作路径:vCenter Web端 → 系统管理 → 统计 → 编辑统计间隔,将对应时间区间(你查询的是过去1小时,对应「实时」间隔)的统计级别调整为3或以上,保存后等待15~30分钟待指标收集后再测试。
2. 指标名称不匹配/可用性问题
不同vCenter版本、PowerCLI版本对应的指标名可能存在差异,先执行以下命令确认当前环境VM层面支持的存储类指标:
Get-StatType -Entity (Get-VM 你的测试虚拟机名) | Where-Object {$_ -match 'latency|datastore'}
如果返回结果中没有你使用的两个指标名,说明VM层面不直接暴露该类指标,可改为从ESXi主机或者Datastore实体层面查询对应指标。
3. PowerCLI版本兼容性问题
低于12.0版本的PowerCLI对vCenter 7.0及以上版本的指标支持存在缺陷,建议先升级PowerCLI到最新稳定版:
Update-Module VMware.PowerCLI -Force
4. 账号权限不足
执行脚本的vCenter账号需要分配性能 → 读取性能指标权限,权限不足会导致Get-Stat返回的指标列表不全。
三、修正后的核心代码片段
# 修正指标定义,加入需要用到的所有指标 $stat = @( "datastore.totalReadLatency.average", "datastore.totalWriteLatency.average", "datastore.numberReadAveraged.average", "datastore.numberWriteAveraged.average" ) $vmName = "你的虚拟机名称" $entity = Get-VM -Name $vmName | Select-Object -Unique $start = (Get-Date).AddHours(-1) # 修正哈希表覆盖bug,去掉对$dsTab的二次赋值 $dsTab = @{} Get-Datastore | Where-Object {$_.Type -eq "VMFS"} | ForEach-Object { $key = $_.ExtensionData.Info.Vmfs.Uuid if(!$dsTab.ContainsKey($key)){ $dsTab.Add($key,$_.Name) } else{ Write-Host "Datastore $($_.Name) with UUID $key already in hash table" } } # 后续Get-Stat逻辑保持不变即可
内容的提问来源于stack exchange,提问作者Empty Coder
相关产品推荐
相关产品推荐

