预计阅读本页时间:-
4.3.5 日志结构文件系统
不断进步的科技给现有的文件系统带来了更多的挑战。特别是CPU的运行速度越来越快,磁盘容量越来越大,价格也越来越便宜(但是磁盘速度并没有增快多少),同时内存容量也以指数形式增长。而没有得到快速发展的参数是磁盘的寻道时间。所以这些问题综合起来,便成为影响很多文件系统性能的一个瓶颈。为此,Berkeley设计了一种全新的文件系统,试图缓解这个问题,即日志结构文件系统(Log-structured File System,LFS)。在这一节里,我们简要说明LFS是如何工作的。如果需要了解更多相关知识,请参阅(Rosenblum和Ousterhout,1991)。
促使设计LFS的主要原因是,CPU的运行速度越来越快,RAM内存容量变得更大,同时磁盘高速缓存也迅速地增加。进而,不需要磁盘访问操作,就有可能满足直接来自文件系统高速缓存的很大一部分读请求。所以从上面的事实可以推出,未来多数的磁盘访问是写操作,这样,在一些文件系统中使用的提前读机制(需要读取数据之前预取磁盘块),并不能获得更好的性能。
更为糟糕的情况是,在大多数文件系统中,写操作往往都是零碎的。一个50µs的磁盘写操作之前通常需要10ms的寻道时间和4ms的旋转延迟时间,可见零碎的磁盘写操作是极其没有效率的。根据这些参数,磁盘的效率降低到1%以下。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
为了看看这样小的零碎写操作从何而来,考虑在UNIX文件系统上创建一个新文件。为了写这个文件,必须写该文件目录的i节点、目录块、文件的i节点以及文件本身。而这些写操作都有可能被延迟,那么如果在写操作完成之前发生死机,就可能在文件系统中造成严重的不一致性。正因为如此,i节点的写操作一般是立即完成的。
出于这一原因,LFS的设计者决定重新实现一种UNIX文件系统,该系统即使对于一个大部分由零碎的随机写操作组成的任务,同样能够充分利用磁盘的带宽。其基本思想是将整个磁盘结构化为一个日志。每隔一段时间,或是有特殊需要时,被缓冲在内存中的所有未决的写操作都被放到一个单独的段中,作为在日志末尾的一个邻接段写入磁盘。一个单独的段可能会包括i节点、目录块、数据块或者都有。每一个段的开始都是该段的摘要,说明该段中都包含哪些内容。如果所有的段平均在1MB左右,那么就几乎可以利用磁盘的完整带宽。
在LFS的设计中,同样存在着i节点,且具有与UNIX中一样的结构,但是i节点分散在整个日志中,而不是放在磁盘的某一个固定位置。尽管如此,当一个i节点被定位后,定位一个块就用通常的方式来完成。当然,由于这种设计,要在磁盘中找到一个i节点就变得比较困难了,因为i节点的地址不能像在UNIX中那样简单地通过计算得到。为了能够找到i节点,必须要维护一个由i节点编号索引组成的i节点图。在这个图中的表项i指向磁盘中的第i个i节点。这个图保存在磁盘上,但是也保存在高速缓存中,因此,大多数情况下这个图的最常用部分还是在内存中。
总而言之,所有的写操作最初都被缓冲在内存中,然后周期性地把所有已缓冲的写作为一个单独的段,在日志的末尾处写入磁盘。要打开一个文件,则首先需要从i节点图中找到文件的i节点。一旦i节点定位之后就可以找到相应的块的地址。所有的块都放在段中,在日志的某个位置上。
如果磁盘空间无限大,那么有了前面的讨论就足够了。但是,实际的硬盘空间是有限的,这样最终日志将会占用整个磁盘,到那个时候将不能往日志中写任何新的段。幸运的是,许多已有的段包含了很多不再需要的块,例如,如果一个文件被覆盖了,那么它的i节点就会指向新的块,但是旧的磁盘块仍然在先前写入的段中占据着空间。
为了解决这个问题,LFS有一个清理线程,该清理线程周期地扫描日志进行磁盘压缩。该线程首先读日志中的第一个段的摘要,检查有哪些i节点和文件。然后该线程查看当前i节点图,判断该i节点是否有效以及文件块是否仍在使用中。如果没有使用,则该信息被丢弃。如果仍然使用,那么i节点和块就进入内存等待写回到下一个段中。接着,原来的段被标记为空闲,以便日志可以用它来存放新的数据。用这种方法,清理线程遍历日志,从后面移走旧的段,然后将有效的数据放入内存等待写到下一个段中。由此,整个磁盘成为一个大的环形的缓冲区,写线程将新的段写到前面,而清理线程则将旧的段从后面移走。
日志的管理并不简单,因为当一个文件块被写回到一个新段的时候,该文件的i节点(在日志的某个地方)必须首先要定位、更新,然后放到内存中准备写回到下一个段中。i节点图接着必须更新以指向新的位置。尽管如此,对日志进行管理还是可行的,而且性能分析的结果表明,这种由管理而带来的复杂性是值得的。在上面所引用文章中的测试数据表明,LFS在处理大量的零碎的写操作时性能上优于UNIX,而在读和大块写操作的性能方面并不比UNIX文件系统差,甚至更好。