《Linux性能及调优指南》1.3 Linux文件系统

时间:2020-12-06 15:07:13
翻译:飞哥 (http://hi.baidu.com/imlidapeng)

版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明。

原文名称:《Linux Performance and Tuning Guidelines》

原文地址:http://www.redbooks.ibm.com/abstracts/redp4285.html

-------------------------------------------------------------------------------------------

1.3.1 虚拟文件系统
1.3.2 日志记录
1.3.3 Ext2
1.3.4 Ext3
1.3.5 ReiserFS
1.3.6 日志文件系统
1.3.7 XFS

-------------------------------------------------------------------------------------------

​Linux作为开源操作系统其中最大的优势就是支援多种文件系统。
​现代Linux内核几乎支援计算机系统中所有文件系统,从基本的FAT到高性能文件系统如日志文件系统【Journaling File System】(JFS)。
​由于Ext2、Ext3和ReiserFS为大多数Linux发行版的原生文件系统(ReiserFS只有使用在Novell SUSE Linux上才能获得商业支持),
​所以我们只集中讲解这些文件系统的相关特性,至于其它文件系统只会略作说明。

关于文件系统和硬盘子系统,参见4.6 “调优硬盘子系统”

​1.3.1 虚拟文件系统

虚拟文件系统(VFS)是一个位于用户进程与各种Linux文件系统之间的抽象接口层,
​它提供用于访问文件系统对象的通用对象模型(如i-node、文件对象、页缓存、目录条目等等)和方法,它对用户进程隐藏了各种文件系统间的差异。
​用户进程不需要知道使用的是哪个文件系统或不同的文件系统需要呼叫哪个系统调用。

​图1-14阐明了VFS的概念。

《Linux性能及调优指南》1.3 Linux文件系统
图1-14 VFS概念

​1.3.2 日志记录

在一个没有日志记录的文件系统中,当文件系统执行一个写操作时,首先内核会更改文件系统的元数据,然后才写入实际的用户数据。
​这样的操作对于保持数据完整性会产生很高的风险。
​当写操作正在更改文件系统元数据时系统突然崩溃,文件系统的一致性很可能遭到破坏。
​在下次重启时,fsck需要通过检查所有的元数据来修复一致性。
​但当系统的容量很大时,完成检查需要很长的时间才能完成。在此过程中系统是不可以使用的。

一个有日志记录的文件系统是通过在数据写入实际文件系统前先将变更的数据写入日志区【Journal Area】来解决这个问题。
​日志区可以被放置于文件系统中也可被放置于文件系统之外。被写入日志区的数据被称作日志记录【Journal Log】。
​它包含文件系统元数据的变化和实际的文件数据(如果支持)。

因为日志记录在写入实际用户数据到文件系统前需要写入journal log,相对于没有日志记录的文件系统这会导致性能上的开销。
​维护数据的高一致性会牺牲多少的性能开销,取决写入用户数据前有多少信息需要写入硬盘。
​我们将在1.3.4“Ext3”中讨论此课题。

《Linux性能及调优指南》1.3 Linux文件系统
图1-15日志记录概念

​1.3.3 Ext2

Ext2是Ext3文件系统的前身,一个快速、简单的文件系统。
​不像当今其它大多数文件系统一样,它并没有日志功能。

图1-16向我们展示了Ext2文件系统的数据结构。
​文件系统以引导扇区开始,紧接着是块组【Block Group】。
​因i-node表和存储用户数据的数据块【Data Block】可以位于磁碟片相邻位置,这样就可以减少寻道的时间,
​为了性能的提升整个文件系统被分为多个小块组。

​一个块组是由下面几项组成:

Super block :                  存储文件系统信息。Super block必须位于每个块组的顶部。
Block group descriptor:存储块组的相关信息。
Data block bitmaps:       用于管理未使用的数据块。
i-node bitmaps:              用户管理未使用的i-node。
i-node tables:                 存储i-node表。每个文件都有一个相应的i-node表,用来保存文件的元数据如:
​                                           文件模式、uid、gid、atime、ctime、mtime、dtime和数据块的指针。
Data blocks:                    存储实际的用户数据。

《Linux性能及调优指南》1.3 Linux文件系统
图1-16 Ext2文件系统数据结构

为了要找到组成文件的数据块,内核首先查找文件的i-node。
​当一个进程请求打开/var/log/messages时,内核解析文件路径并查找/(根目录)的目录项,获得其下的文件及目录信息。
​下一步内核继续查找/var的i-node并查看/var的目录项,它也包含其下的文件及目录信息。
​内核继续使用同样的方法直到找到所要文件的i-node。Linux内核使用文件对象缓存如目录项缓存或i-node缓存,来加快查找相应i-node的速度。

当Linux内核找到文件的i-node后,它将尝试访问实际的用户数据块。
​正像我们所讲述的,i-node保存有数据块的指针。通过指针内核可以获得数据块。
​对于大文件,Ext2提供了直接/间接的数据块参照。

​图1-17描绘了其是怎样运作的。

《Linux性能及调优指南》1.3 Linux文件系统
图1-17 Ext2文件系统直接/间接的数据块参照

不同的文件系统在文件系统结构和文件访问操作上存在着不同的差异,这让每个文件系统都各具特色。

​1.3.4 Ext3

当前Linux企业发行版中都支持第三扩展文件系统。
​它作为第二扩展文件系统的升级版本被广泛使用。尽管它有着与Ext2文件系统相似的基本结构,
​但与Ext2最大的不同之处就是其拥有日志记录功能。

​此文件系统亮点包括:

▶ 可用性:Ext3始终保持写入硬盘数据的一致性。当发生非正常关机(以外的电源故障或系统崩溃)时,服务器不需要花费时间去检查数据的一致性,从而将系统恢复时间从几小时缩短至几秒钟。

▶ 数据完整性:在mount命令时通过指定日志记录模式data=journal,所有数据包括文件数据及元数据都会被记录日志。

▶ 速度:通过指定日志记录模式data=writeback,你可以根据业务需要来决定选择速度还是完整性。在一个同时发生写操作非常频繁的环境中这是非常重要的。

▶ 复杂度:将一个已存在的Ext2文件系统升级到Ext3文件系统是很简单的,不需要重新格式化。
​                  通过执行tune2fs命令并修改/etc/fstab文件,你就可以很容易将Ext2升级到Ext3文件系统。
​                  此外Ext3文件系统可以被挂载为Ext2,但日志记录功能此时是不可用的。
​                  有许多第三方的产品提供调整Ext3文件系统的功能,例如PartitionMagic可以修改Ext3的分区。

​日志模式

Ext3支持3种日志模式

▶ 日志

此种模式提供了最高等级的数据一致性,文件数据和元数据都将被记录日志。它也会造成过多的性能开销。

▶ 顺序

在这种模式下只有元数据会被写入,然而在此之前首先保证文件数据已被写入。此模式为默认设定。

▶ 回写

此种模式是在牺牲数据一致性的情况下提供访问数据最快的速度。为保证数据的一致性,元数据任会被记录。然而实际的文件数据并不会被特殊处理,这就导致当系统崩溃后旧数据的出现。

​1.3.5 ReiserFS

ReiserFS是一种快速的日志文件系统,它可以优化硬盘空间的使用和加快故障恢复的速度。
​ReiserFS的开发很大程度上得益于Novell的支助。只有在Novell SUSE Linux上使用ReiserFS才可以得到商业支持。

​1.3.6 Journal File System

JFS是一个全64位文件系统,能支持大文件和分区。
​JFS起初是IBM为AIX所开发的,但现在已近可以在GPL下使用。
​JFS对于高性能计算(HPC)和数据库环境中的大分区和文件是非常理想的文件系统。
​如果想了解更多,参见http://jfs.sourceforge.net
注释:在Novel SUSE Linux Enterprise Server 10中,JFS不在被支持。

​1.3.7 XFS

eXtended File System(XFS)起初是Silicon Graphics公司为其IRIX系列系统开发的高性能日志文件系统
​。其功能特性与来自IBM的JFS非常相似,也支持大文件和分区,因此使用情境与JFS也十分相似。