UFS简介
UFS(Universal Flash Storage, 通用闪存存储)协议是JEDEC为移动存储设备制定的通讯接口协议,业界通常将基于UFS协议的移动存储产品称为UFS设备。UFS设备广泛应用于智能手机、平板电脑、VR(虚拟现实)设备、AR(增强现实)设备、无人机、3D游戏、监控系统、PDA、数字记录器、MP3播放器、电子玩具等领域。
UFS是eMMC的替代者,它提供比eMMC更高的性能和能效比。图1是eMMC和各代UFS的性能数据对比。
图 1:eMMC和UFS最大带宽
从图1可以看到,最新UFS 4.0的最大带宽可达到4GB/s以上,是eMMC最大带宽的10倍有余。目前eMMC已停止演进,而UFS正在慢慢取代eMMC。
UFS经历几次迭代,目前最新版本是UFS 4.0(2022年8月发布)。从图1可以看到,每一次迭代,UFS性能都是在前一代的基础上翻倍。UFS 4.0也不例外,它在UFS 3.0/3.1的基础上性能翻倍,最大带宽达到4GB/s以上。除此之外,UFS 4.0在UFS 3.0/3.1的基础上,引入了一些新的特性,比如引入Barrier命令、高级RPMB、FBO等。今天我们将重点解读FBO特性。
FBO,全称为File Based Optimization,基于文件的优化,顾名思义,它是基于文件来做性能优化。在继续FBO介绍之前,首先交代一下背景知识,了解什么是文件的逻辑碎片和物理碎片。
文件的逻辑碎片和物理碎片
对于一个文件来说,文件系统会为其分配若干个逻辑块(Logical Block,用LBA寻址)用于存储文件数据。当文件系统在为一个文件分配逻辑块时,会尽量为其分配连续的逻辑块,但如果分配不到所需的连续逻辑块,则会分配不连续的块。
图 2:一个文件分配逻辑块的两个场景
在这里,我们把LBA连续简称为“逻辑连续”。图2场景1为“逻辑连续”,场景2则为“逻辑不连续”。一个文件的LBA如果“逻辑不连续”,通俗来讲就是这个文件存在逻辑碎片化——该文件的LBA越离散,则表示其逻辑碎片化程度越高。
文件数据最终都是要存储在存储设备上,即这些逻辑块(不管连续还是不连续)都是要写到存储设备的闪存物理块上去。在设备端,如果没有其它写入命令插入,存储设备会把上述文件数据写入到连续的闪存空间里。
如图3所示:
图 3:存储设备把文件数据写入到连续的闪存空间
我们把文件的数据在闪存空间连续写入的场景称之为“物理连续”。
但主机端在写入上述文件的时候,可能会混杂着其它的写入,比如该文件元数据的写入,或者其它文件数据的写入,设备端按接收到的写命令依次接收写入数据,由于各种数据的穿插写入,就可能导致上述文件的数据不是被连续写到闪存空间。
如图4所示:
图 4:存储设备把文件数据写入到不连续的闪存空间
我们把文件数据在闪存空间不是连续写入的场景称之为“物理不连续”,通俗来讲就是文件存在物理碎片化——一个文件的数据在闪存空间存储越分散,则表示其物理碎片化程度越高。
值得一提的是,即使文件刚开始写入到闪存是连续的,但由于后续存储设备内部的一些操作,比如垃圾回收,也有可能导致文件数据最后存储在闪存空间的位置不是连续的。
文件碎片化对性能的影响
对存储设备(比如UFS设备)来说,由于一个LBA的数据可能存储在闪存的任意一个物理位置,因此存储设备需要维护一张逻辑地址到物理地址的映射关系表,即L2P映射表。L2P映射表是一个大的数组:索引为LBA,内容是该LBA在闪存的物理地址(简称为PBA)。当存储设备要读取数据时,首先查找L2P映射表获得该LBA对应的PBA,然后根据该PBA读取该LBA对应的数据。L2P映射表大小一般为存储设备容量的1/1024,比如一个256GB的UFS设备,其L2P映射表大小为256MB。对消费级存储设备来说,一般不带DRAM,所以L2P映射表数据大多数时间都是存储在闪存中的,而存储设备固件则按需加载部分L2P映射关系到小容量的SRAM中。
在访问一个文件的时候,如果该文件的LBA是连续的:一方面,主机端只要发很少的命令到存储设备,以图2场景1为例,要读该文件,只需要发一个读取命令即可,而对图2场景2,即文件存在逻辑碎片,要读取该文件,主机端需要发三个读取命令,增加了I/O命令的个数。I/O命令个数的增多,无论是对主机端软件,还是设备端固件,都带来了不小的负担。另一方面,如果文件LBA连续,存储设备从闪存设备一次加载4KB的L2P映射关系,就能满足4MB的LBA数据访问,相反,如果LBA不连续,则最坏情况是每读一个LBA,存储设备需要从闪存中加载一个4KB的映射关系,然而频繁的L2P加载,将会严重影响存储设备的读取性能。
简而言之,无论是主机端还是设备端,都是特别喜欢“逻辑连续”的,不喜欢文件逻辑碎片化。
那“物理连续”呢?很显然,存储设备也同样“喜闻乐见”。原因在于读取的时候,如果数据都集中在一起,一次读可以使用多Plane操作,比如对4 Plane闪存来说,一次读取可以获得64KB数据。但这64KB数据如果不是物理连续——分散在闪存中的不同地方,则最坏情况下要读取16次闪存(每个命令只读取4KB)。
至此我们能得出的结论是:“逻辑连续”和“物理连续”都满足的场景下,文件具有最好的读取性能。但只要其中任何一个场景不满足,文件读取性能则会受影响,最终可能导致手机出现“卡顿”的问题。因此,文件读取性能优化方向是避免或者减少文件逻辑碎片和物理碎片。
FBO特性
现在我们回到FBO特性上来。FBO作为UFS 4.0的一个扩展协议,概括下来就是:主机和设备一起配合,把文件数据从“物理不连续”转换成“物理连续”,以提升文件数据的读取性能。
具体来说,系统空闲的时候(比如夜深人静的时候),主机把需要性能优化的某个(或某些)文件的LBA信息告诉存储设备,让存储设备去检查这些LBA在闪存块上是否连续。设备会查询这些LBA的映射关系,通过这些LBA在闪存上的物理地址,来分析该文件在闪存空间上是否物理连续,以及不连续的程度(物理碎片化程度),然后把这些信息返回给主机。主机根据设备反馈信息,来指示存储设备下一步动作:如果该文件在闪存空间上很分散,就要叫存储设备把这些不连续的数据块都搬到连续的地方去。在设备接到指示后,便会执行数据的整理:将不连续的数据集中写到新的连续闪存块位置。FBO通过主机和设备的这种协作,就能够解决文件数据在存储空间的“碎片化”问题,从而改善文件的读取性能。
图 5:FBO把文件数据从物理不连续整理成物理连续
FBO旨在解决文件物理碎片化问题。
FBO没有解决的问题
FBO解决了文件的物理碎片化问题,即把“物理不连续”变成“物理连续”,但他没有解决文件逻辑碎片化问题。有数据表明,文件“逻辑不连续”相比文件“物理不连续”,对文件性能影响更大,因此解决文件的逻辑碎片化问题显得更为重要。
文件逻辑碎片化问题从古(HDD时代)至今(固态存储时代)一直存在。业界对此做了不少努力。
首先是日志结构文件系统(log-structured file system)的出现,以F2FS(Flash Friendly File System,闪存友好文件系统)为代表。F2FS是专门为基于闪存的存储设备而设计的文件系统,是手机中最常用的两大文件系统之一(另一个是EXT4文件系统)。F2FS在为文件分配逻辑块的时候,一般采用追加方式分配逻辑块,即按顺序分配;只有当存储设备逻辑空间很满的时候,才采用一种叫Threaded Logging的逻辑块分配方式,这种方式可能为一个文件分配离散的逻辑块。尽管如此,F2FS的出现,仍然大幅缓解了文件的逻辑碎片化问题。
其次是SSD中的ZNS(Zoned Namespace)技术,它把整个存储空间划分成若干个区块(Zone),在区块内部强制顺序写入。这对存储设备来说是个好消息,它的L2P映射表可以变得很小(采用更大的映射粒度),因此L2P映射表可常驻内存,当固件在处理读取命令的时候,能够快速获取LBA的物理地址,从而提升读取性能。在制定UFS 4.0标准的过程中,业界很多企业建议把Zoned Storage的概念应用到UFS上来,但从结果来看,这个建议并没有在UFS 4.0上被采纳。但可以预见类似SSD的ZNS技术一定会出现在未来的某个UFS版本中。
点评FBO
虽然没有解决文件逻辑碎片问题,但FBO解决了文件物理碎片问题,一定程度上能提升文件的读取性能。如果考虑到类似F2FS文件系统的使用,即绝大多数文件的LBA是连续的,而现在有了FBO的加持,在手机上大文件的读取性能将会得到改善,手机“越用越卡”的问题“可能”会得到解决。(为什么说“可能”?前面分析了影响文件系统性能最大因素是文件逻辑碎片化,如果文件逻辑碎片化问题没有得到解决,FBO效果不会很好。)
俗话说“万事有得必有失”,文件碎片整理需要从一个闪存块把数据读出来,然后集中写到另外闪存块,而FBO这种额外的写会引入写放大,影响存储设备寿命。
另外,FBO是一种“亡羊补牢”的做法,即文件出现物理碎片,然后再将它们做整理。如果一开始存储设备对文件的物理碎片化问题有针对性设计,即一开始就拒绝文件物理碎片的产生,那么FBO就失去了其意义。
导致文件物理碎片化主要有两个原因:
1.由于各种数据混合着写,某个文件的LBA数据一开始就有可能被写到不连续的闪存空间;
2.还有就是有些存储设备在设计上没有意识到文件数据在闪存空间连续存放的意义,一些诸如垃圾回收的内部操作,可能会导致最初连续写入的文件数据,被分散写入到闪存空间,最终导致“物理不连续”。
如果知道物理碎片产生的原因,那么存储设备就可以有针对性设计了。
比如存储设备在算法上可以采用物理隔离的方式,将大尺寸数据写入到一个闪存块,而把小尺寸数据写到另外一个闪存块,这样避免了因小尺寸元数据写入,而导致大尺寸数据在物理空间上写入不连续的情况。
或者一开始文件数据被不连续地写入到闪存块,但是在对这个闪存数据块做垃圾回收的时候,将该闪存块上连续的LBA数据写到连续的新的物理块上,从而达到类似FBO的功效。
江波龙Smart GC技术
江波龙UFS3.1在设计之初就意识到文件的物理碎片化问题,当研发团队在设计垃圾回收算法时,不单只考虑到通过垃圾回收功能来回收闪存块,还利用执行垃圾回收的时机同时完成“物理不连续”到“物理连续”的整理。我们把这种“毕其功于一役”的垃圾回收技术称为Smart GC。
图 6:Smart GC:设备执行垃圾回收的同时完成物理碎片整理
Smart GC这项创新技术不仅解决了文件物理碎片化问题,改善了大文件的读取性能,同时也避免了额外碎片整理对存储设备寿命带来的影响。