linux文件系统的比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux日志文件系统及性能分析
简介:日志文件系统可以在系统发生断电或者其它系统故障时保证整体数据的完整性,Linux是目前支持日志文件系统最多的操作系统之一,本文重点研究了Linux常用的日志文件系统:EXT3、ReiserFS、XFS和JFS日志技术,并采用标准的测试工具PostMark和Bonnie++对它们进行了测试,给出了详细的性能分析,对Linux服务器应用具有重要的参考价值。
一、概述
所谓日志文件系统是在传统文件系统的基础上,加入文件系统更改的日志记录,它的设计思想是:跟踪记录文件系统的变化,并将变化内容记录入日志。日志文件系统在磁盘分区中保存有日志记录,写操作首先是对记录文件进行操作,若整个写操作由于某种原因(如系统掉电)而中断,系统重启时,会根据日志记录来恢复中断前的写操作。在日志文件系统中,所有的文件系统的变化都被记录到日志,每隔一定时间,文件系统会将更新后的元数据及文件内容写入磁盘。在对元数据做任何改变以前,文件系统驱动程序会向日志中写入一个条目,这个条目描述了它将要做些什么,然后它修改元数据。目前Linux的日志文件系统主要有:在Ext2基础上开发的Ext3,根据面向对象思想设计的ReiserFS,由SGI IRIX系统移植过来的XFS,由IBM AIX系统移植过来的JFS,其中EXT3完全兼容EXT2,其磁盘结构和EXT2完全一样,只是加入日志技术;而后三种文件系统广泛使用了B树以提高文件系统的效率。
回页首
二、Ext3
Ext3文件系统是直接从Ext2文件系统发展而来,目前Ext3文件系统已经非常稳定可靠,它完全兼容Ext2文件系统,用户可以平滑地过渡到一个日志功能健全的文件系统。Ext3日志文件系统的思想就是对文件系统进行的任何高级修改都分两步进行。首先,把待写块的一个副本存放在日志中;其次,当发往日志的I/O 数据传送完成时(即数据提交到日志),块就写入文件系统。当发往文件系统的I/O 数据传送终止时(即数据提交给文件系统),日志中的块副本就被丢弃。
2.1 Ext3日志模式
Ext3既可以只对元数据做日志,也可以同时对文件数据块做日志。具体来说,Ext3提供以下三种日志模式:
•日志(Journal )
文件系统所有数据和元数据的改变都记入日志。这种模式减少了丢失每个文件所作修改的机会,但是它需要很多额外的磁盘访问。例如,当一个新文件被创建时,它的所有数据块都必须复制一份作为日志记录。这是最安全和最慢的Ext3日志模式。
•预定(Ordered )
只有对文件系统元数据的改变才记入日志。然而,Ext3文件系统把元数
据和相关的数据块进行分组,以便把元数据写入磁盘之前写入数据块。这
样,就可以减少文件内数据损坏的机会;例如,确保增大文件的任何写访问都完全受日志的保护。这是缺省的Ext3 日志模式。
•写回(Writeback )
只有对文件系统元数据的改变才记入日志;这是在其他日志文件系统发现的方法,也是最快的模式。
2.2 日志块设备(JBD)
Ext3 文件系统本身不处理日志,而是利用日志块设备(Journaling Block Device)或叫JBD 的通用内核层。Ext3文件系统调用JDB例程以确保在系统万一出现故障时它的后续操作不会损坏磁盘数据结构。Ext3 与JDB 之间的交互本质上基于三个基本单元:日志记录,原子操作和事务。
日志记录本质上是文件系统将要发出的低级操作的描述。在某些日志文件系统中,日志记录只包括操作所修改的字节范围及字节在文件系统中的起始位置。然而,JDB 层使用的日志记录由低级操作所修改的整个缓冲区组成。这种方式可能浪费很多日志空间(例如,当低级操作仅仅改变位图的一个位时),但是,它还是相当快的,因为JBD 层直接对缓冲区和缓冲区首部进行操作。
修改文件系统的任一系统调用都通常划分为操纵磁盘数据结构的一系列低级操作。如果这些低级操作还没有全部完成系统就意外宕机,就会损坏磁盘数据。为了防止数据损坏,Ext3文件系统必须确保每个系统调用以原子的方式进行处理。原子操作是对磁盘数据结构的一组低级操作,这组低级操作对应一个单独的高级操作。
出于效率的原因,JBD 层对日志的处理采用分组的方法,即把属于几个原子操作处理的日志记录分组放在一个单独的事务中。此外,与一个处理相关的所有日志记录都必须包含在同一个事务中。一个事务的所有日志记录都存放在日志的连续块中。JBD层把每个事务作为整体来处理。例如,只有当包含在一个事务的日志记录中的所有数据提交给文件系统时才回收该事务所使用的块。
三、ReiserFS
ReiserFS是一个非常优秀的文件系统,其开发者非常有魄力,整个文件系统完全是从头设计的。目前,ReiserFS可轻松管理上百G的文件系统,这在企业级应用中非常重要。ReiserFS 是根据面向对象的思想设计的,由语义层(semantic layer)和存储层(storage layer)组成。语义层主要是对对象命名空间的管理及对象接口的定义,以确定对象的功能。存储层主要是对磁盘空间的管理。语义层与存储层是通过键(key)联系的。语义层通过对对象名进行解析生成键,存储层通过键找到对象在磁盘上存储空间,键值是全局唯一的。
3.1 语义层主要接口
1) 文件接口每个文件拥有一个接口ID,此ID标识一个方法集,此方法集包含访问ReiserFS 文件的所有接口。
2) 属性接口ReiserFS实现了一种新接口,把文件的每一种属性当做一个文件,属性的值就是此文件的内容,以实现对文件属性的目录式访问。
3) hash接口目录是文件名到文件的映射表,ReiserFS是通过B+树来实现这张映射表。由于文件名是变长的,而且有时文件名会很长,所以文件名不适合作为键值,故引入了Hash函数来产生键值。
4) 安全接口安全接口处理所有的安全性检查,通常是由文件接口触发的。下面以读文件为例:文件接口的read 方法在读入文件数据之前会调用安全接口的read chech 方法来来进行安全性检查,而后者又会调用属性文件的read方法把文件属性读入以便检查。
5) 项(Item)接口项接口主要是一些对项进行平衡处理的方法,包括:项的拆分,项的评估,项的覆写,项的追加,项的删除,插入及查找。
6) 键分配(key Assignment)接口当把一个键分配给一个项时,键分配接口就会被触发。每一种项都有一个与其对应的键分配方法。
3.2 存储层
ReiserFS是以B+树来存储数据的,其结构如图:
图1:ReiserFS B+ 树