服务器磁盘IOPS是什么意思?随机读写性能与业务需求分析

选服务器硬盘时,最常见的一句话是"这盘 IOPS 多少"。有人以为容量大就够用,结果数据库上线后查询越来越慢,一查 iostat,磁盘 %util 顶到 100%、await 几十毫秒,才发现瓶颈在磁盘随机读性能上。IOPS 这个指标,直接决定了数据库、虚拟化、日志类业务能不能跑得动。

这篇文章面向运维新手和中小企业 IT,把 IOPS 讲透:它到底衡量什么、随机和顺序有什么区别、机械盘和各类 SSD 的 IOPS 大致在什么量级、延迟和 IOPS 是什么关系、怎么用 fio 实测、以及怎么根据业务判断自己需要多少 IOPS。文中数值都是经验量级,不同型号、固件、队列深度下差别很大,请以你自己实测为准。

一、IOPS 到底是什么

IOPS 是 Input/Output Operations Per Second 的缩写,中文叫"每秒输入输出操作次数",直白说就是磁盘每秒能完成多少次读写请求。注意它数的是"次数",不是"字节数"。

这一点很容易搞混,要把三个指标分清楚:

  • IOPS:每秒能处理多少次 IO 请求。适合衡量小块、随机访问的能力。
  • 吞吐量(带宽):每秒传输多少 MB。适合衡量大块、顺序访问的能力。
  • 延迟(latency):一次 IO 从发出到完成要多久,单位毫秒或微秒。

三者互相牵制。同一块盘,跑的块越小、越随机,IOPS 数字越有意义;块越大、越顺序,吞吐数字越有意义。所以看 IOPS 之前,先问自己:业务是随机小块,还是顺序大块?

二、随机读写与顺序读写

顺序读写是连续地址上的访问,比如读一个大视频文件、写日志追加。磁头/闪存可以连续处理,效率高。

随机读写是跳着地址访问,比如数据库按索引查一行、虚拟机跑多个系统的盘。机械盘要反复移动磁头,性能暴跌;SSD 虽然没有机械结构,但随机写仍受闪存颗粒和主控影响。

对比一下同一块盘在不同模式下的典型差异(经验值,仅供理解趋势):

模式 块大小 关注指标 相对表现
顺序读 大(128K~1M) 吞吐 MB/s 最高
顺序写 大 吞吐 MB/s 高
随机读 小(4K~8K) IOPS 机械盘很差,SSD 好
随机写 小 IOPS 最难,写放大严重

一个小结论:说磁盘快不快,一定要带上前提——“4K 随机读"和"1M 顺序写"是两码事。

三、不同介质的 IOPS 量级

这是最实用的部分,记住量级就能做初步选型。以下都是经验值范围,随型号、容量、队列深度、读写比例浮动:

介质 4K 随机读 IOPS(量级) 特点
机械硬盘(HDD,7200 转) 约 100~200 受转速和寻道限制,随机性能弱
SATA SSD 约几万(数万) 稳态好于 HDD,受 SATA 接口限制
NVMe SSD(企业级) 约数十万甚至更高 走 PCIe,队列深、延迟低
内存/分布式缓存 远超磁盘 极致低延迟,成本高

几个提醒:

  • HDD 的 100~200 是"能用的老盘",SSD 才是随机场景的主力。 拿 HDD 跑数据库随机读,IOPS 一上来就成瓶颈。
  • SSD 的 IOPS 随队列深度(iodepth)上升。队列浅(单线程同步 IO)时可能只发挥出几万;队列深(异步并发)时才能逼近标称值。
  • 写 IOPS 通常低于读 IOPS,尤其是消费级 SSD,写入还可能触发垃圾回收导致周期性卡顿。
  • 虚拟化环境要除以"放大系数":一台物理盘上跑多台虚机、做 RAID、做快照,都会让实际可用随机 IOPS 打折。

四、延迟与 IOPS 的关系

很多人只盯 IOPS,忽略延迟,这两者其实由"并发"连在一起。经验关系:

IOPS ≈ 并发请求数 ÷ 平均延迟

换算一下:如果单次 IO 延迟是 1 毫秒,且同时有 32 个请求在飞(并发 32),那么 IOPS 大约能到 32 ÷ 0.001 = 32000。也就是说,同样的盘,延迟越低、能挂住的并发越多,IOPS 就越高。

这解释了两个常见现象:

  • 单线程同步写很少的小文件,延迟虽然低但并发只有 1,IOPS 上不去。
  • 数据库开大连接池/异步 IO,并发上来了,IOPS 才接近盘的能力上限。

所以测磁盘时不能只测"我一秒能发多少次",还要看在目标并发下,延迟是多少。高 IOPS 但延迟也高,业务体验照样差。

五、用 fio 实测磁盘性能

fio 是磁盘压测的标配工具,能精确控制块大小、读写模式、队列深度和并发任务数。

# RHEL / CentOS / Rocky / AlmaLinux
sudo dnf install -y fio
# 老版本 CentOS 7
sudo yum install -y fio

# Debian / Ubuntu
sudo apt update && sudo apt install -y fio

常用测试:4K 随机读、4K 随机写、大块顺序读写。

# 1) 4K 随机读,队列深度 32,4 个并发任务,跑 60 秒
fio --name=randread --ioengine=libaio --direct=1 --rw=randread \
    --bs=4k --numjobs=4 --iodepth=32 --size=1G --runtime=60 \
    --time_based --group_reporting

# 2) 4K 随机写
fio --name=randwrite --ioengine=libaio --direct=1 --rw=randwrite \
    --bs=4k --numjobs=4 --iodepth=32 --size=1G --runtime=60 \
    --time_based --group_reporting

# 3) 1M 顺序读,看吞吐
fio --name=seqread --ioengine=libaio --direct=1 --rw=read \
    --bs=1M --numjobs=1 --iodepth=16 --size=2G --runtime=60 \
    --time_based --group_reporting

关键参数说明:

  • --direct=1:绕过系统页缓存,测真实磁盘。
  • --bs=4k:块大小,随机测试常用 4K。
  • --iodepth:队列深度,直接影响能压出的 IOPS。
  • --numjobs:并发任务数,乘上 iodepth 是总并发。
  • --runtime --time_based:固定时长跑,便于对比。

输出关注三行:

read: IOPS=85.2k, BW=333MiB/s        # IOPS 和带宽
  clat (usec): min=... avg=... max=...
  lat (usec): 99.00th=..., 99.99th=...  # 延迟分位数

六、业务到底需要多少 IOPS

不同业务对 IOPS 的敏感度差别极大:

业务类型 关注点 经验判断
数据库(MySQL/PostgreSQL) 4K/8K 随机读写 IOPS 最敏感,随机 IOPS 是硬指标
虚拟化宿主 随机 IOPS × 虚机数 多虚机叠加,必须留余量
网站静态资源 顺序读吞吐 更看带宽,IOPS 压力小
日志/大数据顺序写 顺序写吞吐 看连续写带宽
Redis 等内存库 平时不重,持久化时抖动 看 RDB/AOF 落盘峰值

对数据库这类业务,判断方法很直接:先估每秒的事务数和每次事务产生的随机 IO 次数,再乘冗余系数。比如每秒 500 个事务、每个事务 4 次随机 IO,就是 2000 随机 IOPS 的需求,再按峰值留 2~3 倍余量,目标盘应稳定提供 6000 以上随机 IOPS。这只是粗算,实际要结合慢查询、缓存命中率一起看。

七、%util 和 await 怎么读

用 iostat 看实时磁盘压力:

# 每秒刷新,-x 显示扩展指标
iostat -x 1

# 只看某块盘
iostat -x 1 /dev/sda

两个最常看的列:

  • %util:磁盘忙于处理 IO 的时间占比。接近 100% 说明磁盘被压满,是瓶颈的强信号。注意对 SSD 和请求排队的设备,%util 高不一定代表饱和,但持续 100% 值得警惕。
  • await:平均每次 IO 的等待加服务时间,单位毫秒。数据库类业务上,机械盘 await 十几到几十毫秒、SSD 超过几毫秒,就要查了。它包含排队时间,能反映"用户实际等多久"。

配套再看 r/s、w/s(每秒读写次数,即 IOPS)、rsec/s、wsec/s(每秒扇区数,即吞吐)。%util 高 + await 高 + IOPS 上不去,通常说明并发生效但盘已达上限;%util 高 + await 低,可能是正常高负载。

常见问题

Q1:IOPS 越高就一定越好吗?
不一定。要看业务模式。顺序大块业务看吞吐,随机小块业务才看 IOPS。买一堆高 IOPS 的盘但业务是顺序读,属于花冤枉钱。

Q2:为什么 SSD 标称几十万 IOPS,我实测只有几万?
大概率是队列深度太浅、单线程同步 IO、没开 --direct(测了页缓存)、或者块大小不对。SSD 需要足够并发才能压出高 IOPS,用 fio 加 --iodepth 和 --numjobs 再测。

Q3:云盘的 IOPS 是固定的吗?
多数云盘按容量给 IOPS 上限,容量越大配额越高,还有突发与基线之分。具体看服务商说明,别把标称上限当成稳态可用值。

Q4:%util 100% 就一定需要换盘吗?
先看 await 和业务体感。如果 %util 高但 await 低、业务正常,可能只是盘一直有活干;如果 await 明显升高、业务变慢,才是真瓶颈。

Q5:RAID 会提高还是降低 IOPS?
取决于级别。RAID 0/10 通常提升随机 IOPS(条带化);RAID 5/6 因校验计算,小随机写反而可能变差,叫"写惩罚"。数据库盘优先考虑 RAID 10。

总结

  • IOPS 是每秒 IO 次数,衡量小块随机访问能力;和吞吐、延迟是三个不同指标,看盘要先分清业务模式。
  • 随机和顺序是两码事,4K 随机读和 1M 顺序写不能用同一个数字比较。
  • 量级参考:HDD 约 100~200 IOPS,SATA SSD 数万,NVMe SSD 数十万,均为经验值,实际受队列深度和型号影响。
  • IOPS、延迟、并发三者相关:延迟越低、并发越高,越能压出高 IOPS;只高 IOPS 不看延迟同样不可用。
  • 实测用 fio 控制块大小和队列深度,观察用 iostat 的 %util 和 await;数据库看随机 IOPS,顺序业务看吞吐,按峰值留余量。