存储性能怎么判断:从介质、IO 路径到瓶颈定位
(本文含有大量AI编辑内容)
谈存储性能,最容易陷入“背参数”:某块盘多少 IOPS,某种 RAID 写惩罚多少,NVMe 比 SATA 快多少。 但真正排查问题时,光背数字并不够。更有用的方式是建立一个简单模型:
存储性能,本质上是一个 IO 在整条路径上付出的成本总和。
这个成本可能来自介质本身,也可能来自排队、缓存、网络、校验、副本复制,甚至一次 fsync。
理解这件事,先抓住三个变量。
1. 存储性能只看三个核心变量
几乎所有存储性能指标,都可以围绕三个变量展开:
- Latency:一次 IO 往返需要多久
- Queue Depth:同时挂起多少个 IO
- Block Size:每次 IO 搬多大的数据
两个基本关系是:
IOPS ≈ 并发数 / 单次延迟
带宽 ≈ IOPS × IO 大小
所以不同场景关注点不同。
小块随机 IO,比如 4K 随机读写,主要看 IOPS 和 latency。 大块顺序 IO,比如备份、视频文件读写,主要看 带宽。 Queue Depth 提高后,IOPS 可能会上升,但排队也会让尾延迟变差,尤其是 p99 latency。
很多时候,平均延迟看起来还可以,但业务体感很差,问题就出在尾延迟上。
2. 介质差异:关键不是参数,而是物理限制
不同存储介质的性能差距,本质上来自它们的物理结构。
HDD:瓶颈是机械动作
HDD 的随机 IO 慢,不是因为协议复杂,而是因为它真的要“动”。
一次随机访问可能需要:
- 移动磁头
- 等盘片旋转到目标位置
7200 RPM 的硬盘转一圈约 8.3ms,平均要等半圈,也就是约 4.2ms,再加上寻道时间,所以一次随机 IO 常见在 8~15ms。
因此 HDD 的随机 IOPS 通常只有百级:
7200 SATA HDD:约 100 IOPS
10K SAS:约 150 IOPS
15K SAS:约 200 IOPS
记住一句话:
HDD 的随机性能是百级 IOPS,瓶颈是机械动作。
SATA SSD:里面很快,但门口较窄
SSD 没有机械寻道,随机访问能力比 HDD 强很多。普通 SATA SSD 通常可以达到几万到十万级 IOPS,延迟从几十微秒到 1ms 不等。
但它的顺序带宽通常在 500MB/s 左右。
原因不是闪存本身只能这么快,而是 SATA 6Gbps 接口的限制。理论上限约 600MB/s,实际可用更低。
可以这样理解:
SATA SSD 是里面快,但门口窄。
NVMe:为闪存重新设计的高速通道
NVMe 快,不只是因为盘快,还因为整条路径都更适合闪存:
- 走 PCIe,带宽更高
- 协议开销更低
- 支持多队列
- 更适合高并发
典型 NVMe SSD 可以达到几十万到百万级 IOPS,延迟常见在 10~100us,顺序带宽从数 GB/s 到十几 GB/s 不等。
所以不要把 NVMe 理解成“更快的 SATA SSD”。更准确地说:
NVMe 是高并发闪存通道。
3. RAID:并行带来加速,冗余带来成本
RAID 不只是“写惩罚”。它有两个面:
一面是多盘并行,能提高读性能和顺序吞吐; 另一面是镜像或校验,会增加小块随机写的成本。
常见 RAID 可以这样记:
RAID 0:只条带化,无冗余,性能好,但坏一块全坏
RAID 1:镜像,读可加速,写要写两份,容量利用率 50%
RAID 10:条带 + 镜像,读写都较好,写惩罚约 2,容量利用率 50%
RAID 5:条带 + 单校验,可坏 1 块,小随机写惩罚约 4
RAID 6:条带 + 双校验,可坏 2 块,小随机写惩罚约 6
估算小块随机写时,可以用这个公式:
随机写 IOPS ≈ 总物理 IOPS / 写惩罚
例如 8 块 10K SAS 盘,每块约 150 IOPS,总物理 IOPS 约 1200。
那么:
RAID10:1200 / 2 ≈ 600 IOPS
RAID5:1200 / 4 ≈ 300 IOPS
RAID6:1200 / 6 ≈ 200 IOPS
一句话总结:
RAID 的加速来自多盘并行,代价来自镜像和校验;读看并行,写看惩罚。
4. 缓存:它是前台柜台,不是永久仓库
缓存能让存储系统看起来很快,但要分清楚:它快的是“命中缓存”,不是后端介质真的变快了。
Page Cache、控制器缓存、Write-back Cache,都可以理解为“前台柜台”。
缓存命中时,请求不用访问后端磁盘,延迟很低。 缓存未命中时,最终还是要走到磁盘。 如果缓存里积累了大量脏页,后续集中回刷时,还可能造成突发的延迟抖动。
常见的两类 IO 是:
Buffered IO:经过操作系统 Page Cache
Direct IO:绕过 Page Cache,直接和文件系统/块设备交互
对普通应用来说,Buffered IO 很有价值:应用不用自己管理缓存,读过的数据留在 Page Cache 里,下次命中就很快。
但数据库通常已经有自己的缓存系统,比如 InnoDB Buffer Pool、PostgreSQL Shared Buffers。它们更清楚哪些是热点页、索引页、脏页,哪些数据不该污染缓存。
如果数据库再依赖 Page Cache,容易出现“双重缓存”:同一份数据同时存在于数据库缓存和操作系统缓存中,浪费内存。
更关键的是,数据库需要控制写入顺序和落盘时机,比如 WAL、redo log、checkpoint。Direct IO 可以减少 Page Cache 对缓存淘汰和回写节奏的干扰。
写缓存也有两种模式:
Write-back:写到缓存就返回,快,但需要断电保护
Write-through:真正写到后端才返回,更安全,但更慢
fsync 的含义是:不要只停在前台柜台,必须真正落到可靠介质上。
所以带 fsync 的写入通常延迟更高。很多数据库和日志系统的性能差异,背后都和同步落盘有关。
5. SSD 为什么会突然变慢?
SSD 虽然快,但它不是原地覆盖写。
一次写入背后,可能会触发:
- 垃圾回收 GC
- 磨损均衡
- 数据搬迁
- 块擦除
- 映射表更新
这些内部动作会造成写放大。
盘越满,可用空闲块越少,垃圾回收越频繁,尾延迟也越容易变差。 这也是为什么 SSD 长期高水位使用时,性能可能突然抖动。
TRIM / discard 的作用,就是告诉 SSD:哪些块已经不用了,可以提前回收。
一句话理解:
SSD 快,但它内部也要整理仓库;空间越紧,整理成本越高。
6. 网络存储:本地 IO 变成了跨机器链路
本地盘的 IO 路径相对短。 网络存储的路径要长得多:
应用
→ 客户端协议栈
→ 网络
→ 服务端
→ 元数据处理
→ 副本或纠删码
→ 后端磁盘
→ 返回确认
如果是同步复制,一次写延迟至少包括:
本地处理 + 网络 RTT + 远端写入 + ACK
所以,单盘 NVMe 很快,不代表分布式存储也一定低延迟。 网络、复制、元数据、后端盘,任何一个环节都可能成为瓶颈。
常见的数据保护方式有两类。
三副本:
写入逻辑简单
延迟相对较低
空间利用率约 33%
纠删码,比如 EC 4+2:
空间利用率约 66.7%
小 IO 写入更复杂
计算、网络、修复成本更高
可以这样记:
三副本用空间换简单,纠删码用复杂度换空间。
7. 排查存储慢:沿 IO 路径找堵点
业务说“存储慢”,不要第一反应就去看磁盘。
先问几个问题:
是读慢还是写慢?
是平均慢,还是 p99 慢?
是所有请求慢,还是部分请求慢?
是本地盘、网络、文件系统、缓存,还是后端副本慢?
如果看 Linux 的 iostat,常用指标包括:
r/s、w/s:IOPS
rkB/s、wkB/s:吞吐
await:平均等待时间
aqu-sz:队列长度
%util:设备忙碌程度
但要注意,尤其是 NVMe 场景下,%util=100% 不一定表示设备已经被打满。
它更多表示“总有 IO 在路上”,不等于“NVMe 的所有并行能力都用满了”。
判断是否真正到瓶颈,需要结合:
IOPS
latency
带宽
Queue Depth
业务请求模式
磁盘可能只是“没闲着”,不一定是“已经榨干”。
8. 最后记住这些数量级
这些不是精确参数,而是用于快速判断的记忆锚点。
单盘性能:
7200 HDD:约 100 IOPS,延迟 10ms 级
10K SAS:约 150 IOPS
15K SAS:约 200 IOPS
SATA SSD:几万到十万 IOPS,顺序带宽约 500MB/s
NVMe SSD:几十万到百万 IOPS,顺序带宽数 GB/s
RAID 小块随机写惩罚:
RAID10:约 2
RAID5:约 4
RAID6:约 6
空间利用率:
三副本:约 33%
EC 4+2:约 66.7%
总结:存储瓶颈分析,就是追踪 IO 路径上的成本
如果只记一句话,可以记这个:
看存储,就是看 IO 在哪里等待、排队、复制、校验,或真正落盘。
更实用的四步分析法是:
介质是什么?
IO 类型是什么?
路径经过哪里?
成本付在哪里?
先看底层介质,再看随机/顺序、读/写、小块/大块、同步/异步,然后沿 IO 路径找等待、排队、复制、校验、网络和落盘成本。
存储性能不是一个单点指标,而是一条路径的结果。 理解这条路径,才能真正判断性能瓶颈在哪里。