4. 性能基准测试概述
大家好。今天我们先聊点基础的——但说实话,基础的东西往往最容易被忽略。做NVMe性能测试之前,你得先搞清楚一个问题:你到底要测什么?
我在项目中遇到过不少团队,上来就跑fio,跑完拿一串数字就说“嗯,性能不错”。但你问他跑的是IOPS还是带宽?队列深度设了多少?延迟是在什么负载下测的?往往就说不清了。所以,我们先把这四个核心指标掰开揉碎讲清楚。
测试目的:不只是为了跑分
你想想看,做性能测试的根本目的是什么?是为了给老板看一个漂亮的数字吗?不是。我个人习惯把它归结为三点:
- 验证规格:厂商标的IOPS、延迟、带宽,到底能不能跑出来?
- 发现瓶颈:系统在什么负载下开始掉性能?CPU、PCIe带宽、还是盘本身?
- 制定基线:给后续的配置调优、固件升级、硬件替换提供一个可比较的起点。
说白了,测试的目的是为了让你了解系统的边界在哪里。我曾经遇到一个项目,厂商宣称盘能跑100万IOPS,结果我们在实际业务流下只跑出60万。一查,问题出在服务器PCIe lane分配上。如果没有基准测试,你根本不会知道瓶颈在哪儿。
IOPS:最熟悉的陌生人
IOPS,每秒I/O操作数。这个指标大家听得最多,但也最容易被误读。我习惯把它拆成两种场景来看:
随机IOPS:4K/8K小块随机读写,模拟数据库、OLTP这类场景。
顺序IOPS:64K/1M大块顺序访问,模拟日志写入、视频流。
嗯,这里要注意。很多人只测4K随机读就判定盘的好坏,这是片面的。你想想看,一个日志型应用需要的是大块顺序写带宽,你用4K随机去测,结果再高也说明不了问题。
我个人习惯的测试方法是:
- 先把队列深度从1拉到256,看看IOPS怎么变化。
- 如果队列深度1时的IOPS高,说明单线程性能好。
- 如果队列深度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好。你必须在同一套测试中同时记录这些指标,才能对系统性能有个全面的判断。
核心原则:测试场景必须贴近实际业务。不要跑一个纯读的测试就去判断盘的写入性能。每一种负载(随机/顺序、读/写、大块/小块)都要覆盖到。
嗯,今天就先聊这么多。这些概念虽然基础,但每次做新项目的性能评估,我都会回头再看一遍。把基础打牢,后面碰到复杂的分析才不会跑偏。