2、UFS基础概念:UFS协议演进、物理层与链路层架构、吞吐量定义与关键指标
要做好UFS接口吞吐测试,第一步不是急着跑工具,而是把“被测对象”看清楚。UFS(Universal Flash Storage)并不是简单的“更快的eMMC”,它是一套带命令队列、全双工差分链路和分层协议栈的存储接口体系。吞吐量测试的每一个数字,最终都要落到协议层、物理层和链路层的具体行为上。本节从协议演进、分层架构和吞吐量指标三个角度,建立后续测试工作的概念底座。
一、协议演进:从eMMC到UFS,再到UFS 4.x
UFS由JEDEC制定,核心目标是解决移动与嵌入式设备对高带宽、低功耗、多任务并发的需求。它的演进可以按“代际带宽”和“协议能力”两条线理解。
- UFS 2.0/2.1:引入HS-G2(High Speed Gear 2),单通道速率约5.8 Gbps,并支持UniPro与M-PHY,奠定分层架构基础。
- UFS 3.0/3.1:升级到HS-G4,单通道约11.6 Gbps,双通道理论带宽约23.2 Gbps;引入Write Booster、DeepSleep等特性。
- UFS 4.0/4.1:采用HS-G5,单通道约23.2 Gbps,双通道理论带宽约46.4 Gbps,同时强化能效与多循环队列能力。
需要特别注意的是:理论带宽不等于实测吞吐量。协议开销、链路训练、命令处理、NAND介质本身的速度,都会让实测值低于理论值。测试工程师必须区分“链路能力”和“端到端有效吞吐”。
二、物理层与链路层架构:分层看UFS
UFS采用类似网络协议栈的分层设计,从下到上主要包括:物理层(M-PHY)、链路层(UniPro)、传输层(UTP)、命令层(UCD)以及应用层。每一层都有明确的职责,吞吐测试中出现的瓶颈,往往能定位到某一层。
从图中可以看到,数据从Host应用层一路向下封装,经过UniPro链路层和M-PHY物理层,再在Device侧逐层解封装。任何一层的流控、重传、命令排队或NAND写入延迟,都会反映到最终吞吐量上。
三、吞吐量定义与关键指标
在UFS测试中,“吞吐量”通常指单位时间内成功传输的有效数据量,常用MB/s或GB/s表示。但实际测试中需要区分多个指标,否则容易得出错误结论。
| 指标 | 含义 | 测试关注点 |
|---|---|---|
| 顺序读吞吐 | 连续大块读取的有效速率 | 反映链路与介质顺序读能力,常接近峰值 |
| 顺序写吞吐 | 连续大块写入的有效速率 | 受Write Booster、SLC缓存和GC影响明显 |
| 随机读/写IOPS | 每秒完成的随机4K读写次数 | 反映命令队列深度与并发处理能力 |
| 时延(Latency) | 单次命令从发出到完成的耗时 | 关注平均时延与P99尾时延 |
| 理论带宽 | HS-Gx × Lane数 × 编码效率 | 仅作上限参考,不能直接当实测目标 |
核心公式:有效吞吐量 = 传输数据总量 ÷ 实际耗时。测试时必须明确块大小、队列深度、读写比例、是否预热、是否开启Write Booster等条件,否则数据不可比。
四、案例与场景:为什么实测只有理论值的一半
某项目在UFS 3.1平台上测试顺序读,理论双通道HS-G4带宽约23.2 Gbps(约2.9 GB/s),但实测只有约1.4 GB/s。排查后发现:
- 测试工具默认队列深度为1,未启用命令队列并发;
- 数据块大小为4K,协议开销占比过高;
- Host侧驱动未开启高速档位,链路实际运行在HS-G3。
调整队列深度、改用128K大块、确认链路档位后,顺序读吞吐提升到约2.1 GB/s,接近该平台合理水平。这个案例说明:吞吐测试必须同时控制协议参数、链路状态和测试条件。
# 查看UFS链路当前速率档位(示例)
cat /sys/kernel/debug/ufs/health
# 关注字段:
# gear_tx = HS-G4
# gear_rx = HS-G4
# lane_tx = 2
# lane_rx = 2
# 典型吞吐测试命令(fio示例)
fio --name=seq_read --rw=read --bs=128k --iodepth=32 \
--numjobs=1 --size=2G --filename=/dev/sdb --direct=1
五、常见误区与复盘
误区一:把理论带宽当验收标准。HS-G5双通道理论值约46.4 Gbps,但实际有效吞吐受协议头、流控、NAND速度限制,通常只能达到理论值的60%~80%。
误区二:忽略测试条件一致性。不同块大小、队列深度、预热状态下的数据没有可比性,必须固定测试矩阵。
误区三:只看平均值,不看尾时延。吞吐量达标不代表体验好,P99时延过高会导致卡顿。
复盘时建议建立“链路档位—队列深度—块大小—读写比例—预热状态”五维记录表,每次测试都完整记录,才能让吞吐数据真正可复现、可对比、可定位。