性能基准测试概述:我们到底在测什么

大家好。今天我们先聊点基础的——但说实话,基础的东西往往最容易被忽略。做NVMe性能测试之前,你得先搞清楚一个问题:你到底要测什么?

我在项目中遇到过不少团队,上来就跑fio,跑完拿一串数字就说“嗯,性能不错”。但你问他跑的是IOPS还是带宽?队列深度设了多少?延迟是在什么负载下测的?往往就说不清了。所以,我们先把这四个核心指标掰开揉碎讲清楚。

NVMe 性能基准测试核心指标体系 NVMe 性能基准 IOPS 延迟 带宽 QoS 指标间的关系与权衡 IOPS ↑ 延迟 ↑ (高并发下平均延迟上升) 带宽 ↑ IOPS ↓ (大块顺序读场景) QoS 99% 延迟决定用户体验,而非平均值 单一指标无法反映真实性能,必须综合看待

测试目的:不只是为了跑分

你想想看,做性能测试的根本目的是什么?是为了给老板看一个漂亮的数字吗?不是。我个人习惯把它归结为三点:

  • 验证规格:厂商标的IOPS、延迟、带宽,到底能不能跑出来?
  • 发现瓶颈:系统在什么负载下开始掉性能?CPU、PCIe带宽、还是盘本身?
  • 制定基线:给后续的配置调优、固件升级、硬件替换提供一个可比较的起点。

说白了,测试的目的是为了让你了解系统的边界在哪里。我曾经遇到一个项目,厂商宣称盘能跑100万IOPS,结果我们在实际业务流下只跑出60万。一查,问题出在服务器PCIe lane分配上。如果没有基准测试,你根本不会知道瓶颈在哪儿。

IOPS:最熟悉的陌生人

IOPS,每秒I/O操作数。这个指标大家听得最多,但也最容易被误读。我习惯把它拆成两种场景来看:

随机IOPS:4K/8K小块随机读写,模拟数据库、OLTP这类场景。

顺序IOPS:64K/1M大块顺序访问,模拟日志写入、视频流。

嗯,这里要注意。很多人只测4K随机读就判定盘的好坏,这是片面的。你想想看,一个日志型应用需要的是大块顺序写带宽,你用4K随机去测,结果再高也说明不了问题。

我个人习惯的测试方法是:

  1. 先把队列深度从1拉到256,看看IOPS怎么变化。
  2. 如果队列深度1时的IOPS高,说明单线程性能好。
  3. 如果队列深度256时的IOPS还在涨,说明并发能力强。

我曾经踩过一个坑:只测了QD=1的随机读,以为盘性能差。后来把队列深度拉上去,IOPS直接翻了三倍。所以,记住一句话——IOPS必须和队列深度一起看。

延迟:快,到底有多快?

延迟,就是发一个I/O请求到拿到结果的时间。单位是微秒。NVMe盘的延迟通常在100μs以内,甚至到十几微秒级别。

实用技巧:测延迟时,一定要关注两个值——平均延迟和尾部延迟。

平均延迟告诉你“大多数请求多快”,尾部延迟(99%、99.9%分位)告诉你“最慢的请求有多慢”。

我见过一个系统,平均延迟只有50μs,但99.9%延迟飙到了5ms。这种抖动在实时交易场景下是致命的。

怎么测?我常用的方法是fio的--norandommap配合--randrepeat=0,随机读而不做地址去重,模拟真实业务下的随机访问。然后用--lat_percentiles=1输出分位延迟。

警告:千万不要只看平均延迟!NVMe的延迟分布通常是非对称的,平均值会掩盖掉那些拖后腿的“慢请求”。

带宽:能吞多少数据?

带宽,也叫吞吐量。单位MB/s或GB/s。它和IOPS的关系就像水管:IOPS是“次数”,带宽是“水量”。

以PCIe 3.0 x4为例,理论带宽是4GB/s。但实际你能跑到的带宽要扣除协议开销。我个人习惯这样判断:

  • 顺序读带宽:能跑到理论值的85%-90%就算合格。
  • 顺序写带宽:通常比读低10%-20%,因为NAND闪存的写入特性。
  • 随机读写带宽:远低于顺序,因为寻址开销大。

记得有一次,客户说他们的盘顺序读跑不到3GB/s,我一看fio参数,块大小设成了4K。你想想看,4K顺序读,就算IOPS再高,带宽也只能到几十MB/s。把块大小改成128K或1M,带宽立刻就上去了。所以,带宽测试时,块大小的选择很关键。

QoS:稳定性比峰值更重要

QoS,服务质量。在NVMe性能测试里,它通常指的是延迟的分布特性。说白了,就是你的盘在压力下能不能保持稳定。

指标 含义 典型值
平均延迟 所有请求延迟的算术平均 50-100 μs
99%延迟 99%的请求延迟低于此值 200-500 μs
99.9%延迟 99.9%的请求延迟低于此值 1-5 ms
最大延迟 最慢的一个请求延迟 10-100 ms

我为什么把QoS单独拿出来说?因为很多人在测试报告里只给平均延迟,这其实是骗自己的。我曾经遇到一个案例,盘的平均延迟只有80μs,看起来很漂亮。但把99.9%分位拉出来一看,时不时有个10ms的尖峰。查到最后,是盘的GC(垃圾回收)没做好,隔几分钟就卡一次。这种问题,只看平均值永远发现不了。

测试建议:做QoS测试时,至少跑30分钟以上,看延迟的CDF(累积分布函数)曲线。曲线越陡峭,说明延迟越集中、越稳定。

一个测试观念

讲完这四个指标,我想分享一个在项目中反复验证的认知——单一指标没有意义。IOPS高,不代表延迟低;带宽大,不代表QoS好。你必须在同一套测试中同时记录这些指标,才能对系统性能有个全面的判断。

核心原则:测试场景必须贴近实际业务。不要跑一个纯读的测试就去判断盘的写入性能。每一种负载(随机/顺序、读/写、大块/小块)都要覆盖到。

嗯,今天就先聊这么多。这些概念虽然基础,但每次做新项目的性能评估,我都会回头再看一遍。把基础打牢,后面碰到复杂的分析才不会跑偏。