Linux 3.2中回写机制的变革

writeback机制模型

在Linux-3.2新内核中,page cache和buffer cache的刷新机制发生了改变。放弃了原有的pdflush机制,改成了bdi_writeback机制。这种变化主要解决原有pdflush机制存在的一个问题:在多磁盘的系统中,pdflush管理了所有磁盘的page/buffer cache,从而导致一定程度的IO性能瓶颈。bdi_writeback机制为每个磁盘都创建一个线程,专门负责这个磁盘的page cache或者buffer cache的数据刷新工作,从而实现了每个磁盘的数据刷新程序在线程级的分离,这种处理可以提高IO性能。

writeback机制的基本原理可以描述如下:

在Linux内核中有一个常驻内存的线程bdi_forker_thread,该线程负责为bdi_object创建writeback线程,同时检测如果writeback线程长时间处于空闲状态,bdi_forker_thread线程便会将其进行销毁。bdi_forker_thread在系统中只有一个,其会被定时唤醒,检查全局链表bdi_list队列中是否存在dirty的数据需要刷新到磁盘。如果存在dirty数据并且对应bdi的writeback线程还没有被创建,bdi_forker_thread会为该bdi创建一个writeback的线程进行写回操作。

writeback线程被创建之后会处理等待的work。writeback线程拥有一个定时器会周期性唤醒这个线程处理相应的work。当用户(page cache/buffer cache)有需要处理的inode时,将inode挂载到writeback-> b_dirty链表中,然后唤醒writeback线程去处理相应的dirty_page。inode链表就是writeback线程需要处理的数据;work链表就是控制处理过程中的一些策略,不同的策略可以定义成不同的任务。

通过上述模型,对于块设备或者文件系统而言,实现dirty page的后台刷新主要做如下几个方面的工作:

1,将自己的bdi注册到系统的bdi链表中,通过bdi_forker_thread实现对bdi对象的管理,从而可以实现writeback线程的动态创建、销毁。每个块设备和文件系统都有自己的bdi对象。Ext3文件系统在创建的时候会生成superblock对象,系统会将底层块设备的backing_device关系到这个superblock对象上(在set_bdev_super函数中完成)。如果是块设备的话,在add_disk的时候直接从request_queue中得到bdi对象,然后对其进行初始化。注册bdi对象使用bdi_register_dev函数,对于ext3之类的文件系统不需要重新注册bdi对象,因为其本身就采用了底层块设备的bdi对象。

2,将需要刷新的inode节点挂载到bdi对象所属的writeback->b_dirty上,如果有特殊的work需要writeback线程完成,那么提交一个work即可;如果是通常的周期性刷新,writeback线程会自动创建相应的work。

3,操作writeback的唤醒定时器延迟唤醒writeback线程,或者直接唤醒线程,从而使得inode中radix tree上的dirty page刷新到磁盘。

bdi对象的注册

每个块设备在创建的时候会注册bdi对象(参见add_disk函数),这是Linux-3.2内核不同的地方。文件系统在mount的时候会创建superblock对象,并且通过底层块设备的request queue获取bdi对象(mount_bdev->sget->set_bdev_super)。所以,像ext3之类的文件系统都不需要重新注册bdi对象。当然,如果文件系统重新创建了一个bdi对象,那么还需要调用bdi_register_dev函数注册bdi对象。

小结

本文对linux-3.2中的writeback机制模型进行了阐述,后面还会对writeback机制中的关键函数进行分析说明。该机制是对老系统(Linux-2.6.23等)中pdflush机制的替代,其最重要的变化是每个块设备都分配了writeback线程,使得回写的IO流在各个磁盘之间独立,从而从机制上提高了IO的吞吐量。

出处:http://alanwu.blog.51cto.com/3652632/1109952

时间: 2024-08-31 08:05:55

Linux 3.2中回写机制的变革的相关文章

linux中的tasklet机制【转】

转自:http://blog.csdn.net/yasin_lee/article/details/12999099 转自: http://www.kerneltravel.net/?p=143 中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化.但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失.因此,内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟.例如,假设一个数据块已经达到了

pdflush linux kernel-磁盘回写内核线程pdflush数量为0

问题描述 磁盘回写内核线程pdflush数量为0 我用的是2.6的内核, cat /proc/sys/vm/nr_pdflush_threads 输出为0, 但是cat /proc/meminfo 发现内核里面的脏页数量又很少,正常情况下pdflush数量应该大于2才是啊,请大神不吝赐教.

利用Linux和UNIX中的一种最常用的进程间通信机制

DataStage 作业通常用于按批次处理数据,它们计划按特定的间隔运行.在没有具体的计划要遵循时,DataStage 操作员可通过 DataStage 和 QualityStage Director 客户端或在命令行手动启动作业.如果在命令行运行作业,那么您可以按如下方式执行它. dsjob -run -http://www.aliyun.com/zixun/aggregation/12616.html">param input_file=/path/to/in_file -param

Linux系统调用详解(实现机制分析)--linux内核剖析(六)

系统调用概述 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制.也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call).在linux中系统调用是用户空间访问内核的唯一手段,除异常和陷入外,他们是内核唯一的合法入口. 一般情况下应用程序通过应用编程接口API,而不是直接通过系统调用来编程.在Unix世界,最流行的API

FreeBSD 5.0中强制访问控制机制的使用与源代码分析(1)

本文主要讲述FreeBSD 5.0操作系统中新增的重要安全机制,即强制访问控制机制(MAC)的使用与源代码分析,主要包括强制访问控制框架及多级安全(MLS)策略两部分内容.这一部分讲述要将MAC框架与MLS策略用起来,应该做的一些工作,以及如何有效使用它们的问题. 强制访问控制(英文缩写MAC)是实现操作系统安全的一个重要的方法,现在几乎所有的安全操作系统都采用强制访问控制作为其核心安全机制之一.强制访问控制是对操作系统的各种客体(如文件.socket.系统FIFO.SCD.IPC等)进行细粒度

简述Linux 2.6 中的直接 I/O 技术

Linux 2.6 中提供的几种文件访问方式 所有的 I/O 操作都是通过读文件或者写文件来完成的.在这里,我们把所有的外围设备,包括键盘和显示器,都看成是文件系统中的文件.访问文件的方法多种多样,这里列出下边这几种 Linux 2.6 中支持的文件访问方式. 标准访问文件的方式 在 Linux 中,这种访问文件的方式是通过两个系统调用实现的:read() 和 write().当应用程序调用 read() 系统调用读取一块数据的时候,如果该块数据已经在内存中了,那么就直接从内存中读出该数据并返回

详解Linux系统内存寻址的分页机制

  分页机制在段机制之后进行,以完成线性-物理地址的转换过程.段机制把逻辑地址转换为线性地址,分页机制进一步把该线性地址再转换为物理地址. 硬件中的分页 分页机制由CR0中的PG位启用.如PG=1,启用分页机制,并使用本节要描述的机制,把线性地址转换为物理地址.如PG=0,禁用分页机制,直接把段机制产生的线性地址当作物理地址使用.分页机制管理的对象是固定大小的存储块,称之为页 (page).分页机制把整个线性地址空间及整个物理地址空间都看成由页组成,在线性地址空间中的任何一页,可以映射为物理地址

阿里云课堂:云计算安全体系中的沙箱机制和技术剖析

阿里云课堂第二期在上海开课,"云安全架构设计与实践"主题分享在众多朋友的期待下精彩上演,现场观众再次爆满.本次活动中,李雪峰(花名:虚舟)和杨孟哲(花名:孟哲)两位安全专家为大家献上了精彩演讲,并在OpenSpace环节与观众展开讨论,积极互动.应广大用户要求,我们将云课堂讲师现场分享内容全文整理出来,供大家参考.阿里云课堂会继续在全国各地陆续开课,欢迎大家继续支持! 一.背景介绍 这张图是飞天的体系结构介绍.整个的飞天系统,最基础的两大系统,盘古和伏羲.如果大家之前了解过这方面的资料

Android中的IPC机制

IPC是 Inter-Proscess Communication的缩写,含义为进程间的通讯或者跨进程通讯,是指两个进程之间进行数据交换的过程.按操作系统的中的描述,线程是CPU调度最小的单元,同时线程是一种有限的系统资源,而进程是指一个执行单元,在PC和移动设备上指一个程序或者一个应用.一个进程可以包含多个线程,因此进程和线程是包含于被包含的关系. IPC的使用场景就必须提到多进程,只有面对多进程这种场景下,才需要考虑进程间通讯.多进程的情况分为两种:第一种是一个应用因为某些原因自身需要采用多