`

(转)关于pdflush进程

 
阅读更多
了提高读写文件速度,linux系统采用一种页缓存机制。当应用程序调用read,write等函数读写文件时,系统并不立即与硬盘

进行操作,而是查看需要读取的数据是否已在页缓存中,如不在,则从硬盘读取。当写入时,只是将数据写入至页缓存,然后

使用系统进程pdflush根据一定算法写入至硬盘,算法细节文章后部分会进行一个简单介绍。

系统当前页缓存大小等数据可以查看/proc/meminfo文件,下面是一个简单例子


[root@unimas_ses ]# cat /proc/meminfo
Cached:        1094972 kB
Dirty:           20484 kB
Writeback:           0 kB

  为了阅读方便,很多与本文章内容不相关信息去除了。

Cached:当前页缓存大小

Dirty:页缓存中等待被写入硬盘数据大小

Writeback:正在写入硬盘数据大小,这个值一般为0,没办法,硬盘写入速度太快了。。。。

页缓存简单介绍完毕,下面就介绍刷新页缓存的pdflush进程了。系统里只能有2~8个pdflush进程,当前pdflush进程个数可以通过/proc/sys/vm/nr_pdflush_threads 查看。当系统内全部pdflush进程繁忙超过1秒后,系统会启动一新pdflush进程。当超过一秒后,系统当前全部pdflush进程空闲时,系统会杀死一个pdflush进程。

系统有一些可控参数影响pdflush进程行为:

/proc/sys/vm/dirty_writeback_centisecs :默认为500(单位百分之一秒),间隔多长时间唤醒pdflush进程进行工作。

但修改该配置文件一般不会对具体唤醒时间有影响,内核算法本身在根据系统实际情况进行控制。

/proc/sys/vm/dirty_expire_centiseconds :默认为3000(单位百分之一秒),数据在页缓存最长多久才会超时,刷入硬盘中。值得注意的是,默认时间为30秒,这说明一般情况下,数据会在页缓存30秒后,才会真正写入硬盘。

/proc/sys/vm/dirty_background_ratio :默认为10或者5(单位百分比),多少比例的Dirty数据在系统空闲内存中,才会刷入至硬盘。系统空闲内存计算方法=Cached+Memfree-Mapped.(这三个数据都是/proc/meminfo内)。

总结下来:系统刷新页缓存正常下只有2种情况,1:数据放入页缓存超过时限。2:页缓存中待写入数据大小已到达上线。

还有一种极端情况,当系统dirty数据大小大于等于/proc/sys/vm/dirty_ratio(默认为40%)时,write操作会堵塞,直至所有dirt写入至文件。可以通过dd if=/dev/zero of=hog模拟这种情况。


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


pdflush 进程详解
由于页高速缓存的缓存作用,写操作实际上会被延迟。当页高速缓存中的数据比后台存储的数据更新时,那么该数据就被称做脏数据。在内存中累积起来的脏页最终必须被写回磁

盘。在以下两种情况发生时,脏页被写回磁盘:
·当空闲内存低于一个特定的阈值时,内核必须将脏页写回磁盘,以便释放内存。
·当脏页在内存中驻留时间超过一个特定的阈值时,内核必须将超时的脏页写回磁盘,以确保脏页不会无限期地驻留在内存中。
上面两种工作的目的完全不同。实际上,在老内核中,这是由两个独立的内核线程(请看后面章节)分别完成的。但是在2.6内核中,由一群内核线程—pdflush后台回写例程—统

一执行两种工作。说pdflush是“dirty page flush”的缩写是不正确的,不用去管这个让人混淆的名称,我们来看看这两个目标是如何具体实现的。
首先,pdflush线程在系统中的空闲内存低于一个特定的阈值时,将脏页刷新回磁盘。该后台回写例程的目的在于在可用物理内存过低时,释放脏页以重新获得内存。特定的内存阈

值可以通过dirty_background_ratio sysctl系统调用设置。当空闲内存比阈值:dirty_ background_ratio还低时,内核便会调用函数wakeup_bdflush()唤醒一个pdflush线程,随

后pdflush线程进一步调用函数background_writeout()开始将脏页写回磁盘。函数background_ writeout()需要一个长整型参数,该参数指定试图写回的页面数目。函数

background_writeout()会连续地写出数据,直到满足以下两个条件:
·已经有指定的最小数目的页被写出到磁盘。
·空闲内存数已经回升,超过了阈值dirty_background_ratio。
上述条件确保了pdflush操作可以减轻系统中内存不足的压力。回写操作不会在达到这两个条件前停止,除非pdflush写回了所有的脏页,没有剩下的脏页可再被写回了。
满足第二个目标,pdflush后台例程会被周期性唤醒(和空闲内存是否过低无关),将那些在内存中驻留时间过长的脏页写出,确保内存中不会有长期存在的脏页。如果系统发生崩

溃,由于内存处于混乱之中,所以那些在内存中还没来得及写回磁盘的脏页就会丢失,所以周期性同步页高速缓存和磁盘非常重要。在系统启动时,内核初始化一个定时器,让它

周期地唤醒pdflush线程,随后使其运行函数wb_kupdate()。该函数将把所有驻留时间超过百分之dirty_expire_centisecs秒的脏页写回。然后定时器将再次被初始化为百分之

dirty_expire_ centisecs秒后唤醒pdflush线程。总而言之,pdflush线程周期地被唤醒并且把超过特定期限的脏页写回磁盘。
系统管理员可以在/proc/sys/vm中设置回写相关的参数,也可以通过sysctl系统调用设置它们。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics