以下转自:http://blog.youkuaiyun.com/kofshower/article/details/7357968
大家知道,在linux操作系统中,写操作是异步的,即写操作返回的时候数据并没有真正写到磁盘上,
而是先写到了系统cache里,随后由pdflush内核线程将系统中的脏页写到磁盘上,在下面几种情况下,系统会唤醒pdflush回写脏页:
1 、定时方式:
定时机制定时唤醒pdflush内核线程,周期为/proc/sys/vm/dirty_writeback_centisecs ,单位
是(1/100)秒,每次周期性唤醒的pdflush线程并不是回写所有的脏页,而是只回写变脏时间超过
/proc/sys/vm/dirty_expire_centisecs(单位也是1/100秒)。
注意:变脏的时间是以文件的inode节点变脏的时间为基准的,也就是说如果某个inode节点是10秒前变脏的,
pdflush就认为这个inode对应的所有脏页的变脏时间都是10秒前,即使可能部分页面真正变脏的时间不到10秒,
细节可以查看内核函数wb_kupdate()。
2、 内存不足的时候:
这时并不将所有的dirty页写到磁盘,而是每次写大概1024个页面,直到空闲页面满足需求为止。
3 、写操作时发现脏页超过一定比例:
当脏页占系统内存的比例超过/proc/sys/vm/dirty_background_ratio 的时候,write系统调用会唤醒
pdflush回写dirty page,直到脏页比例低于/proc/sys/vm/dirty_background_ratio,但write系统调
用不会被阻塞,立即返回。当脏页占系统内存的比例超过/proc/sys/vm/dirty_ratio的时候, write系
统调用会被被阻塞,主动回写dirty page,直到脏页比例低于/proc/sys/vm/dirty_ratio,这一点在
2.4内核中是没有的。
4 、用户调用sync系统调用:
这是系统会唤醒pdflush直到所有的脏页都已经写到磁盘为止。
以下转自:http://blog.youkuaiyun.com/fireroll/article/details/19155657
一、简介
由于页高速缓存的缓存作用,写操作实际上会被延迟。
当页高速缓存中的数据比后台存储的数据更新时,那么该数据就被称做脏数据。
在内存中累积起来的脏页最终必须被写回磁盘。
在以下两种情况发生时,脏页被写回磁盘:
. 当空闲内存低于一个特定的阈值时,内核必须将脏页写回磁盘,以便释放内存。
. 当脏页在内存中驻留时间超过一个特定的阈值时,内核必须将超时的脏页写回磁盘,
以确保脏页不会无限期地驻留在内存中。
上面两种工作的目的完全不同。
实际上,在老内核中,这是由两个独立的内核线程分别完成的。
但是在2.6内核中,由一群内核线程—pdflush后台回写例程—统一执行两种工作。