一个IO的传奇一生(3)

来源:网络收集 时间:2025-08-07 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xuecool-com或QQ:370150219 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

但是,这种架构也有一个问题,当应用文件以小文件为主的时候,元数据服务器会成为整个系统的性能瓶颈。因为,Client在访问一个文件的时候首先需要访问元数据服务器获取具体的块地址信息。

为了解决这个问题,文件系统设计人员需要对小文件这一个问题进行优化,其采用的策略是在Client进行元数据缓存。通过元数据缓存可以减少元数据访问的频率,自然就解决了这个系统性能瓶颈点问题。

从上述分析可以看出,文件系统设计是一个非常复杂的过程,其需要考虑很多应用的特征,特别是IO的Pattern和应用模式。很多文件系统的优化都是在深入分析了应用模式之后才得出的解决方案。

对于EXT3这样一个通用文件系统而言,其主要应用领域是个人桌面应用,个人以为可扩展性、性能并不是第一位的,而可靠性是比较重要的。要理解EXT3文件系统,我以为最好的方式是需要理解文件系统在磁盘上的布局,一旦理解了数据布局之后,就可以比较容易的去理解Linux中的很多ext3算法、策略了。

EXT3将整个磁盘空间划分成多个块组,每个块组都采用元数据信息对其进行描述。块组内的具体格式可以描述如下:

从上图我们可以看出一个块组内的基本信息包括:

1)Superblock(超级块)。Superblock描述了整个文件系统的信息。为了保证可靠性,可以在每个块组中对superblock进行备份。为了避免superblock冗余过多,可以采用稀疏存储的方式,即在若干个块组中对superblock进行保存,而不需要在所有的块组中都进行备份。

2)组描述符表。组描述符表对整个组内的数据布局进行了描述。例如,数据块位图的起始地址是多少?inode位图的起始地址是多少?inode表的起始地址是多少?块组中还有多少空闲块资源等。组描述符表在superblock的后面。

3)数据块位图。数据块位图描述了块组内数据块的使用情况。如果该数据块已经被某个文件使用,那么位图中的对应位会被置1,否则该位为0。

4)Inode位图。Inode位图描述了块组内inode资源使用情况。如果一个inode资源已经使用,那么对应位会被置1。

5)Inode表(即inode资源)和数据块。这两块占据了块组内的绝大部分空间,特别是数据块资源。

通过上述分析,我们了解了EXT3在磁盘上的数据布局。而一个文件是由inode进行描述的。一个文件占用的数据块是通过inode管理起来的。在inode结构中保存了直接块指针、一级间接块指针、二级间接块指针和三级间接块指针。对于一个小文件,直接可以采用直接块指针实现对文件块的访问。对于一个大文件,需要采用间接块指针实现对文件块的访问。 在理解数据布局之后,想要实现EXT3文件系统并非难事了。最主要的问题是结合Linux提供的页缓存机制实现page cache,另外通过设备的writeback机制同步dirty page。

数据回写

对于EXT3文件系统而言,在绝大多数情况下,IO请求走到page cache之后就认为这个IO处理已经完成了。用户的IO请求被放入Cache之后,用户操作结束。实际上,此时的IO处境非常的危险,如果系统在此时Crash,那么内存中缓存的数据将会彻底丢失。为了保证

数据不丢失,需要有一种机制及时的将缓存中的数据同步(回写)到磁盘。对于2.6.23版本的Linux,采用了Pdflush的数据同步机制;在3.2版本的Linux中,采用了writeback的数据同步机制。这种机制的变革主要考虑了系统性能提升方面的因素。关于这两种机制的对比可以参考文章《Linux 3.2中回写机制的变革》。

在Linux3.2中,当一个IO数据被写入Page缓存之后,EXT3文件系统会调用ext3_ordered_write_end函数(注意,在Linux2.6.23中调用aops->commit_write,会有所差别)结束整个过程。在该函数中主要完成page页dirty标志位的设置、日志信息的清除工作。其中,设置page页为dirty的操作就是用来唤醒(或者创建)一个writeback线程去处理缓存中的脏数据。设置page页dirty标志的核心函数是__set_page_dirty(调用关系为:ext3_ordered_write_endàblock_write_endà__block_commit_writeàmark_buffer_dirtyà__set_page_dirty)。__set_page_dirty函数说明如下:

在__set_page_dirty函数中主要完成了两件事情:

1)在radix tree中设置需要回写的page页为dirty。我们知道Linux为了加速dirty页的检索,在radix tree中采用了tag机制。Tag本质上就是一种flag,radix tree的每层都有tag,上层的tag信息是下层信息的汇总。所以,如果radix tree中没有脏页,那么最顶层的tag就不会被标识成dirty。如果radix tree中有脏页,脏页所在的那条分支tag才会出现dirty flag。显然,采用这种方法可以加速脏页的检索。如下图所示,如果0x00000010地址所在的page页为脏,那么其所在的访问路径会被标识成Dirty,而其他的路径不受影响。因此,文件系统在查询脏页的时候,会节省很多的检索时间。

2)将文件inode标识成dirty。通过__mark_inode_dirty函数将文件inode设置成脏,并且将该inode交给回写线程进行处理。通知回写线程的处理方式比较简单,直接将该inode挂载到writeback线程调度处理的inode链表中。我们知道,每个设备都会有一个writeback线程处理脏页回写过程,每个writeback都会维护一条需要处理的inode链表。当writeback线程被唤醒之后,其会从inode链表中获取需要处理的inode,并且从该inode所在的radix树中获取脏页,然后生成IO将数据写入磁盘。对于EXT3文件系统而言,其一定会架构在一个块设备之上,因此,在mount文件系统的时候,会将底层块设备的writeback对象(bdi)告诉给EXT3文件系统的root_inode。这样文件系统内部的inode需要进行回写数据时,直接将该inode设置成dirty,然后通过root_inode获取writeback,并且将需要处理的inode挂载到任务链表中,最后唤醒writeback线程进行数据回写操作。

EXT3所在设备的writeback线程被唤醒之后会将文件中的dirty page页刷新到磁盘。Linux中处理完成该功能的函数是do_writepages(writeback_single_inodeàdo_writepages)。由于EXT3文件系统没有注册自己的writepages方法,因此,直接调用系统提供的generic_writepages处理脏页。刷新处理一个inode中dirty page的核心函数是write_cache_pages。该函数的主要功能是搜索inode对应radix tree中的脏页,然后调用EXT3的writepage方法将脏页中的数据同步到磁盘。在刷新数据的过程中与块设备层相接口的的方法是submit_bh。每个page页都会对应一个buffer head,EXT3想要刷新数据的时候直接

调用submit_bh将page页中生成若干个bio,然后转发至底层物理设备。至此,IO旅程从文件系统开始转向块设备层。

通过上述分析,我们可以了解到一个EXT3写操作基本可以分成如下两个步骤:

1) 将数据写入page cache,每个文件都会采用一个radix tree对page页进行高效检索

管理。当数据被写入page页之后,需要将该页标识成dirty,说明该页中有新的数据需要刷新到磁盘。为了提高radix tree检索dirty page的性能,Linux采用了Tag机制。当page页被标识成dirty之后,需要将该inode加入到对应的writeback线程任务处理队列中,等待writeback线程调度处理。Radix tree和writeback之间的关系如下图所示。

2)每个块设备都会有一个writeback内核线程处理page cache/buffer的回写任务。当该线程被调度后,会检索对应inode的radix tree,获取所有的脏页,然后调用块设备接口将脏数据回写到磁盘。

通过上述两大步骤,最常见的EXT3文件写操作完成。一个IO从用户态通过系统调用进入内核,然后在radix tree上小住了一段时间,即将踏上新的征程——块设备层。

百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库一个IO的传奇一生(3)在线全文阅读。

一个IO的传奇一生(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.70edu.com/wenku/352423.html(转载请注明文章来源)
Copyright © 2020-2025 70教育网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:370150219 邮箱:370150219@qq.com
苏ICP备16052595号-17
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:7 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219