3、性能指标与测量方法:IOPS、吞吐量、延迟、队列深度、CPU占用率、常用测试工具及使用要点

在UFS读写性能瓶颈诊断中,第一步不是“猜哪里慢”,而是把“慢”翻译成可量化、可复现、可对比的指标。UFS作为移动端主流高速存储接口,其性能表现同时受协议层、控制器固件、NAND介质、主机驱动、文件系统、CPU调度与温度策略影响。若只凭主观感受或单一跑分判断,很容易把瓶颈归错对象。因此,本节围绕六个核心观测维度展开:IOPS、吞吐量、延迟、队列深度、CPU占用率,以及测试工具的使用要点。

一、核心指标:从“快慢”到“可测量”

IOPS(Input/Output Operations Per Second)表示每秒完成的I/O操作次数,适合衡量随机小IO场景,例如4KB随机读、随机写。吞吐量(Throughput/Bandwidth)表示单位时间内传输的数据量,常用MB/s或GB/s,适合衡量顺序大IO场景,例如视频录制、大文件拷贝。延迟(Latency)表示单个I/O从提交到完成的时间,通常关注平均延迟、P99、P999,因为平均延迟正常但尾延迟恶化时,用户仍会感到卡顿。队列深度(Queue Depth, QD)表示同时未完成的I/O请求数量,UFS支持多队列与命令队列,QD越高越能压满控制器与NAND并行度,但也可能放大延迟。CPU占用率则反映主机侧处理I/O协议栈、中断、文件系统与驱动所消耗的算力,若CPU先饱和,存储性能再高也无法发挥。

关键关系:吞吐量 ≈ IOPS × 单次I/O大小;在稳定负载下,平均延迟 ≈ 队列深度 ÷ IOPS。因此,当QD增加而IOPS不增、延迟线性上升时,说明设备已接近饱和点。

UFS性能指标测量路径与瓶颈定位 主机负载 顺序/随机 · 读写比 队列深度 QD 并发未完成I/O UFS设备 控制器 · NAND · 缓存 主机CPU 驱动 · 中断 · 调度 IOPS 随机小IO能力 4K随机读/写 吞吐量 顺序大IO能力 MB/s · GB/s 延迟 平均 · P99 · P999 尾延迟决定体验 CPU占用率 软中断 · 系统态 是否先饱和 诊断原则:固定变量,逐项扫描 QD,观察 IOPS/吞吐量/延迟/CPU 的拐点 拐点之前为线性区,拐点之后为饱和区;饱和区继续加QD只会推高延迟

二、测量方法:固定变量与扫描队列深度

性能测量最忌“一次跑一个数”。正确做法是固定I/O大小、读写比例、访问模式、文件系统与温度条件,然后逐步增加队列深度,记录IOPS、吞吐量、平均延迟、P99延迟与CPU占用率。典型扫描序列为QD1、QD2、QD4、QD8、QD16、QD32、QD64。若IOPS在QD16后不再上升,而延迟从200μs升至800μs,说明设备已进入饱和区,此时继续加QD没有收益,反而恶化用户体验。

测量时还要区分“设备级”与“系统级”。设备级测试尽量绕过文件系统缓存,直接对块设备或裸分区发起I/O;系统级测试则保留文件系统、页缓存与调度器,更接近真实应用。两者结果差异大时,瓶颈往往在文件系统或内存管理,而非UFS本身。

三、常用测试工具与使用要点

工具 适用场景 关键参数/要点
fio Linux/Android底层块设备与文件测试 rw、bs、iodepth、numjobs、direct=1、runtime、ramp_time
Iometer Windows/跨平台磁盘性能对比 关注队列深度、访问规格、CPU利用率与延迟分布
MobileBench 移动端整机存储与系统级体验 贴近真实App场景,注意温度与后台干扰
AndroBench Android UFS快速摸底 顺序/随机读写、SQLite、微基准,适合对比机型

以fio为例,一个典型的随机读扫描命令如下:

fio --name=randread \
  --filename=/dev/block/sda \
  --rw=randread --bs=4k --iodepth=32 \
  --numjobs=1 --direct=1 --runtime=60 \
  --ramp_time=10 --group_reporting \
  --output-format=json --output=ufs_qd32.json

使用要点:第一,务必设置direct=1绕过页缓存,否则测到的是内存速度;第二,ramp_time用于跳过预热阶段,避免缓存与温控初期波动;第三,numjobs与iodepth共同决定总并发,单job高QD与多job低QD对UFS调度压力不同;第四,测试前后记录温度与CPU频率,避免热降频把存储瓶颈误判为设备性能不足。

工具选择建议:研发阶段用fio做参数化扫描,定位设备饱和点;整机验收用MobileBench或AndroBench做场景化对比;跨平台对比可用Iometer。不要用单一工具的结果直接下结论。

四、案例与误区复盘

某项目反馈“UFS随机写只有8K IOPS,远低于标称”。排查发现测试命令未加direct=1,且iodepth=1,实际测的是单线程同步写,瓶颈在主机侧而非UFS。改为direct=1、iodepth=32后,IOPS升至45K,延迟仍在可接受范围。另一个案例中,QD从32加到64,IOPS几乎不变,但P99延迟翻倍,CPU软中断占用从18%升至42%,说明主机CPU先成为瓶颈,继续加QD只会让请求排队更久。

常见误区:只看平均延迟,忽略P99/P999;只跑一次就下结论;不记录温度与CPU频率;把文件系统缓存命中当成UFS性能;用顺序吞吐量评价随机小IO体验。这些都会导致瓶颈定位错误。

综上,IOPS、吞吐量、延迟、队列深度与CPU占用率不是孤立数字,而是一组相互约束的关系。测量时固定变量、扫描QD、观察拐点,再结合fio、Iometer、MobileBench等工具的场景差异,才能把“慢”准确定位到UFS设备、主机CPU、文件系统或温控策略中的具体环节。