问题
文件系统碎片,即属于单个文件的数据块之间不连续,将对文件的顺序访问转换为对存储级别的分散块的一系列随机访问。为了防止碎片导致的性能下降,文件系统利用各种技术[35],如延迟分配[23]和数据块的预分配[2],来保持数据块之间的连续性。但文件系统无法定位与文件数据块紧邻的空闲数据块的情况难以避免,这可能是由于同时写入多个文件或在自上次写入以来经过了相当长的时间后附加到文件。
一些研究报告称,碎片化仍然会对闪存固态硬盘(SSD)的性能产生不利影响,尤其是因为请求拆分。研究调查了SSD中由碎片引起的三个级别的性能下降:内核I/O路径、主机存储接口、闪存访问。
我们的分析表明,性能下降的主要原因不是由于请求拆分,而是由于die级碰撞的显著增加。在SSD中,当其他写入发生在相邻文件块的写入之间时,文件块不会被放置在连续的裸die上,从而导致随机的die分配。这种随机性增加了die级碰撞的可能性,导致以后读取性能下降,当文件被覆盖时也可能会发生这种情况。
die级碰撞如图2,文件A均匀分布在四个die上,因为它的四个页面是在没有干扰的情况下写入的。因此,文件a的顺序读取将在这四个die上同时执行,带宽为闪存die性能的四倍。相反,假设对文件B和文件C的写入是交错的。由于用于存储逻辑页的die是根据SSD内执行的写入顺序以循环方式分配的,因此文件B的第三页和最后一页最终都被分配给die3。因此,读取文件B的时间是读取理想放置的相同大小的文件(如文件a)的时间的两倍。
文件覆盖如图9。
本文方法
本文提出了一种NVMe命令扩展,该扩展与页面到die分配算法相结合,确保连续块总是落在连续的die上,即使面对文件碎片或覆盖。
SSD的固件根据闪存die的写入顺序,以循环方式在闪存die上分配其闪存页。在发生文件碎片时,存储连续文件块的页面不能放置在连续die上,而是分配给任意die。为了优化这种由文件碎片引起的不适当的页到die映射模式,提出了NVMe协议的扩展,结合写入命令为页到die的映射提供提示。通过提示,用于追加写入的页面将映射到上一个文件块的页面所分配到的die之后的die。此外,用于对现有文件块进行重写操作的页面也会破坏页面到die的映射模式,该页面将被映射到原始页面所在的同一die。
优化结果,如图10。
在商用SSD和SSD模拟器的评估表明,本文方法有效地减少了由于碎片和覆盖而导致的读取性能下降,而无需进行碎片整理。例如,当一个162 MB的SQLite数据库被分割成10011个部分时,我们的方法将性能下降限制在3.5%,而传统系统的性能下降了40%。
实验
实验环境:
实验对比:吞吐量
总结
针对SSD上的文件碎片进行分析,碎片导致读写性能下降的原因是die碰撞。SSD的固件根据闪存die的写入顺序,以循环方式在闪存die上分配其闪存页。在发生文件碎片时,存储连续文件块的页面不能放置在连续die上,而是分配给任意die,导致性能下降。本文提出了NVMe协议的扩展,结合写入命令为页到die的映射提供提示。通过提示,用于追加写入的页面将映射到上一个文件块的页面所分配到的die之后的die。此外,用于对现有文件块进行重写操作的页面也会破坏页面到die的映射模式,该页面将被映射到原始页面所在的同一die。