`

(转)关于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系统调用设置它们。


分享到:
评论

相关推荐

    linux操作系统内核技术-uestc课件

    教学内容与要求  1掌握处理器在进程地址空间上的三种运行位置,了解内核编程不能使用C库函数和FPU,以及可能产生内存故障、核心栈溢出... 13熟悉页cache和radix_tree,缓冲区cache,和pdflush内核线程原理。(2小时)

    Linux System and Performance Monitoring

    如果进程需要的数据在这两个地方都没找到,就需要从磁盘上读取,此时内核过程就是 major page fault (MPF)。MPF 要求磁盘子系统检索页并缓存进 RAM。 一旦内存页被映射进内存的 buffer cache 中,内核将尝试从内存中...

    Linux下的磁盘缓存.docx

    脏页是被进程修改并标记为需要写回磁盘的页。当脏页数量过多、缓存空间不足,或脏页停留时间过长时,系统会将脏页刷新到磁盘。脏页的刷新可以通过`sync()`、`fsync()`或`fdatasync()`等系统调用来强制执行。内核还会...

    系统原理基础及系统调优1

    - 磁盘IO体系:包括缓存、pdflush、bio、磁盘队列、IO调度器等,优化数据读写效率。 - IO调优:涉及IO调度策略,如NOOP、Deadline、CFQ等。 5. **Linux虚拟文件系统(VFS)**: - VFS提供统一的接口,支持多种...

    线上问题排查

    - **pdflush**:负责将内存中已修改的内容同步到磁盘上的内核线程。 - **经验参考值**:当系统开始频繁地使用虚拟内存时,可能意味着物理内存不足,需考虑增加物理内存或优化应用。 ##### 3. 磁盘 I/O - **...

    Android高性能日志写入方案的实现

    用户 write 调用完成后,页被修改后成为脏页,操作系统有两种机制将脏页写回磁盘,一是用户手动调用 fsync(),二是由 pdflush 进程定时将脏页写回磁盘。 然而,这个过程中牵涉到两次数据拷贝:一次是用户空间内存...

    linux 内核参数VM调优 之 参数调节和场景分析

    在Linux系统中,pdflush是一个后台进程,负责将缓存中的脏页(dirty pages)刷新到磁盘。根据给定部分内容,当满足以下条件之一时,pdflush将被触发: - **脏数据存在的时间超过`dirty_expire_centisecs`**(默认为...

    线上问题调查常用命令

    - **pdflush**:负责将内存中的内容与文件系统进行同步操作,即将写操作返回时数据并没有真正写到磁盘上,而是先写到了系统的cache中,随后由pdflush内核线程将系统中的脏页写到磁盘上。 ##### 工具介绍 - **cat /...

    Linux 性能监测:Memory

    #### 三、内核进程 kswapd 和 pdflush Linux 内核中存在两个关键的进程,用于管理和优化虚拟内存的使用: 1. **kswapd**: - 这个守护进程的主要任务是监控内存的使用情况,并确保有足够的可用内存。它会根据预设...

    Linux系统监控

    - **pdflush**:负责将脏页(已修改但未写回磁盘的内存页)写回磁盘,防止内存过度压力。 3. **问题识别**: - 高频率的上下文切换和系统时间可能表明程序大量使用系统调用。 - 高内存使用率和SWAP活动可能意味...

    Linux Performance

    pdflush是另一个重要的内核进程,它负责将脏页写回磁盘。合理的配置可以减少磁盘I/O操作带来的延迟。 ##### 5.6 案例研究:大量入站I/O 本案例研究探讨了在面临大量入站I/O请求时,虚拟内存管理机制如何工作,以及...

    linux monitoring

    - **pdflush**:另一个与内存管理相关的内核进程,主要用于将脏页面(即修改后未同步到磁盘的页面)写回到磁盘上。 #### 七、I/O监控 - **读写数据页**:I/O操作涉及到的数据传输,包括从磁盘读取到内存以及从内存...

    Linux System and Performance Monitoring 英文教程

    - **pdflush守护进程**:用于加快数据页写回磁盘的速度,从而释放更多的物理内存供系统使用。 #### 七、I/O监控 - **读写数据**:监控应用程序对磁盘的读写活动,评估其对磁盘I/O的影响。 - **主要和次要页面故障*...

    精通Linux设备驱动程序开发-第三章-内核组件.pdf

    此外,还有`[pdflush]`负责管理页缓存中的脏页写回,以及`[kjournald]`作为日志记录线程,服务于文件系统日志功能。 #### 工作队列与软中断:延后执行的策略 工作队列和软中断是内核线程管理中的两个重要概念。...

    漫谈linux文件IO

    3. **Page Cache**:内核使用 pdflush 线程监控 Page Cache 中的脏页,并根据需要将其提交到 IO 调度队列。IO 调度器负责决定何时以及如何将数据写回磁盘。 #### 五、磁盘 I/O 调度与优化 磁盘 I/O 调度是一个复杂...

Global site tag (gtag.js) - Google Analytics