日志结构文件系统由Rosenblum和Ousterhout于90年代初引入,旨在解决以下问题。
- 不断增长的系统内存:
随着磁盘大小的增加,可以缓存的数据量也随之增加。由于读取由高速缓存提供服务,因此文件系统的性能开始完全取决于其写入性能。 - 顺序I / O性能胜过随机I / O性能:
多年来,由于可以在同一区域容纳更多位,因此增加了从硬盘驱动器访问位的带宽。但是,小型转子在物理上很难更快地移动磁盘。因此,顺序访问可以显着提高磁盘性能。 - 现有文件系统的效率低下:
现有文件系统执行大量写入操作的次数与创建一个新文件相同,包括索引节点,位图和数据块的写入以及后续更新。短寻道和引起的旋转延迟减小了带宽。 - 文件系统不支持RAID:
此外,文件系统没有任何机制可以应对RAID-4和RAID-5中的小写问题。
即使处理器速度和主内存大小以指数级增长,磁盘访问成本的发展也要缓慢得多。这需要一个注重写性能,利用顺序带宽并在磁盘写以及元数据更新上均有效的文件系统。这是出于动机的原因,日志结构文件系统(LFS)植根于此。
尽管不可能顺序执行所有读取操作(因为可以在任何时间访问任何文件),但是我们可以利用顺序写入的效率。 LFS在内存段中保留所有写入的较小缓冲区。日志只是一种仅写在头上的数据结构(一个人可以将整个磁盘视为一个日志)。日志填满后,将按顺序将其写入磁盘的未使用部分。新数据和元数据(节点,目录)被累积到缓冲区高速缓存中,并一次全部写入大块(例如0.5M或1M的段)中。
以下是LFS实现中使用的数据结构。
- 索引节点:
与Unix中一样,inode包含指向文件的物理块指针。 - 索引节点图:
该表指示磁盘上每个索引节点的位置。索引节点映射写在段本身中。 - 细分摘要:
这将维护有关段中每个块的信息。 - 细分使用情况表:
这告诉我们块上的数据量。
顺序写入磁盘:
考虑下图,该图显示了写入到位置A0的磁盘上的数据块D。与数据块一起的是inode,它指向数据块D。通常,数据块为4 KB,而inode的大小约为128字节。
高效顺序写入磁盘:
但是,仅顺序写入磁盘不足以实现效率。为了理解该问题,请考虑我们在时间T向地址A0写入了一个数据块D。现在,当我们在时间T + t获得下一个要写入A0 + 1的数据块时,磁盘已经旋转由一些单位。如果磁盘的旋转时间为 ,我们必须等待在写入第二个块之前,要确保两个地址(A0,A0 + 1)是连续的。
解决此问题的方法很简单-无需等待在每两个连续的数据块写入之后,我们可以简单地将一些连续的写入分组,并将它们临时存储在一个段中,然后将它们全部一起写入磁盘。因此,我们不必等待磁盘在每个数据块之后重新放置,而是等待磁盘在每个x数据块之后重新放置,其中x是段的容量。下图说明了此概念。
和是对同一文件j的4个更新,这些更新立即写入磁盘。这是缓冲到LFS中的一组更新之一。 是对文件k的更新,该文件在下一个循环中写入磁盘。
简而言之:
在找到文件的索引节点(保存在索引节点映射中)之后,LFS读取过程与Unix文件系统中的读取过程相同。写入过程可以总结如下:
- 每次写操作都会导致将新块添加到内存中的当前段缓冲区中。
- 当该段已满时,它将被写入磁盘。
LFS还消除了RAID-4和RAID-5中的上述小写问题,因为写入了整个段而不是小的数据块。
挑战:
出现的问题之一是,日志中的段趋向于零散,因为旧文件块被新文件替换了。由于LFS会生成散布在磁盘各个段中的数据的旧副本,因此需要定期清除这些副本。为此,一个更清洁的过程“清除”了旧的段。该清洁器可将多个非完整的段并对其进行压缩,从而创建一个完整的段,从而释放空间。