服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-20 简米科技 3,399 字 8 分钟阅读

虚拟机IOPS是什么?如何提升虚拟机IOPS性能?虚拟机IOPS低怎么办?

导读虚拟机的IOPS就是每秒能完成的读写操作次数,它直接决定数据库、文件服务等应用在云主机上的响应速度,提升IOPS的核心思路是减少虚拟化层开销、优化存储链路并使用更高性能的存储介质,虚拟机的IOPS是什么理解IOPS,先忘了那些复杂的性能图表,IOPS的全称是Input/Output Operations Per……

虚拟机的IOPS就是每秒能完成的读写操作次数,它直接决定数据库、文件服务等应用在云主机上的响应速度,提升IOPS的核心思路是减少虚拟化层开销、优化存储链路并使用更高性能的存储介质。

虚拟机的IOPS是什么

理解IOPS,先忘了那些复杂的性能图表,IOPS的全称是Input/Output Operations Per Second,也就是每秒输入输出操作次数,你可以把它想象成一台虚拟机处理小任务的效率:每读写一次4KB数据就算一个操作,IOPS就是数这个操作发生的频率。

在物理机上,普通机械硬盘的随机读写能力大致是每秒一百多次,企业级SATA SSD能到数万次,NVMe盘则是几十万量级,虚拟化环境则不同,因为中间隔着一层Hypervisor来做指令翻译和资源仲裁,IOPS会有一定折损,这就是为什么同一块物理盘,跑在虚拟机里的性能总是比宿主机直连时低一些。

搞清楚三个概念的关系,比死记数字更有用:

  • IOPS衡量每秒操作的次数,重随机小数据块场景
  • 延迟衡量单次操作用时,队列排队时延迟飙升,IOPS就会塌方
  • 吞吐量衡量每秒传输的数据总量,大块连续读写场景

多数性能排查的误区在于只盯IOPS,忽略延迟和队列深度,当你看到虚拟机里的应用卡顿,先看一眼存储队列是否满负荷,再考虑换硬件。

为什么现实中的虚拟机IOPS总比预期低

买了高规格云主机,跑起来却不及标称值,这是许多运维的困惑,业内专家指出,IOPS瓶颈往往不在磁盘本身,而在你忽视的虚拟化配置细节上。

快照叠得太多

快照本质上是记录差异数据的指针链,每创建一个快照,写入路径就多一跳,快照多到几十个时,一次写请求可能要沿快照链逐个查引用,IOPS损耗相当明显,虚拟机的快照适合短期使用,长期保留几十份,性能会持续恶化。

存储池里的“坏邻居”

虚拟化集群的存储是共享池,同一块全闪阵列上,某台虚拟机凌晨跑全量备份,占用大量存储带宽,其他虚拟机的队列就开始排队,行业共识认为,共享存储上的性能相互干扰,比硬件本身的老化更常见,这是多租户环境的常态,跟买哪家云关系不大。

虚拟机IOPS是什么?如何提升虚拟机IOPS性能?虚拟机IOPS低怎么办?

驱动模式还在用模拟设备

默认创建虚拟机时,如果磁盘总线选了IDE或SATA模拟模式,每个I/O请求都要Hypervisor做一层翻译,开销相当高,换成半虚拟化驱动(如virtio)后,虚拟机直接与宿主机共享内存队列,IOPS提升不是一点半点,而是成倍增长。

提升虚拟机IOPS性能的实用路径

动手调优之前,不要拍脑袋换硬盘,先把软件链路理顺,下面这条路径适合大多数KVM和云主机场景。

先用FIO做虚拟机io性能测试

调优没有基线就是瞎调,用FIO跑一轮基准测试,记录当前的真实数字,再逐项优化后对比,测试命令很直接,在虚拟机里执行:

fio --filename=/dev/vdb1 --bs=4k --iodepth=32 --rw=randrw --numjobs=4 --runtime=60 --name=iops_test

注意几点:

  • --direct=1要加上,绕过文件系统缓存,测的是真磁盘性能
  • 随机读写和顺序读写分开测,场景不同,结果没有可比性
  • 测试文件不要落在系统盘上,用一块独立数据盘

记录测试输出里的IOPS平均值和p99延迟,作为后续对比基线。

切换virtio驱动和总线类型

虚拟机io性能测试结果出来后,如果随机读远低于预期,先检查磁盘控制器型号,以libvirt管理的KVM虚拟机为例:

  • 编辑虚拟机XML配置文件
  • 找到<disk>设备段,把<target bus='ide'/>改为<target bus='virtio'/>
  • 保存配置,重启虚拟机
  • 系统内加载virtio驱动,确认/sys/block/vdb/queue/路径存在

如果用的云平台,通常在创建实例时就有“虚拟化磁盘”或“高性能磁盘”选项,本质就是选了virtio,旧实例如果是默认IDE,迁移或重建一次,IOPS差别很大。

调整块设备队列深度和调度器

机械硬盘时代,队列深度4就够用了,NVMe时代,SSD的并行能力很强,队列深度不喂饱,IOPS就上不去,Linux虚拟机里可以临时调整:

虚拟机IOPS是什么?如何提升虚拟机IOPS性能?虚拟机IOPS低怎么办?

echo 64 > /sys/block/vdb/queue/nr_requests
echo none > /sys/block/vdb/queue/scheduler

none调度器让I/O请求直接交给硬件,减少内核调度开销,如果用的是机械硬盘阵列,mq-deadline更合适,能把随机读和顺序写混合得更好。

日志盘和数据盘分开

数据库应用最典型,事务日志是顺序写模式,数据文件是随机读写模式,两者混在同一块盘上,写日志的大块I/O会挤占随机读的队列,把日志目录移到一块高IOPS的小容量盘,数据盘专跑随机读写,整体延迟能下来一个量级。

磁盘选型与配置层面的硬规则

软件调优做到位了,瓶颈才真正回到硬件层。

SSD、NVMe还是HDD阵列

不同存储类型的IOPS差异非常大,选型需要匹配业务负载:

存储类型 随机读IOPS范围 典型延迟 适合场景
机械硬盘阵列 几百到几千 10ms级 备份归档,冷数据
SATA SSD 数万 1ms级 Web服务,常规数据库
NVMe SSD 数十万级 02ms级 OLTP数据库,高频交易

据工信部公开信息,闪存存储在国内数据中心的装机占比近年来持续上升,NVMe成为新建集群的主流选择,价格虽然仍是HDD的若干倍,但从单盘IOPS换算,单位成本的性能优势反而更高。

NUMA架构下的CPU与内存绑定位

虚拟机的IOPS骤降,还有一种隐蔽原因:CPU和内存跨NUMA节点访问,两个CPU插槽的物理机上,如果虚拟机的vCPU在节点0,内存却分配在节点1,每一次存储中断处理都要穿越总线,延迟增加,对性能敏感的生产虚拟机,开启CPU绑定的同时,把内存也锁在同一节点,常用配置如下:

  • QEMU命令行加-numa node,memdev=mem0,cpus=0-3

    虚拟机IOPS是什么?如何提升虚拟机IOPS性能?虚拟机IOPS低怎么办?

  • 云平台实例在高级设置里选“NUMA亲和”

精简置备的容量余量

精简置备在存储池空间紧张时会诱发写放大,虚拟机写入新数据,存储层要现分配空间,这个过程比直接写入慢不少,把存储池剩余容量控制在20%以上,可以明显减少这类分配开销,统计数据表明,当存储池利用率超过80%,IOPS衰减就开始变得明显。

日常监控:把部署期的性能噩梦拦在前面

调优不是一锤子买卖,虚拟机里的应用负载在变,存储池的余量也在变,养成看队列指标的习惯,胜过事后救火。

Linux虚拟机用iostat -x 1,重点看w_await和aqu-sz两列。aqu-sz长期大于2说明队列在堆积,IOPS已经到天花板,Windows虚拟机打开资源监视器,观察“平均磁盘队列长度”,数值持续超过1就要警惕。

监控图表里,IOPS突发值比平均值的参考价值更大,平均几千、突发瞬间过万,说明存储层性能不够稳,此时再好的应用也要因尖峰延迟被拖累。

Q&A:虚拟机IOPS和性能提升的常见疑问

虚拟机IOPS低怎么办

先摸底,再动手,用FIO看清当前真实IOPS和延迟,然后依次检查磁盘总线是否用了半虚拟化驱动、存储池剩余容量是否充足、快照数量是否过多、队列深度是否给小了,按这个顺序排查,相当一部分IOPS问题能自行找到症结。

怎么测试虚拟机的IOPS

推荐FIO配合--direct=1绕过缓存,模拟随机读写混合场景得到接近真实的数值,实测时注意测试时长不能太短,60秒起步,否则容易测到突发性能,得到偏高的结果,如果不方便装FIO,临时用dd看一眼顺序读写速度也可以,但做性能基准还是FIO严谨。

升级到全闪阵列一定提升IOPS吗

不一定,如果虚拟机的virtio驱动没启用,快照链又很长,全闪阵列配上烂配置照样跑不出理想数字,硬件升级之前,先把驱动、调度器和存储池配置调优,再测一轮IOPS,确认瓶颈在物理盘,再考虑花钱换阵列。

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