在分析sys_write()的源码过程中,generic_perform_write()函数执行完后,会逐
层返回,直至sys_write()返回,系统调用结束。但此时要写的数据,只是拷贝到内核缓
冲区中,并将相应的页标记为脏;但数据并未真正写到磁盘上。那么何时才会将数据写到磁
盘上,又由谁来负责将数据写到磁盘上呢?
由于页高速缓存的缓存作用,写操作实际上会被延迟。当页高速缓存中的数据比后台存
储的数据更新时,那么该数据就被称做脏数据。在内存中累积起来的脏页最终必须被写回磁
盘。在以下两种情况发生时,脏页被写回磁盘:
⋅当空闲内存低于一个特定的阈值时,内核必须将脏页写回磁盘,以便释放内存。
⋅当脏页在内存中驻留时间超过一个特定的阈值时,内核必须将超时的脏页写回磁盘, 以确保脏页不会无限期地驻留在内存中。
进行间隔性同步工作的进程之前名叫pdflush。原有pdflush机制存在的问题:在多磁盘
的系统中,pdflush管理了所有磁盘的page/buffer cache,从而导致一定程度的IO性能瓶颈。自2.6.32内核开始,放弃了原有的pdflush机制,改成了bdi_writeback机制。这种变化主要解决bdi_writeback机制为每个磁盘都创建一个线程,专门负责这个磁盘的page cache或者buffer cache的数据刷新工作,从而实现了每个磁盘的数据刷新程序在线程级的分离,这种处理可以提高IO性能。
在Linux内核Cache机制中,我们知道内核不断用块设备上的数据来填充页面Cache,
只要进程修改了数据,相应的页就标记为脏,即设置页面的PG_dirty标志。Linux允许把脏缓冲区写入块设备的操作延迟执行(write back),这样可以显著提高系统的性能。对页面Cache中的页几次写操作,可能只需要对相应的磁盘块进行一次缓慢的物理更新就可满足。另外,写操作没有读操作那么紧迫,因为进程通常不会因为延迟写而挂起,而大部分情况是因为延迟读阻塞。因为延迟写,使得任一物理块设备在平均情况下,处理读请求远多于写请求。
完整文档下载:Linux内核延迟写机制
Leave a Reply