Linux 并不存在“无固定磁盘最高 IOPS 值”这一静态参数,这个数值会受到硬件性能、队列深度、IO 调度策略以及实际负载模型等因素的动态影响;iostat -dx 1 中的 r_ios/w_ios 仅表示当前时刻实际下发的请求数量,并不代表磁盘可支持的 IOPS 上限;如果出现高 %util、高 await、低 r_ios 的情况,通常说明瓶颈更可能出在并发控制或调度链路,而不是存储设备本身。

Linux 系统本身并不会直接提供“磁盘支持的最高 IOPS”这类固定指标。原因在于,它既不是驱动中预设的常量,也不是设备自带的绝对数值,而是由硬件能力、队列深度、IO 调度机制、并发模型以及业务负载特征共同决定的动态上限。也就是说,无法通过一条简单命令直接查询“这块磁盘最高能达到多少 IOPS”,真正可行的方法,是通过压力测试逐步逼近磁盘的性能极限。
iostat -x 只能查看当前实际 IOPS,不能直接判断最高 IOPS
iostat -dx 1 输出中的 r_ios 和 w_ios,表示的是“当前真实提交到设备的 IO 请求数”,属于实时监控数据,而不是磁盘能力上限。即便看到 20K IOPS,也不能说明设备已经跑满;反过来,如果只有 5K IOPS,也不代表磁盘最高只能到这个水平,很多时候可能是业务负载不够,或者被上层限制,例如文件系统锁、进程串行 IO、应用并发不足等问题卡住了。
- 高
%util+ 高await+ 低r_ios:通常表示队列已经拥堵,但请求无法高效下发,说明瓶颈更偏向并发控制、内核调度或上层链路,而非磁盘硬件本身 a vgrq-sz长期低于 8(即平均请求小于 4KB):大概率属于小块 IO 场景,此时 Linux 磁盘 IOPS 上限更多由访问延迟和队列深度决定,而不是吞吐带宽rrqm/s或wrqm/s接近 0:说明几乎没有发生请求合并,IO 模式高度随机且难以聚合,这类负载场景下存储设备更容易触及 IOPS 瓶颈
fio 是逼近磁盘最高 IOPS 的关键工具
如果想评估一块磁盘,尤其是 NVMe 或高性能 SSD,在特定 IO 模式下能支持的最高 IOPS,必须使用 fio 进行主动压测,而不是只依赖 iostat 这类被动观察工具。能否测到接近上限的结果,核心取决于参数组合是否合理:
--iodepth必须设置得足够高(如 128 或 256),否则设备队列无法充分填满,难以压出峰值 IOPS--numjobs需要与 CPU 核心数、设备多队列能力相匹配;设置过少时压力不够,设置过多又可能引入额外调度开销--bs=4k是测试随机 IOPS 的常见标准块大小;如果改成 64k,本质上更接近吞吐测试,结果就不能直接对比 IOPS--direct=1用于强制绕过 page cache,否则测到的很可能是内存缓存性能,而不是实际磁盘 IO 性能- 测试目标最好选择裸设备(如
/dev/nvme0n1)或独立分区,以减少文件系统层面对结果的干扰
典型命令:fio --name=randread --ioengine=libaio --rw=randread --bs=4k --iodepth=256 --numjobs=8 --direct=1 --runtime=30 --filename=/dev/nvme0n1 --group_reporting
硬件规格与队列深度,才决定磁盘 IOPS 上限
所谓“支持的最高 IOPS”,最终主要受以下三方面限制:
- NVMe 设备的
MQ(多队列)数量以及每个队列的深度(常见为 64/128/256),可通过lspci -vv -s $(lspci | grep NVMe | awk '{print $1}') | grep -A 10 "Queue"查看相关信息 - SSD 控制器的并行通道数以及 NAND 闪存颗粒的响应延迟;厂商标注的“500K IOPS”通常指的是 PCIe 5.0 x4、128 队列深度、4K 随机读等理想测试条件下的结果
- Linux 内核的
blk-mq配置,以及/sys/block/nvme0n1/queue/nr_requests所显示的实际队列长度;这个值有时还会被 udev 规则或云平台虚拟化层(如 AWS EBS、阿里云云盘)进一步限制
很多人在分析 Linux 磁盘最高 IOPS 时,最容易忽略的恰恰是环境层级差异:同样一块 NVMe 盘,放在 KVM 虚拟机中测得的最高 IOPS,通常只有物理机环境下的 60%~80%。原因并不复杂,virtio-blk 协议栈会引入额外延迟,同时还可能发生队列截断;如果是在容器或 Kubernetes 场景中,再叠加 overlayfs 或 hostPath 绑定,文件系统层面的额外损耗也会被一并计入。因此,判断 Linux 怎么查看支持的最高 IOPS 时,不能只盯着 fio 测试结果,更重要的是先确认:你当前测到的,究竟是裸设备、虚拟化层,还是文件系统这一层的性能上限。
