eMMC 与 UFS 选型对比
接口级选型的判据、迁移代价与场景落点 —— 补齐介质选型之外的那一半决策 | 编制日期 2026-10-14 | 版本号 Rev 1.0
介质层选型已经有一份《新兴存储技术对比与选型》讲清楚了:存进NOR、NAND 还是 DRAM,参数区要不要换成 FRAM。但那只回答了一半问题。同样是 eMMC NAND 介质,装在 eMMC 接口上和装在 UFS 接口上,成本结构、功耗表现、并发能力、软件投入与供应链风险完全不同——介质一样,系统的样子不一样。
这份文档只做接口级这一个决策:什么时候该继续用 eMMC,什么时候真的需要 UFS,以及「需要 UFS」这个结论是怎么被证明的。它不重复介质层的机制讨论,也不重复 eMMC 内部架构与 UFS 协议栈的细节,只在需要用到时给出结论并指回对应文档。核心命题只有一句:接口选型不是「UFS 更快所以选 UFS」,而是「这个项目的瓶颈和约束落在哪一项上」。
结论: eMMC 与 UFS 的选型,不是一个速度比较题,而是一个约束匹配题。 把项目需求拆成六项——性能、功耗、成本、硬件设计难度、软件投入、供应链—— 逐项看谁占优、哪一项是真正的瓶颈,答案就自己出来了: 多数项目的瓶颈不在带宽上,因此多数项目的正确答案仍然是 eMMC。 只有当「多队列并发」或「高带宽」确实被主控与业务同时需要、且软件投入与供应链能兜住时,UFS 才是更合适的选择。 文中所有量级描述仅用于建立相对概念,具体数值一律以正式 datasheet、JEDEC 规范与实测为准。
读者路径
- 只想快速拿到结论:直接看第 12 章(十条结论 + 一页纸速查 + 十条误判)与附录 C(自查表),比通读全文更快。
- 正在做选型评审:第 10 章(六步选型法)+ 第 9.7 节(场景决策矩阵)是最直接的两处工具。
- 担心迁移代价:第 11 章(迁移与退路设计)+ 第 7.7 节(已有 eMMC 代码能否复用),这是决定「敢不敢选 UFS」的关键。
- 硬件与 SI 负责人:第 6 章全章(原理图与 PCB 难度)+ 第 5.3 节(PCB 成本)。
- 软件与 BSP 负责人:第 7 章全章(软件与系统集成成本)+ 第 11.2 节(迁移易错点)。
- 想理解「为什么差这么多」:第 2 章(架构差异)+ 第 3 章(带宽的三个乘数),后续所有章节都建立在这两章之上。
1. 为什么还要再做一次接口级选型
这一章不比较 eMMC 与 UFS 的好坏,只解释一件事:介质选型已经做完之后,为什么接口这一层仍然需要单独做一次决策,以及它在项目流程里到底发生在哪一步。
1.1 介质选型解决不了的问题
介质选型回答的是「数据存进哪种存储器」。它的输入输出都很明确:输入是容量、寿命、写入强度、单位成本,输出是介质类型。介质选型一旦定下来,结论通常是稳定的——需要大容量就 NAND,需要频繁改写的参数区就换一种介质。
但介质选型的输出没有回答「主控用什么方式访问这块介质」。而访问方式并不是介质的一个属性,它是独立的一个设计决策。举个具体的对照:
- 同一份系统设计,把大容量分区放在 eMMC 上、把高频小分区放在 eMMC 上,是可行的;换成大容量在 UFS、高频小分区也在 UFS,也是可行的。
- 但这两者的主控选型、原理图复杂度、PCB 层数、软件工作量、认证范围全都不同,而且这些差异往往比介质本身的差异更大。
- 更关键的是:介质选型的结论不随接口变化而变化,接口选型的结论却随约束变化而变化。介质选型是「一次定死」,接口选型是「必须随项目约束走」。
| 同样是这块 NAND,接口不同之后发生的变化 | eMMC 接口上的表现 | UFS 接口上的表现 | 对项目的影响 |
|---|---|---|---|
| 可达带宽 | 单通道串行传输,量级较低 | 多 Lane 差分叠加高 Gear 档位,量级高出一个台阶 | 决定大文件读写与多摄并发是否跟得上 |
| 并发模型 | 以单任务串行为主,CMDQ 可部分缓解 | 多队列并发,读写可并行、可乱序返回 | 决定多线程负载下是否互相排队 |
| 主控侧硬件成本 | 单路 PHY,SI 约束相对宽松 | 多 Lane 差分 PHY,阻抗与长度匹配要求高 | 决定主控选型与原理图难度 |
| 软件投入 | 命令家族精简,驱动模型清晰 | 协议栈分层多,需处理队列、流控与错误恢复 | 决定 BSP 与驱动的工时 |
| PCB 成本 | 布线密度低,层数与面积友好 | 差分对密集,需更多层数与更严格的 SI 仿真 | 决定板级成本与改板概率 |
| 可获得性与二供 | 可选料号多,普遍容易采购 | 料号集中在少数平台,可获得性需逐项确认 | 决定长期供货风险 |
| 认证与合规 | 路径成熟,资料现成 | 认证项更多,需逐项评估 | 决定量产时间与费用 |
最常见的失败模式是:介质选型讨论得很充分,接口部分只用一句「UFS 更快,用 UFS」带过。到了原理图阶段才发现 PHY 不好布线,或者到了软件阶段才发现整套驱动都要重写。接口选型不是一个可以推迟到后期决定的细节,它和介质选型是同一次决策的两个侧面——只不过大家习惯先想介质,因为介质更熟悉。
1.2 接口选型在项目里的真实位置
接口选型发生在项目流程的哪一步,直接决定了它有多少调整余地。下面的时序表按「决定的时间点」排列,越靠上的阶段改动代价越小。
| 项目阶段 | 此时关于接口能做什么决定 | 改动代价 | 为什么是这个代价 |
|---|---|---|---|
| 需求定义 | 只能提出带宽、容量、功耗的量级要求 | 几乎为零 | 此时还没有任何器件被锁定 |
| 介质选型 | 决定存储介质与容量档次 | 低 | 介质可换,同接口换料较容易 |
| 接口选型 | 决定接口类型,进而约束主控与软件架构 | 高 | 它同时锁定了主控、原理图与软件三层 |
| 主控选型 | 确认主控是否带对应控制器、是否满足并发需求 | 很高 | 换主控等于重做硬件与软件两套 |
| 原理图与 PCB | 只能在既定接口下做布线与SI 设计 | 极高 | 改接口等于改板 |
| 样机与软件调试 | 只能就现有接口做优化 | 极高 | 软件已成型,改接口等于重写驱动 |
关键结论是:接口选型必须发生在主控选型之前。而实际上它常常被放到主控选型之后,因为很多项目的起点是「先定主控,再看存储」。这种顺序在介质层面没问题,在接口层面几乎必然导致返工——主控的存储控制器是它选型时就已经定死的。
如果接口选型先行,会得到一条更严的约束链:先由业务定接口 → 再由接口定主控 → 再由主控定其余外设。这条链的好处是每一步都在做加法;反过来做,每一步都在做减法。这条顺序上的差异,是本文全部方法论的起点。
1.3 本文要回答的六个问题
接口选型要落到具体决策,需要六个问题有答案。下面六个问题对应本文第 3 章到第 8 章的六段分析,也是第 10 章六步选型法的六个步骤。
这六个问题的顺序不是随意的:性能与功耗是「想要什么」,成本与软件是「能付出什么」,供应链是「能不能长期做下去」。三个「能」是硬约束,两个「想」是偏好。在硬约束面前,偏好必须让步——这是全文贯穿的判断原则。
1.4 本文与已有文档的分工
这个系列已经有几份文档覆盖了存储的介质层与架构层。本文严格限定在接口层,不重复它们的内容。下面这张表把三层分工写清楚,也说明本文在哪些地方会引用兄弟文档的结论。
| 层次 | 回答的问题 | 代表文档 | 与本文的关系 |
|---|---|---|---|
| 介质层 | 数据存进哪种存储器:NOR / NAND / DRAM / 新兴介质 | 《新兴存储技术对比与选型》 | 本文不重复介质机制,只说明介质相同是接口比较的前提 |
| 架构层(eMMC 侧) | 器件内部怎么组织:分区模型、可靠性机制、启动链 | 《eMMC 内部架构与分区模型》 | 本文第 7.3、7.4 节引用其分区与启动结论,不复述细节 |
| 架构层(UFS 侧) | 协议栈怎么分层:UTP、UniPro、M-PHY | 《UFS 协议栈与 UniPro / M-PHY》 | 本文第 2、3、6 章引用其物理层与带宽结论,不复述细节 |
| 接口层(本文) | 主控与器件之间怎么传:选 eMMC 还是 UFS | 本文 | 本文的独占范围:成本、功耗、软件、供应链、迁移代价的横向比较 |
把这个分工说清楚之后,本文的内容边界也就清楚了:凡是「为什么 eMMC 有六个硬件分区」「为什么 UFS 的 Gear 切换要重新训练」这类问题,本文一律只给结论并指回对应章节。本文真正花力气的地方,是那些两份文档都没有覆盖的东西——把两种接口放在同一张成本表、同一张功耗表、同一张软件工作量表上逐项比较。
| 如果你的问题是…… | 应该去看 | 不要在本文里找 |
|---|---|---|
| eMMC 的硬件分区怎么划分、RPMB 怎么用 | 《eMMC 内部架构与分区模型》 | 接口层的成本与功耗对比 |
| UFS 的 UPIU 有哪几种、队列怎么排队 | 《UFS 协议栈与 UniPro / M-PHY》 | 介质层的机制讨论 |
| 参数区该不该换成 FRAM 或 MRAM | 《新兴存储技术对比与选型》 | eMMC 与 UFS 的取舍判据 |
| 我的项目该选 eMMC 还是 UFS | 本文第 10 章 + 附录 C | 具体料号的推荐与报价 |
| 为什么我的带宽没跑满 | 本文第 3.2、3.5 节 + 对应架构文档 | 具体器件的规格参数 |
1.5 一张决策全景图
最后用一张图把全文的结构交代清楚:需求进来之后,先经过四层过滤,每一层都会淘汰掉一部分方案;能活到最后的才是真正的候选。图的最后给出本文的默认立场——在约束没有被证明之前,起点应该是 eMMC。
这张图最该记住的是它的默认位置:多数项目在第③层应该落在左边的eMMC 上。右边的 UFS 需要走完一整套论证才配得上——不是因为 UFS 不好,而是因为它在多数项目的约束条件下并没有优势。
2. 回顾:eMMC 与 UFS 的架构差异
这一章只回顾两者架构上最影响选型的差异,不展开细节。所有机制层面的展开都在兄弟文档里,这里只保留做选型判断所必需的那一层结论。
2.1 物理层:单路 vs 多 Lane 差分
物理层是两者差异最大、也最直接决定硬件难度的地方。eMMC 在单路上跑一组信号,时钟与数据同向;UFS 在多条 Lane 上跑差分信号,每条 Lane 都是双向的。
- eMMC 侧:单组时钟加数据线,通常还有一组供器件使用的高速信号。设计难点集中在时序裕量上——走线长度、时钟抖动、信号完整性都要照顾,但线路数量有限,逐条可控。
- UFS 侧:多条差分对并行,每条都是双向传输,需要长度匹配与阻抗一致性控制。设计难点从「时序」扩展到「多组差分的对称性」,板级约束明显变严。
物理层的差异直接传导到 PCB:差分对数量多、需要参考平面连续、层数与面积都可能上升。第 6 章会把这些要求逐条拆开。
| 物理层维度 | eMMC | UFS | 对硬件设计的后果 |
|---|---|---|---|
| 信号类型 | 单端为主,含时钟与数据线 | 差分对,双向传输 | UFS 的等长与阻抗一致性要求更严 |
| 并行度 | 单路 | 多条 Lane 并行 | UFS 布线密度高,层数与面积约束更紧 |
| 速率提升方式 | 提高时钟频率 | 增加 Lane 数并提高 Gear 档位 | UFS 的带宽扩展路径不依赖单纯提频 |
| 训练与校准 | 初始化阶段的时序与电压校准 | 链路建立阶段的时钟恢复、均衡与失真补偿 | UFS 初始化流程更长,启动阶段失败点更多 |
| 参考时钟 | 器件提供或主控提供,按模式而定 | 由主机侧提供,需与参考源一致 | UFS 对参考源质量更敏感 |
| 信号完整性关注点 | 时序裕量、串扰 | 差分阻抗、共模噪声、串扰、损耗 | UFS 需要更完整的 SI 仿真 |
2.2 协议层:CMD 家族 vs UTP + SCSI 命令集
物理层之上,两者的协议结构完全不同。eMMC 走的是一条相对直接的路:主机发命令,器件回响应,命令语义由一组固定的命令码定义。UFS 走的是分层路线:请求被封装成统一的任务单元,经互联层传输,命令语义借用成熟的 SCSI 命令集。
对选型而言,协议层的差异意味着三件事:
- 命令数量与覆盖面:eMMC 的命令家族覆盖了从识别、配置到块读写、擦除、缓存的完整流程,命令数有限且语义固定。UFS 的命令集继承 SCSI 语义,命令类型更多,组合更灵活,但理解成本也更高。
- 错误模型的复杂度:eMMC 的错误处理围绕响应状态展开,相对线性。UFS 需要分层处理:链路层错误、协议层错误、逻辑单元级错误,每一层有不同的恢复路径与超时策略。
- 传输的封装方式:eMMC 的命令与数据直接对应;UFS 把请求、数据、响应都封装成统一格式的任务单元,由 Tag 标识并允许乱序返回。这是并发能力的来源,也是软件复杂度的来源。
| 协议层维度 | eMMC | UFS |
|---|---|---|
| 协议结构 | 命令 / 响应模型,命令码直接定义操作 | 任务单元封装 + 互联层 + SCSI 命令集 |
| 命令覆盖面 | 识别、配置、块读写、擦除、缓存、认证,命令数有限 | 读写、缓存、同步、查询、格式化,命令类型更多 |
| 任务标识 | 以命令序号跟踪执行与响应 | 以 Tag 标识任务,支持乱序返回 |
| 错误模型 | 围绕响应状态展开,路径相对线性 | 链路层、协议层、逻辑单元三级,路径分层 |
| 流控机制 | 基于响应与状态位的简单流控 | 门控、凭据与速率调节构成的完整流控 |
| 软件侧影响 | 驱动模型清晰,移植工作量小 | 协议栈分层多,需理解队列与流控 |
2.3 并发模型:单任务串行 vs 多队列并发
这是两者在架构上最本质的差异,也是本文最看重的一项。它不是「快一点」的差异,而是「能不能同时做几件事」的差异。
eMMC 的基本模型是单任务串行:主机发一条命令,等它完成,再发下一条。设备侧的 CMDQ 机制可以在一定程度上缓解这一点——它允许把命令拆成任务并入队,让多个任务在设备内部并行处理。但即便如此,主机与设备之间的交互本质上仍围绕命令与响应的往返展开。
UFS 的模型从设计目标上就支持多队列并发:请求被放进不同的队列,设备可以并行处理不同队列中的请求,并按完成顺序返回。多个读请求不再互相排队,写请求也不再阻塞读请求。
| 并发维度 | eMMC | UFS | 在什么场景下才被感知 |
|---|---|---|---|
| 基本模型 | 单任务串行:命令与响应往返 | 多队列并发:请求按队列提交 | 任何有多线程负载的系统 |
| 读写能否并行 | 受限于单任务模型,基本串行 | 读写可同时下发到不同队列 | 读写混合负载、数据库类负载 |
| 多个读能否并行 | 需借助 CMDQ 才能部分实现 | 天然支持多队列并行读 | 并发查询、小文件随机读 |
| 完成顺序 | 无 CMDQ 时按序完成;启用 CMDQ(5.1)后允许乱序返回 | 允许乱序返回 | 有超时与重试逻辑的系统 |
| 队列隔离 | 能力有限,优先级手段较少 | 可按请求源做优先级与服务质量配置 | 多业务共存、需要 QoS 保障的系统 |
| 典型收益场景 | 顺序读写、单线程负载 | 多线程随机访问、多摄并发写入 | 这一行是选型的关键判据 |
峰值带宽是一个「上限」指标,描述的是最好的情况能跑多快;而并发能力是一个「结构」指标,描述的是多个请求同时来的时候系统会怎样。对一个真实系统来说,后者更接近日常体验:一个顺序读一个大文件能跑到峰值带宽,而日常场景往往是很多小请求、读写混合、多个线程同时在动。
换句话说,如果你的负载本来就是单线程顺序读写,UFS 的并发优势你根本用不上,那你买到的只是更高的上限和一个更贵的 BOM。这是本文反复强调「瓶颈决定接口」的原因之一。
2.4 设备内部:控制器 + FTL 两者都有,差异在哪里
有一点必须澄清:eMMC 与 UFS 的器件内部都有控制器,也都有 FTL(闪存转换层)。两者都负责把逻辑块地址翻译成物理位置,都负责坏块管理、磨损均衡与 ECC,都有自己的缓存。所以「UFS 有控制器、eMMC 没有」是一个常见的错误认知。
真正需要区分的是内部资源与策略的量级:
- 缓存与并发资源:UFS 器件侧通常配置更大的缓存与更多的内部并行单元,才能配合主机侧的多队列并发把带宽跑满;eMMC 器件的内部资源相对紧凑,收益主要来自主机侧的一次发对多。
- 多逻辑单元:UFS 的一个设备可以包含多个逻辑单元,主机可以把它们当作独立的并行通道使用。eMMC 的分区模型是地址空间上的划分,不提供这种「独立并行单元」语义。
- 主机与设备的分工:两者的可靠性责任都在器件内部的 FTL 上,主机侧不需要自己管坏块与磨损均衡。这一点两者相同,是「都需要 eMMC / UFS 级别的软件栈」这一事实的根源。
| 器件内部职责 | eMMC | UFS | 说明 |
|---|---|---|---|
| 逻辑到物理地址转换 | 器件内 FTL 负责 | 器件内 FTL 负责 | 两者相同,主机侧都不需要做磨损均衡 |
| 坏块管理 | 器件内负责 | 器件内负责 | 两者相同,主机侧只看到逻辑地址 |
| ECC 与纠错 | 器件内负责 | 器件内负责 | 两者相同,错误以逻辑层结果上报 |
| 内部缓存 | 规模相对紧凑 | 规模较大,配合主机多队列 | 这是并发能力差异的一部分来源 |
| 内部并行单元 | 较少 | 较多 | 决定器件侧能否吃满主机侧并发 |
| 逻辑单元划分 | 分区是地址空间划分,无独立语义 | 多个逻辑单元,可作独立并行通道 | UFS 可以把存储拆成两条并行路径 |
| 健康度可观测性 | 有设备内部状态寄存器可读 | 有对应的健康度查询手段 | 两者都有,字段语义不同 |
2.5 差异带来的能力边界对照
把前面四节的差异汇总成一张对照图,横轴是六个选型维度,纵向是两种接口的典型表现。这张图的用途只有一个:让「UFS 更强」这句话落到具体维度上,而不是停在印象里。
2.6 本章只讲结论,细节指向兄弟文档
这一章的每个结论背后都有一份完整的展开文档。这里把「结论 → 该去哪读」列成一张索引,方便按需跳转,避免在本文里重复一遍机制细节。
| 本章的结论 | 背后的机制细节在哪一节 | 文档 |
|---|---|---|
| 物理层多 Lane 差分带来并行与布线约束 | M-PHY 的物理层构成、Lane 与 Gear、训练与校准 | 《UFS 协议栈与 UniPro / M-PHY》 |
| 带宽的三个乘数如何作用 | 带宽计算的物理基础、Gear 切换的代价 | 《UFS 协议栈与 UniPro / M-PHY》 |
| UTP 任务单元与 Tag 机制 | 任务单元模型、UPIU 种类、排队与调度 | 《UFS 协议栈与 UniPro / M-PHY》 |
| SCSI 命令集的语义差异 | 为什么用SCSI 命令集、与 CMD 家族的语义映射表 | 《UFS 协议栈与 UniPro / M-PHY》 |
| CMDQ 能部分缓解单任务串行的局限 | CMDQ 的核心思想、队列深度取舍、收益条件 | 《eMMC 内部架构与分区模型》 |
| eMMC 的分区模型与启动链 | 六类硬件区域、Boot 与 User 的地址映射 | 《eMMC 内部架构与分区模型》 |
| 两者都有器件内控制器与 FTL | 内部控制器构成、NAND 数据通路、可靠性机制 | 《eMMC 内部架构与分区模型》 |
UFS 的优势集中在并发与带宽扩展上,eMMC 的优势集中在成本、功耗、可获得性与软件成熟度上。这两组优势没有交集,所以「哪个更好」这个问题本身是错的——正确的问题是「我的约束落在哪一组优势上」。第 3 章到第 8 章,就是把这六项逐一展开。
3. 带宽与性能:量级差异从哪里来
这一章回答第一个问题:UFS 比 eMMC 快,究竟快在哪里。本章的结论是——差异来自三个可以分别计算的乘数,而不是来自「UFS 本身更快」这种笼统判断。
3.1 带宽的三个乘数
无论是哪一种接口,带宽都可以拆成三个乘数相乘:Lane 数(或通道数)× 每 Lane 的速率档位 × 能同时在途的请求数。eMMC 与 UFS 的差别,是这三个乘数分别取不同值的结果,而不是某一个「更快」的属性。
- Lane 数:eMMC 是单路,本质上只有一条通道。UFS 是多条 Lane 并行,可以按需要配置。这是最直接的扩展维度——加 Lane 比提高单Lane 速率更容易,也更省功耗。
- 速率档位:两者都有各自的档位体系。UFS 的档位称为 Gear,每一档对应一组速率参数;eMMC 也有对应的速率模式。Gear 越高,Lane 内的传输越快,但信号完整性要求也越高。
- 并发度:这是最容易被忽略、却往往最关键的一个乘数。eMMC 的基本模型是单任务串行,能同时在途的请求数很小;UFS 允许多个请求同时在途,并且可以乱序返回。
把三者放在一起看,结论就清楚了:eMMC 的并发度上限是结构性的,短期无法靠器件升级改善;UFS 的带宽上限则是一个可以在同一接口上逐档提升的量。这意味着「要不要 UFS」这个问题,很大程度上等价于「我要不要并发」。
| 乘数 | eMMC 侧的情况 | UFS 侧的情况 | 能否在项目上后期调整 |
|---|---|---|---|
| 通道数 | 单路,结构上就是一条 | 多条 Lane 并行,可配置 | 不能,取决于接口选型 |
| 速率档位 | 有速率模式,但档位数量有限 | Gear 档位体系,档位更多 | 部分可调,但需重新验证时序与 SI |
| 并发度 | 基本模型为单任务串行,CMDQ 可部分缓解 | 多队列并发,天然支持多请求在途 | 不能,是架构层面的固有差异 |
| 器件内部并行度 | 内部资源相对紧凑 | 内部缓存与并行单元规模较大 | 不能,取决于器件内部实现 |
| 有效带宽折扣 | 折扣来自协议往返与命令开销占比高 | 折扣较小,但受队列配置影响 | 可通过调优改善,但有上限 |
3.2 有效带宽与峰值带宽的差距
器件标称的是峰值带宽——在最理想的访问模式下、忽略所有开销的理论上限。业务实际拿到的是有效带宽。两者的差距来自几个固定开销:
- 协议往返开销:每一次请求都要经过封装、排队、传输、解封装的过程。请求越小,这一比例越高。
- 命令与元数据开销:即便数据本身连续传输,命令与状态仍然要单独占用通道。
- 设备内部处理:数据到了器件之后还要经过内部缓存与FTL 的处理才能落到NAND,这段延迟不算在接口带宽里。
- 主控侧处理:主控的控制器、DMA、内存带宽都是共享资源,接口带宽跑满时它们可能先成为瓶颈。
这里有一个重要的工程结论:差距的比例与请求大小强相关,小请求场景下协议开销占比急剧上升。所以用大文件顺序读写测出来的带宽,不能代表小请求随机访问场景的真实体验。
| 带宽口径 | 怎么测出来的 | 偏乐观还是偏保守 | 适合用来回答什么问题 |
|---|---|---|---|
| 峰值带宽 | 忽略协议与设备开销的理论上限 | 明显偏乐观 | 两种接口的能力天花板在哪 |
| 顺序大块带宽 | 连续大块读写,摊薄协议开销 | 偏乐观 | 拷贝类、顺序类负载的上限 |
| 随机小块带宽 | 小块随机读写,协议开销占比高 | 接近真实 | 小文件与随机访问类负载 |
| 混合负载带宽 | 读写混合、多线程并发 | 最接近真实 | 真实业务体验的近似 |
| 并发饱和带宽 | 逐步提高并发直到性能不再提升 | 偏乐观 | 接口的并发能力上限 |
几乎所有对比都会用「大文件顺序读写」的带宽来说事。问题是:大文件顺序读写恰好是两种接口差距最小、也最不需要 UFS 的场景。eMMC 在这个场景下已经能跑到它峰值的大部分,UFS 剩下的优势在总成本面前往往不值得。
反过来,小文件随机读写与多线程混合负载才是差距最大的场景,也是真正体现 UFS 价值的场景。所以看任何对比之前先问一句:这个数字是在什么访问模式下测的?测完之后再问:我的负载像不像这个模式?
3.3 小数据块场景下的实际表现
小数据块是接口差异被放大到最大的地方。原因有三层叠加:
- 协议往返的固定成本按请求计。一个请求无论带多少数据,都要完整走一遍封装、排队、响应流程。数据只有几 KB 时,这套固定流程的占比就很高。
- 并发能力决定固定成本能否被摊薄。eMMC 的单任务串行模型意味着这些固定开销无法重叠——一个请求的往返没结束,下一个请求只能等着。UFS 的多队列模型让多个请求的固定开销可以重叠。
- 队列深度决定延迟抖动。eMMC 在 CMDQ 深度不足时,队列一满就必须等待;UFS 可以通过队列配置让更多请求同时在途,抖动更小。
结果就是:在几 KB 到几十 KB 这个区间,两种接口的实际表现差距往往大于它们的峰值带宽差距。这也是第 3.1 节说「并发度比峰值带宽更关键」的实证来源。
| 访问模式 | eMMC 的表现特征 | UFS 的表现特征 | 差距的来源 |
|---|---|---|---|
| 大文件顺序读 | 接近峰值带宽 | 峰值带宽更高 | 纯速率差异,相对差距最小 |
| 大文件顺序写 | 接近峰值带宽,受写入合并影响 | 峰值带宽更高 | 纯速率差异 |
| 小块随机读 | 协议开销占比高,效率明显下降 | 多队列摊薄开销,效率保持较好 | 并发度差异,差距放大 |
| 小块随机写 | 写入合并能力有限,效率下降明显 | 可利用队列与写合并改善 | 并发度与合并策略差异 |
| 读写混合 | 读写互相等待,串行特征明显 | 读写可分队列并行 | 串行与并发的结构性差异 |
| 多线程并发 | 线程间互相排队,扩展性差 | 队列可按请求源隔离 | 队列模型差异,最本质的一项 |
3.4 顺序与随机读写的表现差异
顺序与随机这个维度值得单独讲,因为它决定了「你的负载是什么形状」这个问题的答案,而负载形状往往比峰值带宽更能决定选型。
顺序访问对接口友好:命令开销被大块数据摊薄,设备内部也能做高效的合并与预取。随机访问对接口不友好:每次访问都要独立走完整流程,而且并发能力成为唯一指望。UFS 的优势在随机访问上更大,eMMC 的劣势在随机访问上更明显。
由此可以得到一个非常实用的判据:如果你的负载以顺序为主,两种接口的体验差距有限;如果随机访问占比高,差距会被显著放大。这个判据比任何绝对带宽数字都可靠,因为它直接对应业务的访问形状。
- 顺序占比高:例如大文件拷贝、固件升级、数据批量导入、录像文件的顺序写入。这类负载下eMMC 的表现已经可用,UFS 带来的改善有限。
- 随机占比高:例如数据库类访问、小文件频繁读写、多摄照片的元数据与图片混合写入、应用启动时的大量小文件加载。这类负载下并发能力成为关键,UFS 的优势才真正兑现。
- 读写混合且并发:例如实时应用、系统更新与后台同步同时进行。这类负载下「读写能否并行」比「读能跑多快」更重要,只有 UFS 的模型能真正处理。
3.5 性能对比的三个陷阱
下面三个陷阱在实际的选型讨论里出现频率极高。它们共同的特点是:都能让人得出「UFS 性能远超 eMMC」的正确结论,但这个结论对决策毫无用处,甚至有害。
| 陷阱 | 它长什么样 | 为什么结论对决策无用 | 正确的问法 |
|---|---|---|---|
| 只看峰值带宽 | 拿两颗器件标称带宽直接比大小 | 标称是最理想模式的理论上限,忽略了负载形状的影响 | 我的负载在什么访问模式下测出来的带宽是多少 |
| 默认测试块很大 | 用几十MB 的连续读写做对比 | 大块顺序恰好是两种接口差距最小的模式 | 我的业务里随机访问占多少比例 |
| 不说明缓存状态 | 对比时未说明是否命中器件缓存与主机缓存 | 命中缓存的测试结果无法外推到冷启动与随机场景 | 这个数字是冷态还是热态,是否可复现 |
看任何对比数据之前,先确认三件事:访问模式是什么、并发深度是多少、缓存是冷是热。这三件事没说清的数字,无法支撑任何选型决策。这不是对数据来源的怀疑,而是因为带宽本身就依赖这三个条件——脱离条件谈带宽,得到的只是一个没有指向的数。
3.6 典型场景带宽需求与接口匹配
把前面几节的结论落到具体场景上,图4 给出了六类典型负载的匹配关系。这张图的用法是:先在横轴上找到自己的业务形态,再看它落在哪一档。
从图中可以看出一个规律:决定「UFS 是否有价值」的不是数据量大小,而是并发程度与随机程度。固件升级的数据量可能比多摄写入大得多,但它是纯顺序的,eMMC 完全够用;多摄写入的数据量不大,却是并发随机的,eMMC 就成了瓶颈。
3.7 一个务实的结论:性能富余不等于浪费,但也不该为峰值买单
关于「要不要买性能余量」这个问题,工程上有两种极端做法,都是错的:
- 一种是完全不买余量:按当前实测峰值刚好选型,等到负载增长或模式变化时才发现成了瓶颈,而此时改接口的代价极高。
- 另一种是为峰值买单:按器件标称峰值选型,结果业务里这个峰值永远用不到,多花的钱换来了用不上的能力。
务实的做法是按负载形状而不是按峰值选型:先确认负载是顺序还是随机、并发还是单线程、写入还是读取,然后判断这个形状落在哪个区间。落在「eMMC 足够」区间就用eMMC,即使余量不大;如果余量确实不够,也应该先考虑主控侧优化与软件侧调整,而不是立刻换接口。
UFS 的性能优势集中在并发与随机访问上,顺序大块访问上优势有限。因此性能维度上的选型判据是「你的负载形状像不像并发随机」,而不是「你的数据量大不大」。数据量大但顺序的负载,eMMC 就能满足;数据量不大但并发随机的负载,才真正需要 UFS。
4. 功耗:待机、负载与系统级影响
功耗是少数几个「差一点就翻盘」的维度——它可能让一个性能上完全够用的方案变得不可接受,也可能让一个性能不足的方案变得可以接受。这一章把功耗拆成静态、动态、系统级三层来看。
4.1 接口自身的静态与动态功耗来源
接口功耗要先分成两类看,它们的处理方式完全不同。
- 静态功耗(待机功耗):不传输数据时仍然在消耗的部分。包括接口电路的漏电、时钟电路、保持链路状态的电路、器件侧的待机电流。这一项决定了「放着不动时一天耗多少电」,对电池供电设备至关重要。
- 动态功耗(负载功耗):传输数据时的额外消耗。包括差分对驱动、时钟抖动、信号切换、器件内部的译码与 FTL 处理。这一项主要由传输速率与并发度决定。
一个关键的结构性差异是:UFS 的动态功耗天然更高,因为多条差分对同时工作、速率档位更高、内部并行单元更多。这意味着在持续大流量传输时,UFS 会显著多耗电。
但静态功耗的结论往往相反,需要单独评估:UFS 的链路在低功耗状态下需要维持或重建,这部分开销在长时间待机场景下不容忽视。两者相加才是完整答案。
| 功耗类别 | 主要来源 | eMMC 侧的倾向 | UFS 侧的倾向 | 谁更优 |
|---|---|---|---|---|
| 接口静态功耗 | 接口漏电、时钟维持、链路保持 | 接口电路简单,待机电流较低 | 链路需维持或重建,待机开销更高 | eMMC 明显占优 |
| 接口动态功耗 | 差分驱动、信号切换 | 单路驱动,总量较低 | 多 Lane 同时工作,总量较高 | eMMC 占优 |
| 器件负载功耗 | 内部译码、FTL 处理、缓存 | 内部资源较紧凑 | 内部并行单元多,耗电更高 | eMMC 占优 |
| 主机侧PHY 功耗 | 控制器、时钟树、电源域 | 单路 PHY,规模小 | 多 Lane PHY,规模大 | eMMC 占优 |
| 唤醒与链路建立开销 | 时钟恢复、均衡、训练 | 流程短,开销小 | 流程长,一次性开销明显 | eMMC 占优 |
| 主控整体功耗占比 | 接口功耗在整机中的占比 | 占比低,对整机影响小 | 占比高,可能成为整机功耗的显著项 | eMMC 占优 |
4.2 负载功耗对比与量级
在持续负载下,功耗差异的来源非常清楚:UFS 同时工作的差分对更多、速率更高、器件内部并行度更高,这三件事都直接转化为功耗。eMMC 在这一项上没有悬念地占优。
但需要提醒一个容易被忽略的反向因素:如果 eMMC 的带宽不足导致主控侧不得不做更多的软件重试、更多的缓存补偿、或者更长的等待超时,这些额外开销会以主控侧功耗的形式部分抵消掉接口侧的节省。这不是说 eMMC 会更耗电,而是提醒:功耗要在系统层面算,不能只算接口本身。这一点在第 4.5 节展开。
4.3 低功耗状态:两者的休眠机制差异
低功耗能力对便携与电池供电设备是第一优先级的约束。两者的休眠机制有结构性差异:
- 状态模型不同:eMMC 有明确的休眠与掉电状态划分,进入休眠后链路与内部电路基本静止,唤醒时从相对低的状态重新初始化。UFS 有自己的低功耗状态划分,链路在低功耗期间可能进入门控状态。
- 唤醒路径不同:eMMC 的唤醒主要靠时钟与信号恢复,流程相对短且确定。UFS 的唤醒可能需要重新建立链路——时钟恢复、均衡、失真补偿这些步骤在唤醒时可能要重做。
- 休眠期间的代价不同:休眠期间谁在耗电、耗多少,决定了「放着不动」这一段的续航。eMMC 的休眠电流通常更低。
| 低功耗维度 | eMMC | UFS | 对用户的实际影响 |
|---|---|---|---|
| 休眠状态划分 | 休眠、深度休眠、掉电等,划分清晰 | 有低功耗与门控机制,链路可能需重建 | 影响待机电流与唤醒成功率 |
| 休眠期静态电流 | 通常更低 | 链路维持或重建带来额外开销 | 直接决定「放着不动」的续航天数 |
| 唤醒流程长度 | 相对短且确定 | 可能需要重新建立链路,步骤更多 | 决定按键到可用的响应时间 |
| 唤醒失败风险 | 流程简单,风险较低 | 链路训练环节多,失败点更多 | 决定低功耗相关的调试工作量 |
| 短时vs 长时休眠策略 | 可分级,按待机时长选择 | 受链路状态约束,分级较受限 | 决定休眠策略的可设计空间 |
4.4 唤醒延迟对用户体验的影响
唤醒延迟是一个很主观但很重要的指标。技术上的差距通常不算大,真正的问题是「它是否被用户感知到」。
如果设备在待机后需要用户立刻操作(比如智能门锁、遥控器、可穿戴设备),唤醒延迟会直接进入体验指标。这时候 eMMC 的优势不只是省电,而是唤醒路径更短更确定。反过来,如果设备的交互节奏是「用户偶尔操作一次,中间间隔很长」,那么唤醒延迟即使存在也几乎无人察觉,此时功耗的绝对值更重要。
所以这一维度的判据不是技术指标,而是产品的交互节奏:交互越密集、越需要即时响应,唤醒延迟的权重越高。
4.5 系统级功耗账:接口功耗 vs 配套主控与外围开销
这是本章最重要的一节。前面几节讲的都只是接口本身,但真实项目里的功耗账要算整个链路:接口器件、接口的 PHY 控制器、时钟与电源树、以及接口选择带来的主控侧额外开销。
把这几项加在一起之后,会得到一个比「UFS 更耗电」更复杂的结论。UFS 在接口与 PHY 两项上确实更高,但它是唯一能提供并发与带宽的选项——当 eMMC 的带宽不足时,主控侧可能需要用软件重试、缓存补充或延长超时来弥补,这些额外开销同样要算进系统账。
图 5 把这套账的算法画出来:关键不是比较两个接口的功耗数字,而是比较「两条路径在完成同样工作时的总功耗」。
| 系统级功耗的组成项 | eMMC 路径下的量级倾向 | UFS 路径下的量级倾向 | 说明 |
|---|---|---|---|
| 存储器件静态功耗 | 较低 | 较高 | 接口电路规模与链路维持需求不同 |
| 存储器件动态功耗 | 较低 | 较高 | Lane 数与速率档位直接决定 |
| 主控侧控制器功耗 | 较低 | 较高 | PHY 规模差异,随主控集成度变化 |
| 时钟与电源树开销 | 较低 | 较高 | 时钟源数量与电源域数量差异 |
| 带宽不足导致的主控补偿 | 可能存在,成本不确定 | 基本不需要 | 这一项常常被漏算,是决策关键 |
| 软件层额外开销 | 可能存在(重试、超时) | 基本不需要 | 低并发时软件要做更多等待与补偿 |
4.6 电池供电场景的结论
电池供电场景的判据可以写得很直接:先算待机时长,再算负载时长,两项都要算。因为很多设备是「放着不动占绝大部分时间」,此时静态功耗的权重远高于动态功耗。
- 待机时长占绝对主导的设备(传感器节点、备用状态的终端、可穿戴设备):静态功耗权重最高,eMMC 在这一项上占优,且这个优势会随待机时间的增加而放大。
- 负载时长占比较高的设备(持续录制的终端、导航设备、在线终端):动态功耗权重上升,UFS 的额外功耗会直接体现在续航上,必须把补偿开销一并算清。
- 两类占比都不极端的设备:功耗通常不是决定性约束,此时应该回到性能与成本维度做判断。
只算接口功耗,不算主控侧与软件侧的连带开销。这个错误在两个方向上都会出现:低估eMMC 的真实代价(忘了带宽不足带来的软件补偿),以及高估 UFS 的代价(忘了它省掉了软件补偿这一项)。两条路径必须用同一套账目、同一个工作负载来比较,否则结论不可信。