高通平台实测情况分享的第三篇。
上一篇实测了温控cpufreq,这篇继续分享实测的另一个指标UFS读写时延。
前言
存储是最容易测出误导性数字的部件:
- 同一块盘,走文件系统还是裸设备,4K 随机写能差五倍;
- 换一个块层调度器,随机读掉三分之一;
- 再过一层加密,又是一截。
两台设备跑完,最大的收获是不同的测试方法和一份能复用的基线方法。
实测的两台设备 UFS 栈同参数、同工具测试:
• 第五代骁龙8至尊版(SM8850)(Micron 512GB,UFS 4.0)。
• 高通跃龙IQ-9075 EVK(Micron 128GB,UFS 3.1)。
控制器参数从 sysfs 直读,性能用同版本 fio 3.36(libaio + direct)测,IQ-9075 与 SM8850 另有 dd 交叉验证。
我们发现第五代骁龙8至尊版平台SM8850为密闭壳内被动散热,IQ-9075 EVK 开放空气加大散热片。同一段压测代码,两种散热与功耗策略,降频行为表现不同。
测完最大的收获不在两代 UFS 的带宽差,而是:
- SM8850 上同一块盘,文件系统层和裸设备层的 4K 随机写差了五倍,顺序读反过来是文件系统层更快;
- IQ-9075 的 ext4 无加密栈,不同于骁龙移动平台的 /data 路径。
不先弄清楚 IO 经过什么,可能就没办法真正理解这些测试数字背后逻辑。这篇把 UFS 参数、IO 路径和测量方法一次讲清楚,先了解相关数字是哪条 IO 路径上测出来。
1. 控制器与盘体参数
| 项 | IQ-9075 EVK | SM8850 |
|---|---|---|
| 盘体 | Micron MT128GBCAV2U31AI | Micron MT512GAYAX4U4001 |
| UFS 规范 | 3.1(0x0310) | 4.0(0x0400) |
| 容量 | 128GB | 512GB |
| 设备队列深度 | 32 | 64 |
| host can_queue / cmd_per_lun | 31 / 31 | 63 / 31 |
| nr_hw_queues | 1 | 9 |
| 块层调度器(默认) | mq-deadline | mq-deadline |
| auto_hibern8 | 150000 us | 5000 us |
| 内核 | 6.8.0-1080-qcom | 6.17 mainline |
IQ-9075 同组参数一次读全(盘体、spec 0x0310、queue_depth 0x20、can_queue 31、nr_hw_queues 1、mq-deadline、wb_on=0):
SM8850 的盘体与 spec:
队列与链路在同一屏,can_queue 63、nr_hw_queues 9、可选调度器none [mq-deadline] kyber bfq,以及空闲时的 HS_GEAR2 / HIBERN8:
两台同为 ufshcd-qcom 驱动。SM8850 队列深度翻倍,硬件队列从 1 个变 9 个,多核并发提交 IO 不用抢一把锁。auto_hibern8 两台手机都是 5ms,IQ-9075 EVK 是 150ms。
链路状态(power_info)显示了内核代际差异:IQ-9075 EVK(6.8)和 SM8850(6.17)都有这个节点。两台都能读到,且随负载自动升降档:
| 状态 | IQ-9075 | SM8850 |
|---|---|---|
| 空闲 | HS_GEAR1 x2 | HS_GEAR2 x2 |
| 负载中 | HS_GEAR4 x2 | HS_GEAR5 x2 |
均为 FAST_MODE / HS_RATE_B。Gear5 x2 理论带宽约 5.8GB/s,Gear4 x2 约 2.9GB/s。升降档由控制器自主完成,sysfs 只读。
IO 路径是两台机器不大相同:
- IQ-9075:测试文件在
/var/tmp。ext4 直接建在 UFS 分区上,无加密层 - SM8850:同样 f2fs → dm-default-key(全盘加密,inlinecrypt 硬件内联)→ sda12,挂载参数带
background_gc=on
SM8850的 /data 过了加密层和 f2fs,IQ-9075 并没有,这个差异后面会多次出现在数据里。
2. 顺序读写
fio 1M 块、direct、QD8、time_based 20s,两台设备的参数:
| 测试 | IQ-9075(ext4) | SM8850(f2fs+加密) |
|---|---|---|
| 顺序读 | 1695 MiB/s | 4062 MiB/s |
| 顺序写(无 fsync) | 460 MiB/s | 3577 MiB/s |
同为 UFS 3.1,SK hynix 盘比 Micron 128GB 盘略快(读 1895 对 1695),两者都在 Gear4 x2 的带宽包络内。
- SM8850 的 UFS 4.0,代际差加上 512GB 大容量 NAND 的并行度优势。
- IQ-9075 上 dd 复测(1M direct)读 1.4GB/s、写 481MB/s,与 fio 相互印证;
SM8850 的顺序写数字要说明测试条件:3577 MiB/s 是不带 fsync 的持续写,数据进了 f2fs 日志缓冲和盘内 DRAM。补一组带end_fsync=1的 512MB 写,强制落盘后是1299 MiB/s,差 2.8 倍。time_based 持续写场景下缓冲会被摊平,两台设备都是无 fsync。
3. 4K 随机
fio 4K、direct、4 线程 x QD32(总深度 128)、time_based 30s。SM8450 默认调度器是 bfq:
| 测试 | IQ-9075(ext4) | SM8850(f2fs+加密) | SM8850(裸设备只读) |
|---|---|---|---|
| 随机读 | 146k IOPS | 89.1k IOPS | 118k IOPS |
| 随机写 | 99.2k IOPS | 18.7k IOPS | 未测(裸写不安全) |
调度器切到 mq-deadline 后, IO 路径IQ-9075 是 ext4 裸分区,SM8850 是 f2fs + dm 加密,文件系统层 89.1k,绕开文件系统直接读裸块设备/dev/block/sda(--readonly)回到 118k IOPS,f2fs 元数据查找加 dm-default-key 加密层吃掉约四分之一性能。
随机写两台拉不开差距:15.3-18.7k,全在 f2fs 的最差路径上。f2fs 是日志结构文件系统,4K 随机覆盖写要走新数据追加写、旧段失效、触发 background GC。SM8850 monitor 里写时延最大值 309ms 就是 GC 长尾;用 fallocate 预分配 1GB 文件再测,排除文件布局阶段,也只有 20.3k IOPS,GC 的影响坐实。IQ-9075 的 ext4 随机覆盖写是原地更新,99.2k 没有这层开销。
结论:SM8850的 /data 路径上的 4K 随机写数字主要反映 f2fs+加密+GC 的软件栈,不反映控制器能力。存储随机写的能力主要是在软件层。
裸设备顺序读还有一组值得记的数据:SM8850 裸读 1M QD8 只有 2241-2690 MiB/s(QD32 时 2970),比文件系统层的 3755-4062 低。4GB 文件复测排除了盘内缓存因素后差异仍在,f2fs 的预读和 extent_cache 在大块顺序读上是净收益,文件系统层未必比裸设备慢。小块随机和大块顺序,f2fs 的开销和收益方向相反。
4. 控制器侧时延
两台设备都开 UFS monitor(monitor_enable,重启后需重新使能):
| 指标 | IQ-9075(randrw 后) | SM8850(fs 测试后) | SM8850(裸读后) |
|---|---|---|---|
| 读时延均值 | 466 us | 120 us | 187 us |
| 读时延最大 | 18.4 ms | 4.1 ms | 45.7 ms |
| 写时延均值 | 279 us | 258 us | — |
| 写时延最大 | 56.9 ms | 309.6 ms | — |
UFS 4.0 盘体的读响应确实快:SM8850 文件系统层测试读时延均值 120us,两台 UFS 3.1 是 466/583us。写时延均值两台设备接近(258-622us)。
monitor 量的是主机控制器视角的命令完成时间,与 fio 应用层 clat(含排队)量的不是同一段时间:SM8850 fio 报的 4K 随机写 clat 均值 6647us,monitor 写均值只有 258us,QD128 下排队时间占大头。
5. 踩坑分享
fio 在SM8850上第一次都跑不起来:
shmget: Function not implemented,设备内核关了 SysV IPC(SM8850 的CONFIG_SYSVIPC is not set直接可在 /proc/config.gz 确认),fio 默认用 SysV 共享内存段存线程结构。官方 Android 构建用 bionic 的 ashmem 替代路径,交叉编译(aarch64-linux-gnu-gcc + 静态链接)走的是 glibc 路径撞上了这个坑。解法是给config-host.h手工加#define CONFIG_NO_SHM 1重编,fio 退回 malloc 分配线程段,单文件测试场景功能不受影响。
adb push的路径以/开头时,Git Bash 会把/data/local/tmp转成 Windows 路径导致 push 失败,换 PowerShell 调用或加MSYS_NO_PATHCONV=1。
Android 的 toybox dd 不支持oflag=direct,主机 Linux 和 IQ-9075 上的 dd 命令不能原样照搬,direct IO 测试统一用 fio。
SM8850(6.17)和 IQ-9075(6.8)都有。写自动化采集脚本时这个路径要按内核版本做存在性检查。
6. 参数汇总
| 项 | IQ-9075 EVK | SM8850 |
|---|---|---|
| 盘体 / 规范 | Micron 128GB / UFS 3.1 | Micron 512GB / UFS 4.0 |
| 链路(负载中) | HS_GEAR4 x2 | HS_GEAR5 x2 |
| 1M 顺序读 / 写 | 1695 / 460 MiB/s | 4062 / 3577 MiB/s |
| 4K 随机读(fs 层) | 146k IOPS | 89.1k IOPS |
| 4K 随机写(fs 层) | 99.2k IOPS | 18.7k IOPS |
| IO 路径 | ext4 裸分区 | f2fs + dm 加密 |
IQ-9075 的 4K 随机领先是 ext4 裸路径的红利,SM8850 的顺序带宽领先是 UFS 4.0 的实力。要评估控制器和盘体本身,两台设备需要走同一条 IO 路径:要么都裸设备(写有分区风险),要么都文件系统层(接受软件栈噪声),不能混着评估。