服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-11-05 简米科技 5,214 字 13 分钟阅读

虚拟机如何准确查看磁盘IOPS性能?,磁盘IOPS测试工具哪个好

导读在虚拟机里查看IOPS,最准确的方式不是只看系统自带任务管理器,而是必须结合虚拟化平台(如VMware ESXi或KVM)的底层性能计数器,并辅以专业的压测工具(如fio测磁盘IOPS)进行验证,因为虚拟机的IOPS不仅受虚拟磁盘和Guest OS驱动影响,更受宿主机存储栈的调度限制,如果你只是想知道当前虚拟机……

在虚拟机里查看IOPS,最准确的方式不是只看系统自带任务管理器,而是必须结合虚拟化平台(如VMware ESXi或KVM)的底层性能计数器,并辅以专业的压测工具(如fio测磁盘IOPS)进行验证,因为虚拟机的IOPS不仅受虚拟磁盘和Guest OS驱动影响,更受宿主机存储栈的调度限制。

如果你只是想知道当前虚拟机的磁盘负载是否快满了,那直接在系统里看性能计数器是最快的;但你要搞清楚"我这台云主机磁盘IOPS性能为啥总是跑不满",就得一层层往下查,直到宿主机物理磁盘那层为止。

Windows虚拟机磁盘IOPS性能查看方法

Windows系统在Guest OS里自带的性能监视器,是判断"虚拟机看到的IOPS高不高"的第一道利器。

任务管理器里的"性能"页签

打开任务管理器,切到"性能"页签,选中磁盘,你会看到下面的列表:

  • 活动时间:当前磁盘处理的繁忙百分比,这玩意越高说明磁盘越忙
  • 平均响应时间:每次I/O请求从发出到返回的平均耗时,单位是毫秒,这个值如果长期飙到几十毫秒以上,说明存储有瓶颈
  • 读取/写入速度:单位是MB/s,注意这只是吞吐量,不是IOPS
  • 磁盘队列长度:这个数值比较隐蔽,默认不显示,需要右键图表区域手动勾选

坦白说,任务管理器适合看个大概,不推荐用作准确的IOPS量化标准因为它看不到虚拟机磁盘具体的IOPS次数(每秒读写次数),而且它展示的指标容易让人误以为"速度慢=带宽不够",其实很多时候是延迟太大。

性能监视器:掏出系统自带IOPS计数器

真正要在Windows里看IOPS数值,要用性能监视器(perfmon)这个工具。

操作流程是:

  1. 按Win+R,输入perfmon.msc并回车
  2. 在左侧导航栏找到"性能监视器"节点
  3. 在右侧图表区域右键,选择"添加计数器"
  4. 在可用计数器列表里,展开"PhysicalDisk"或"LogicalDisk"
  5. 关键计数器有这四组:
计数器名 含义 怎么用
Disk Reads/sec 每秒读次数 计数值就是读IOPS
Disk Writes/sec 每秒写次数 计数值就是写IOPS
Disk Read Bytes/sec 每秒读字节数 除以区块大小就是读IOPS
Disk Write Bytes/sec 每秒写字节数 除以区块大小就是写IOPS

比较实用的操作技巧:把 Disk Reads/sec 和 Disk Writes/sec 两个计数器加起来,得到的就是这台Windows虚拟机在Guest OS层面看到的实际IOPS,如果磁盘区块大小是4KB,而你看的是Bytes/sec,那直接除以4096,就能算出IOPS。

不过你需要明白一个行业共识:Windows系统里看到的IOPS,是虚拟磁盘控制器(比如PVSCSI或LSI Logic SAS)提交给虚拟化层之后的表现结果,它不包含宿主机存储层的排队等待和缓存命中情况,所以说这个数值对"当前虚拟机是否卡顿"有参考意义,但对"宿主机的IOPS性能上限"没有任何说服力。

Linux虚拟机磁盘IOPS性能检测工具对比

Linux环境下查看IOPS的手段更丰富,既有被动监测的经典命令,也有主动压测的专业磁盘IOPS测试工具。

iostat:老牌命令实时输出读写次数

iostat属于sysstat工具包的一部分,安装方式在CentOS系是yum install sysstat,在Ubuntu系是apt install sysstat。

直接跑一下iostat -x 1 3,输出结果里重点看这几列:

  • r/s(read per second):每秒读次数,这就是读IOPS
  • w/s(write per second):每秒写次数,这就是写IOPS
  • rkB/s 和 wkB/s:每秒读写的吞吐量,单位是KB
  • await:平均每次I/O的等待时间(毫秒),这个数字如果高于20,用户的直观感受就是操作卡
  • %util:设备繁忙度百分比

补充一个大家常踩的坑:iostat -x里面的%util,很多刚入门的朋友把它当成"磁盘用了百分之多少",其实它表示的是设备带宽利用率即使%util到了100%,也不代表IOPS已经到顶,只能说明在这一秒内的采样周期里总有不间断的I/O在排队。

fio压测工具:主动打满磁盘测IOPS上限

被动监测工具看的是现状,想要测试磁盘的极限IOPS性能,就得靠fio这类主动压测工具,这也是在选型云主机或物理服务器时,考察磁盘IOPS性能最常用的手段。

一段典型的看裸设备随机读IOPS的命令:

fio -filename=/dev/sdb -direct=1 -iodepth 32 -thread -rw=randread \
-ioengine=libaio -bs=4k -size=2G -numjobs=1 -runtime=30 \
-group_reporting -name=random_read_test

这串参数逐项拆解一下:

  • -filename=/dev/sdb:测试的目标设备,压测前必须确认这个设备里的数据可以清空,选错了可能把系统盘干掉
  • -direct=1:绕过Page Cache直接走块设备层,这样测的是真实硬件性能,而不是内存缓存的速度
  • -iodepth 32:队列深度,模拟有32个I/O在同时排队
  • -rw=randread:随机读,想测随机写就改成randwrite
  • -bs=4k:单次I/O的数据块大小是4KB,这是OLTP数据库这类场景最常见的块大小
  • -runtime=30:测试持续30秒

fio跑完后,重点关注输出里的IOPS字段和lat (usec)延迟分布,比如这么两行:

  • read: IOPS=5870, BW=23MiB/s这表示随机读IOPS是5870左右
  • lat (usec): min=112, max=10342, avg=324.57平均延迟324微秒

另一个比较实用的测试是混合读写场景,用-rw=rw -rwmixread=70来模拟70%读、30%写的情况,这更贴近数据库这种真实业务负载。

虚拟化平台层IOPS监控与物理磁盘瓶颈确认

在虚拟机内部无论怎么查,看到的IOPS都只是Guest OS视角,虚拟机IOPS性能如果达不到预期,问题很可能出在虚拟化层。

VMware ESXi环境用esxtop看真实IOPS

如果你用的是VMware虚拟化平台,直接在Guest OS里测IOPS,那看到的数值可能虚高,原因在于VMware的虚拟SCSI控制器和宿主机缓存会做I/O合并,想看准确IOPS,SSH登录到ESXi宿主机,敲esxtop,然后按u键切到磁盘设备视图,按d键切到磁盘设备模式。

重点关注这几个字段:

  • %USED:存储设备的利用率百分比
  • CMDS/s:每秒钟下发给物理存储的命令数,这才是这个物理设备实际处理的IOPS
  • MBREAD/s 和 MBWRITE/s:每秒读写吞吐量
  • DAVG/cmd:命令在存储设备上的平均排队时间,这个如果超过50ms,那存储阵列基本属于超负荷状态

业界专家指出,绝大多数"虚拟机磁盘IOPS上不去"的原因,是宿主机上多台虚拟机争抢物理磁盘的排队配额,而不是虚拟磁盘本身配置有误,你可以在esxtop里按V键查看每台虚拟机的IOPS消耗情况,哪个VM是存储大户一目了然。

KVM平台用libvirt和块设备统计

KVM虚拟化环境下,可用virsh domstats命令直接向libvirt查询虚拟机的磁盘IO统计:

virsh domstats --block <虚拟机名称>

返回里的这几个参数对应关系如下:

  • block.0.rd.reqs:累计读请求次数
  • block.0.wr.reqs:累计写请求次数
  • block.0.rd.bytes 和 block.0.wr.bytes:累计读写字节数

用两次采样的差值除以时间间隔,计算出来的就是该虚拟机平均每秒的IOPS,因为是底层hypervisor直接读取的virtio-blk或virtio-scsi驱动力数据,这个结果的准确度比Guest OS内部看要更可信。

物理磁盘IOPS性能基准的行业参考值

分析采集到的数据时,心里要有物理设备的性能基准线,以下是行业共识的估算量级,具体数值需结合实际硬件和RAID配置来判断:

存储类型 随机读IOPS估算范围 典型延迟范围
机械硬盘(SATA 7200转) 80~180 8~15ms
机械硬盘(SAS 10000转) 120~230 5~10ms
企业级SATA SSD 15000~40000 2~1ms
NVMe SSD 200000以上 02~0.2ms

如果测出来的虚拟机IOPS远低于上表对应存储类型的量级,且虚拟机的CPU和内存没有瓶颈,那就要重点检查宿主机存储链路配置,包括RAID卡的缓存策略、存储网络(SAN/NAS)的带宽,以及是否存在"噪声邻居"抢占存储资源。

最后回到最开始的核心观点:虚拟机里查到的IOPS只是现象,用fio这类压测工具配合虚拟化平台(如VMware的esxtop或KVM的virsh domstats)逐层排查,才能定位到真正影响磁盘IOPS性能的根因。 学会在Windows性能监视器和Linux的iostat命令之间灵活切换,你就能快速判断到底是虚拟机配置的问题,还是物理存储能力的天花板。

IOPS性能分析的常见误区

  • 只关注IOPS数值,不关注延迟,同一块SSD在队列深度1时的IOPS可能只有3000,队列深度32时飙到30000,但延迟也从0.2ms涨到2ms,业务真正感知的是延迟变化,不是IOPS数字高低。
  • 忽略数据块大小对IOPS的影响,同样的磁盘,用4KB块大小测能到5000 IOPS,换1MB块大小可能只有200 IOPS,比较IOPS必须明确块大小和读写模型(顺序/随机)。
  • 以为虚拟化平台看到的IOPS和Guest OS看到的应该一致,虚拟化层会有I/O合并、缓存预读等机制,导致两者可能相差较大,部分场景下虚机内部看到的IOPS甚至高于宿主机物理磁盘的实际IOPS,这显然是因为数据落到了宿主机缓存层,还没真正写穿到底层磁盘。

Q&A模块

为什么Windows虚拟机的磁盘IOPS性能比物理机差一大截?

这是正常现象,虚拟机的I/O路径比物理机多走了好几层:Guest OS驱动 -> 虚拟化层调度 -> 宿主机存储协议栈 -> 物理磁盘,每一层都会引入额外的CPU开销和排队延迟,据行业统计数据,典型虚拟化环境下的IOPS损耗在10%到30%之间,具体取决于虚拟化平台、驱动类型(virtio或准虚拟化驱动通常比模拟设备损耗更小)以及宿主机负载情况,如果差距超过50%,应从存储缓存策略或磁盘队列深度设置两方面排查。

用fio测试云主机磁盘IOPS性能时,参数怎么选才贴近真实业务?

没有通用的标准参数组合,贴合业务场景最关键,如果是数据库场景,建议用-rw=randrw -rwmixread=70 -bs=8k -iodepth=16模拟OLTP随机读写混合负载,如果是大数据日志采集场景,顺序写才是重点,用-rw=write -bs=128k -iodepth=32,在公有云的环境里测试,有个需要留意的细节:云计算厂商通常会对单盘IOPS设有配额上限,比如简米云和酷番云的ESSD系列都有明确的IOPS规格说明,如果你的测试结果稳定在配额上限附近,那就说明云盘性能已经打满了,别怀疑是宿主机不稳定。

虚拟机磁盘IOPS性能瓶颈在宿主机还是虚拟机本身?

逐层排除法最有效率,先在虚拟机内用fio跑一轮,记录IOPS和延迟;再在宿主机上用底层工具(VMware用esxtop,KVM用iostat)测物理磁盘的IOPS,如果宿主机物理磁盘的IOPS接近其规格上限,说明瓶颈在物理存储层,这时候调整虚拟机队列深度或更换更高规格的存储设备是唯一出路;如果宿主机磁盘还有大量余量,但虚拟机内IOPS就是上不去,优先检查虚拟机的虚拟SCSI控制器类型是否过旧、是否开启写缓存,以及vCPU的调度是否为存储I/O中断预留了足够算力。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱