问题
文件系统碎片是计算机系统随着时间的推移而变慢的主要原因之一。以前认为,碎片化对硬盘驱动器(HDD)等旋转存储设备有害,但不影响固态驱动器(SSD),因为SSD在访问数据时不需要寻道时间。然而,最近的研究表明碎片化对SSD也有影响。
根据本文的实验,文件系统碎片化不仅降低了现代存储设备的I/O性能,还带来了与I/O公平性相关的各种问题,如性能干扰。
从性能的角度来看,当前的Linux I/O堆栈只允许单个I/O表示连续的LBA空间。而碎片化将单个系统调用拆分为多个小的随机I/O,增加了内核开销,阻碍了SSD内部并行性的有效利用,导致请求拆分。
从公平性的角度来看,碎片会干扰I/O调度器的活动[46]。当前大多数用于I/O公平性的Linux I/O调度器都依赖于块层级别的I/O属性,如I/O数量及其大小。但碎片化使这些属性随机化,并导致性能干扰。
挑战
消除碎片的直观方法是将碎片块迁移到新的连续区域,称为碎片整理。现有的碎片整理工具[11,13,18],例如用于Ext4的e4defrag[11],主要是为旋转存储设备(如HDD)设计的,它们会导致SSD和现代计算环境出现各种问题。
大多数碎片整理工具[2,10,11,18]将每个碎片文件的全部内容复制到新的空间中,这会产生过多的I/O操作。增加了碎片整理的时间,降低了可用性。
显著降低了协同运行应用程序的性能。在现代计算环境中,为了更好地利用资源,大量应用程序同时运行。
现有方法显著增加了底层存储设备的写入流量,从而缩短了现代存储设备的寿命,包括基于闪存的存储设备,甚至Optane SSD。
本文方法
本文提出了FragPicker,用于现代存储设备的碎片整理工具,适用于现代存储设备,如基于闪存和optane的存储设备。主要目标是最大限度地减少碎片整理引起的I/O量,同时实现与传统工具类似的性能改进。
传统的碎片整理工具倾向于保证每个文件的整个文件块的连续性,因为HDD的寻道时间占I/O开销的很大一部分。本文通过实验分析,在现代存储设备上,只要不发生请求拆分,碎片之间的距离与I/O性能无关。因此,FragPicker试图保证每个系统调用访问的数据的连续性,而不是整个文件,以防止请求分裂。
为此,FragPicker分析指定应用程序/容器的I/O特性,并找出每个文件中用于迁移的最佳数据片段。只有在迁移有助于提高性能时,才会将碎片数据迁移到新的空间,有效地将碎片整理的I/O量降至最低。
在分析阶段,跟踪应用程序的I/O活动,并确定用于后续迁移的最佳文件系统块,避免无意义的复制操作。例如,当应用程序以偏斜的方式发出I/O时,热数据的位置和放置可能会决定I/O性能,迁移冷数据不会带来很大的性能提升。因此FragPicker在系统调用层跟踪I/O信息,并识别应用程序确实需要的数据。为了进一步减少I/O数量,FragPicker计算每个数据段的访问计数,并将其用于决定迁移的目标数据。
在迁移阶段,首先确认分析阶段中的预定块是否分段。在迁移之前,调查这些数据的碎片状态,以确定数据是否需要迁移。之后,使用fallocate为迁移分配一个新区域,并执行碎片块的实际迁移。
开源代码:GitHub - jonggyup/FragPicker
通过YCSB-C的评估显示,FragPicker将碎片整理的I/O总量减少了约66%,所用时间减少了约84%,同时显示出类似的碎片整理效果。
实验
实验环境:
数据集:合成工作负载,RocksDB YCSB-C,filebench fileserver,FIO
实验对比:吞吐量、开销、读性能、运行时间
实验参数:读写方式、文件系统、硬件
总结
本文针对文件系统碎片化问题,现有方法整理碎片引入的I/O开销过高。本文实验分析了现代存储设备上碎片化导致的性能和公平性下降,主要原因是请求分裂,即碎片化将单个系统调用拆分为多个小的随机I/O。因此提出了新的碎片整理工具FragPicker,分为两阶段执行。(1)在系统调用层跟踪I/O信息,对数据段访问计数,确定最影响性能的数据段。(2)确定数据块是否分段,若分段则分配新空间进行实际数据迁移。