我很喜欢看手机发布会,不仅爱看他们在台上自吹自擂,更爱看他们“友商”前“友商”后的互怼,娱乐性堪比三色台的经典商战片。
手机发布会最具娱乐性的当数老罗,但随着锤子手机的停摆,老罗的手机发布会恐怕已成绝唱。幸运的是,自雷军喊出”生死看淡,不服就干“的口号,小米仿佛变成粗米,火力全开地向“友商”华为往死里怼,又让沉寂一时的手机界,增添了不少娱乐看点。

最近小米的话题离不开小米10的发布,其中一个称之为UFS3.0 Turbo Write(一种Flash闪存技术)的功能被大肆宣传。小米宣称该功能比普通的UFS3.0写入效率提高将近一倍,为此还做了一个10G文件的拷贝测试,结果显示拷贝速度确实比“友商”华为快了将近一倍。

外行看热闹,内行看门道,基于职业的本能和从前相关项目的经历,我对UFS3.0 Turbo Write做了一些考证,在此和大家分享一下。
两点声明
熟悉我的人都知道,我对华为的技术是由衷的敬佩。对小米,则有浅粉转浅黑的经历。事源我曾经买过一个小米路由,使用不久后,路由自带的硬盘竟然坏掉,还导致路由器的CPU长期处于100%的负荷,几乎处于瘫痪状态。基于这个背景,文章内容或有失偏颇,实在所难免….
本文的技术分析,有一部分是源于我15年前一个相关项目的经验,由于技术日新月异,我也没有花太多时间考证这部分内容是否脱节…… 考证不严谨,这正是本公众号扯谈风格的特色之一……
一分钟扯谈课堂
要理解Turbo Write,有几个关于Flash的基础知识需要了解一下:
- 根据Flash存储介质的特性,数据写入Flash后,数据区域要先执行擦除操作,才能再次写入。由于擦除操作比写入操作慢许多,为了保证写入的效率,一般的做法是将原有的数据区域(以Block为单位)作删除标记,同时将修改后的数据在其他数据区域重新写入。这个过程称之为**“Out-of-Place Update”**。
- 当删除标记的区域达到一定程度后,需要对删除标记的区域进行擦除操作,以便让这些区域能被重新使用,这个过程叫**“Garbage Collection”**。
- Flash的存储介质擦除次数是有上限的,为了保护Flash的使用寿命,写入数据的时候,要尽量均匀地使用Flash的各个区域,从而让后续的擦除操作也能均匀分布,这个策略叫“wear-leveling"。
- 一开始,Flash的存储介质是SLC(Single-Level Cell),后来为了实现低成本大容量的Flash,先后引入了MLC(Multi-Level Cell)和TLC(Triple-Level Cell)。从命名可知,MLC和TLC的单位存储容量分别是SLC的两倍和三倍。然而,世上没有两全其美的事情,支持更大容量的存储,其实是建立在牺牲读写速度和使用寿命的基础上实现的,以下表格概括了三种介质的区别。

目前,大部分消费级移动电子产品都是使用TLC作为存储介质。
拆解UFS3.0 Turbo Write
有了以上的基础知识后,Turbo Write的技术就不难理解了。实际上,Turbo Write技术是在原来只使用TLC作为存储介质的Flash里增加一部分SLC作为存储介质。写入数据时,先将数据写入效率更高的SLC区域,当Flash空闲时,再把数据转入TLC区域。
Turbo Write本质上其实是一个缓存技术,下面的动图,很形象地解释了Turbo Write的工作机制。

看起来不错,然而,Turbo Write是一个一本万利的技术吗?我们不妨深入分析一下:
- SLC作为一个缓存的区域,它的容量必然有上限,当SLC缓冲区写满而数据还没迁移到TLC的时候,后续数据写入将会直接写到TLC,Turbo Write将会失效。
- 如果每一次写入都调用Turbo Write,那么SLC的写入/擦除次数会比普通TLC区域多,“wearing-leveling”算法将会一定程度上失效,进而加速SLC区域的损耗,最终导致整个FLASH的Turbo Write失效。
基于以上两点分析,我们尝试拆解一下小米的测试:
- 测试使用一个10G的文件,而没有使用更大的文件,可能是10G已经接近Flash的SLC容量,再大的文件,超过SLC容量之后,Turbo Write将会失效,写入的速度随之大幅下降。
- 测试使用一个10G文件,而没有使用大量小文件的写入场景(例如解压包含大量文件的压缩文件),可能和Turbo Write的调用策略有关,或许Turbo Write仅会在连续写入大数据的时候才会被触发。
七伤拳
去年年中,有一群Linux内核开发者讨论了在Linxu内核中支持UFS3.0 Turbo Write的实现方案,讨论的焦点就是在于Turbo Write的使用场景和时机。讨论的细节在这里不作转述,但有两句话我想引用一下:
sending every write request through the SLC will kill the flash
每次写入都调用Turbo Write会很容易干掉Flash…..
these flash chips are targeting mobile devices, so if it goes slow after three months or something, the mobile-device makers will not care because the reviewers will never test them for that long
这种Flash芯片主要被应用于移动设备,手机厂家并不在意手机在三个月后变慢,因为手机测评并不会持续测试一台手机这么长时间…..
可以看出,目前(准确点来说是半年前)Linux的内核开发者,对Turbo Write的使用,还是持谨慎态度,这让我想起了金庸小说里的七伤拳:
七伤拳,伤敌力强,伤己也重,每练一次,内脏便受一次损伤,“一练七伤”,“先伤己,后伤敌”。若内功不够雄厚充沛,万不可练,否则摧肝损肺,令人狂性大发,不可自制。
小米10发布前,我还是很好奇小米如何用这款产品冲击高端市场,但当看到这种测试后,我不禁要问,小米做这种测试的意义何在?打个比方,Turbo Write就像一台0-100加速性能很强的汽车,但对于日常城市驾驶来说,使用场景并不多。对于矢志立足高端市场的小米,还是执着于这种脱离实际使用场景的跑分测试,我甚是失望。
边缘回望
15年前,当时在北电做一个项目,其中一个关键点就是在不同场景使用不同的Flash写入策略。正是这个项目,让我在短短两个星期内,加薪两次,夸张点来说,这种经历恐怕在北电内前无古人,后无来者,这个故事,留待下次《边缘回望》和大家分享一下,还有其中给我带来技术上的启示。