最近12个月以来,Linux已经巩固了其作为服务器操作系统的地位。就像集群(cluster)对于企业级的应用很重要那样,日志文件系统(journaling file system)也是同样重要的。
为什么日志文件系统很重要呢?它是怎样工作的呢?有哪些日志文件系统可以用于Linux?
日志文件系统比传统的文件系统安全,因为它用独立的日志文件跟踪磁盘内容的变化。就像关系型数据库(RDBMS),日志文件系统可以用事务处理的方式,提交或撤消文件系统的变化。
Ext2不能满足要求
尽管Linux可以支持种类繁多的文件系统,但是几乎所有的Linux发行版都用ext2作为默认的文件系统。Linux可以支持的文件系统有:FAT、VFAT、HPFS(OS/2)、NTFS(Windows NT)、Sun的UFS,等等。
ext2的设计者主要考虑的是文件系统的效率和性能方面的问题。ext2在写入文件内容的同时并没有同时写入文件的meta-data(和文件有关的信息,例如:权限、所有者以及创建和访问时间)。换句话说,Linux先写入文件的内容,然后等到有空的时候才写入文件的meta-data。如果在写入文件内容之后但在写入文件的meta-data之前,突然断电了,文件系统就会处于不一致的状态。在一个需要大量文件操作的系统中(例如,像Hotmail这样的免费的Web e-mail),出现这种情况会导致很严重的后果。日志文件系统可以帮助解决这个问题。
假定你正在更新一个目录项(directory entry)。你已经在这个巨大的目录项的第五个文件块(block)中改变了23个文件项(file entry)。当正在写这个文件块的时候突然间断电了,这个文件块还没有写完,也就是被损坏了。
重新启动的时候,Linux(就像其它的Unix)会运行一个叫做“fsck”(file system check)的程序,扫描整个文件系统,保证所有的文件块都被正确地分配或使用。它将找到这个被损坏的目录项并试图修复它,但是不能够保证fsck一定能够修复损坏。修复不了是经常的事。所以,当出现上面那种情况,目录项中所有的文件项可能会丢失,也就造成文件的丢失。
如果文件系统很大,fsck扫描要费很长时间。在一个有数十亿个文件的计算机上,fsck可能要运行10个小时以上。在这段时间内,系统是不可用的,也就是导致了很长的当机时间。日志文件系统可以避免这种情况。
文件系统是怎样工作的?
文件系统通过为每个文件分配文件块的方式把数据存储在存储设备中。这样就要维护每一个文件的文件块的分配信息,而分配信息本身也要存在磁盘上。DOS和Windows的用户可能还记得FAT这种文件系统吧。不同的文件系统用不同的方法分配和读取文件块。
有两种常用的文件系统的分配策略:块分配(block allocation)和扩展分配(extent allocation)。块分配当文件变大的时候每一次都为这个文件分配磁盘空间,而扩展分配则是当某个文件的磁盘空间不够的时候,一次性为它分配一连串连续的块。
传统的Unix文件系统使用的块分配的机制提供了一个灵活而高效的文件块分配策略。磁盘上的文件块根据需要分配给文件,这样可以减少存储空间的浪费。当一个文件慢慢变大的时候,就会造成文件中文件块的不连续。这就导致了过多的磁盘寻道时间,当读取一个文件的时候有可能要随机而不是连续地读取文件块,这样的效率很低。
可以通过优化文件块的分配策略(尽可能为文件分配连续的块)来避免文件块的随机分配。通过使用聪明的块分配策略,可以实现块的连续分配。这样就可以减少磁盘的寻道时间。但是,当整个文件系统的文件块的分配形成碎片的时候,就再也不可能连续分配了。
每一次当文件扩展的时候,块分配的算法就要写入一些关于新分配的块所在位置的信息。如果每一次文件扩展的时候只增加一个块,那么就需要很多额外的磁盘I/O用来写入文件块的结构信息。文件块的结构信息也就是上面说的meta-data。meta-data总是一起同时地写入存储设备的,这就意味着改变文件大小的操作要等到所有的meta-data的操作都完成之后才能进行。因此,meta-data的操作会显著地降低整个文件系统的性能。
基于扩展(Extent-based)的分配方式
扩展分配方式一次性为文件分配很多连续的块。当创建一个文件的时候,很多文件块同时被分配;当文件扩展的时候,也一次分配很多块。文件系统的meta-data在文件创建的时候被写入,当文件的大小没有超过所有已分配的文件块的大小,就不用写入meta-data。(直到需要再分配文件块的时候)
这样可以优化磁盘寻道的方式,可以成组地分配块,有利于一次写一大批数据到存储设备中,这样就可以减少SCSI设备写数据的时间。
基于扩展分配的文件系统在读取顺序文件的时候有很好的性能,因为文件块都是成组连续分配的。但是,如果I/O操作是随机的,基于扩展分配的文件系统的好处就非常有限了。例如,当我们要连续地读取一个基于扩展分配的文件的时候,我们只要读起始块号和文件长度就行了。然后,就可以连续地读取所有的文件块了,这样在顺序读取文件的时候,读meta-data的开销就很小。反之,如果随机地读取文件,我们就要先查找每一个所需块的块地址然后再读取块的内容,这样就和块分配方式很象了。
在ext2文件系统中,对写性能的增强是通过尽量延迟写的时间,这样就能一次写一大批数据而不是每次写一小点。随之而来的就是系统效率的提高。同样,当读的时候,ext2也是一次读取一整组的块,也就是采用预读策略。这样就能提高ext2文件系统的读性能,大量减少每次读取少量数据的I/O操作。
文件块的组或块簇(block cluster)的大小是在编译的时候确定的。怎样设定簇的大小不是这篇文章所要介绍的内容。但是,可以这么说,簇的大小对文件系统的性能确实有很大的影响,而且簇的大小也是文件系统设计的时候需要考虑的一个很重要的方面。
象Veritas这样的扩展分配的文件系统和象ext2这样的“成簇写”(write-clustering)的文件系统,在默认情况下都使用512字节的块而不用1k字节的块。如果ext2用4k而不是1k字节的块,大概会有20%的性能提升。但是,为了减少被浪费的空间ext2文件系统的设计者建议使用1k字节的块。
日志文件系统是怎样解决问题的?
先提醒你一下:这节标题可能容易导致误解。日志文件系统确实解决了上面提到的一些问题,但是又带来了新问题。



评论加载中…
