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

虚拟机NVMe磁盘性能优化该怎么做,NVMe固态硬盘读写速度慢怎么解决

导读虚拟机NVMe性能差的根源不在带宽,而在队列深度、直通方式和固件三件事上,把这三样理顺,多数场景下的IOPS和延迟问题能迎刃而解,虚拟机nvme性能差?先从队列深度盘明白了队列深度的“半虚拟化”陷阱每块NVMe固态硬盘在物理机上都能支撑65536(64K)深的队列条目,但虚拟机默认使用的模拟NVMe控制器,往往……

虚拟机NVMe性能差的根源不在带宽,而在队列深度、直通方式和固件三件事上。把这三样理顺,多数场景下的IOPS和延迟问题能迎刃而解。

虚拟机nvme性能差?先从队列深度盘明白了

队列深度的“半虚拟化”陷阱

每块NVMe固态硬盘在物理机上都能支撑65536(64K)深的队列条目,但虚拟机默认使用的模拟NVMe控制器,往往只把队列深度压缩到1/8甚至更少,业内专家指出,这种设计是为了兼容老旧操作系统,却极大限制了高并发读写场景。

你可以自查一下:宿主机上跑fio,延迟轻松压到20微秒以内;同样的虚拟机,延迟却跳到300微秒开外,这不是SSD掉速,而是虚拟化层的队列被塞满了,IO请求在排队。

调整队列深度的两种具体做法

第一种:通过esxcli命令调整存储设备队列深度。

登录ESXi主机的SSH终端,执行:

esxcli storage core device list

找到你的NVMe设备ID,再执行:

esxcli storage core device set --device=<设备ID> --queue-depth=1024

这里的1024是一个相对稳妥的起点,适合多数闪存阵列,如果你用的是企业级NVMe盘,可以把数值拉到2048,但建议逐步往上试,直到出现延迟拐点。

第二种:在虚拟机参数里开启多队列支持。

新版VMware硬件版本(vHW 15及以上)默认支持NVMe控制器的多队列,你需要在虚拟机选项里添加以下参数:

nvme.AdminPollDisable = "TRUE"
nvme.IntrPollDisable = "TRUE"

这两条参数的作用是绕过传统中断处理,让虚拟机直接轮询NVMe完成队列,轮询模式在持续高负载下能显著降低CPU开销,这是虚拟机nvme性能提升最立竿见影的一步。

调整后你需要立刻验证:在虚拟机里跑一条简单命令:

nvme list

确认控制器型号后面显示的队列数量不再是1,而是多个队列。

esxi nvme直通和RDM哪种方案更适合你的场景

这是所有做虚拟化存储优化的人都会纠结的问题,直通(Passthrough)和RDM(Raw Device Mapping)代表两条完全不同的技术路线,直接决定延迟和功能性的取舍。

对比维度 NVMe直通 RDM映射 虚拟NVMe磁盘
队列深度继承 完全继承物理设备能力 受虚拟化层限制 受模拟层限制
是否支持快照 不支持 支持 支持
是否支持vMotion 不支持 支持 支持
安装复杂度 低 中等 最低
延迟表现 最接近物理机 中等 偏高

直通模式:独占带来的极致性能

如果你的宿主机是家庭实验室或者单机生产环境,不需要迁移虚拟机,直通是最优解,直通模式下,虚拟机直接接管NVMe控制器的PCIe地址,队列深度、中断亲和性、以及固件管理能力,全部由虚拟机原生驱动接管。

操作路径:ESXi主机 → 管理 → 硬件 → PCI设备 → 找到你的NVMe控制器 → 切换为直通 → 重启宿主机 → 在虚拟机设置里添加PCI设备。

直通方案的额外好处是不额外花钱,不需要单独购买企业版License,代价是这台虚拟机跟宿主机绑定了,你失去快照、克隆、高可用这类虚拟化的招牌功能。

RDM和虚拟NVMe的取舍

RDM实际是把裸盘以映射方式挂给虚拟机,ESXi层面仍然有SCSI和VMFS的协议栈开销,RDM适合的场景是要求“物理盘格式”的数据库集群环境,比如Oracle RAC的共享盘需求。

需要提醒的是:多数云平台和托管服务商默认关掉了RDM权限,采购前先问清楚,行业共识认为RDM正在被逐步边缘化,VMware官方的重心已经放到虚拟NVMe控制器上,如果你只是追求性能,不要碰RDM;如果你需要功能性,用虚拟NVMe盘,而不是回头去选上古时代的RDM。

虚拟机磁盘性能优化还要过固件和轮询两道关

NVMe固件版本比你想的更重要

很多人的虚拟机磁盘性能优化方案里,只有软件层的调优,忽略了固件,NVMe盘的固件版本直接关系到命令超时处理机制和电源管理策略。

固件版本过旧的典型症状:虚拟机在开机加载驱动时偶发卡顿,fio跑混合读写时出现锐减的IOPS低谷,dmesg里反复出现nvme_completion超时警告。

升级固件的常规路径:去硬盘厂商官网下载对应型号的固件ISO → 制作启动盘 → 在宿主机BIOS下启动升级程序,要注意的是,不要通过直通模式下的虚拟机升级固件,更新中途的掉电可能导致整个控制器变砖。

弹性场景下怎么调轮询参数

轮询模式也分激进和温和两档,你的虚拟机如果跑的是MySQL、ClickHouse这类固定延迟敏感的数据库,建议把轮询线程绑定到特定CPU核心上:

在虚拟机VMX文件里追加:

nvme.NumCPUs = "2"
nvme.SpillThrottle = "512"

第一条控制NVMe控制器可用的CPU核心数,第二条设置CPU队列的溢出阈值,这两个参数配合适当的队列深度,能让虚拟机的NVMe盘在混合负载下保持稳定的尾延迟。

如果你的虚拟机跑的是开发测试环境,轮询参数可以激进些,比如将SpillThrottle降到256,换取更低的闲置唤醒开销,生产环境不要照搬,务必压测后再落地。

压测方法不对,所有优化都白做

fio的正确打开方式

很多人拿默认参数跑一遍fio就下结论,这恰恰是问题所在,默认的fio配置往往使用单个队列和过低的iodepth,根本压不出设备的真实上限,正确做法是按你的实际业务负载,分别配置队列深度和块大小。

下面是一组fio参数模板,适用于8队列以上的虚拟NVMe环境:

fio --name=nvme_test --filename=/dev/nvme0n1 \
    --direct=1 --ioengine=libaio --iodepth=64 \
    --rw=randread --bs=4k --numjobs=8 \
    --group_reporting --time_based --runtime=300
  • iodepth=64对应队列深度的总和,翻倍设置会更有区分度
  • numjobs=8模拟多进程并发,匹配你调整后的多队列能力
  • direct=1绕过页面缓存,测的是真实设备能力

三轮压测才能下结论

第一轮用初始参数跑,记录基线和CPU占用率,第二轮把队列深度提升一倍,观察IOPS是否线性增长,第三轮把rw改为randrw,混合读写比例设为7:3,模拟实际业务混杂场景,只有经过这三个场景的对比,你才能确认优化是有效果的,还是只调了一层表面参数。

北京某银行客户的ESXi集群遇到过类似问题:调完队列深度后,单线程性能反而下降了,原因是CPU核心数不够,轮询线程抢占了业务线程的资源。压测结果必须结合CPU抢占率一起看,不要只看IOPS曲线。

如果三轮压测后,队列深度已经翻倍但IOPS没有明显变化,问题大概率不在虚拟化层,而是宿主机PCIe链路降速,在ESXi的/var/log/vmkernel.log里搜索PCIe Link,能看到降速告警记录。

Q&A: 虚拟机nvme性能优化后读写速度上不去怎么办?

先确认直通组配置在PCI设备列表里显示为“活动”,然后检查虚拟机硬件版本是否支持NVMe设备,再到虚拟机里运行nvme list查看队列数量确认是否生效,最后用fio对照三组不同iodepth的数据,找出差距所在。

pve虚拟机nvme固态性能差怎么调?

Proxmox VE的调法跟ESXi类似但更直接,新建虚拟机时磁盘总线选VirtIO Block,然后在虚拟机配置里加一行:

args: -device virtio-blk-pci,num-queues=4

这个参数能启用virtio多队列,如果PVE运行在NVMe硬盘上,记得把存储类型从Directory改成LVM-thin,否则绕不过宿主机的文件系统层。

nvme over fabric适合虚拟机环境吗?

适合,在ESXi里把NVMe-oF(NVMe over Fabric)作为存储后端,比传统的iSCSI和NFS延迟低得多,因为它走的是原生NVMe传输协议,不经过SCSI指令转换层,注意网络端到端要支持PFC流控,否则在拥塞时会出现延迟抖动。

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