由于page cache的存在,用户write时只是将数据缓存到了page cache,并标记为dirty,而没有真正写到块设备(如硬盘)上 。内核在某个时刻会将page cache里的dirty数据wirteback到块设备上,这就是内核的writeback机制。

       writeback是通过delayed_work来实现的,在wb_init()函数里初始化了这个delayed_work;

        INIT_DELAYED_WORK(&wb->dwork, wb_workfn);

在wb_workfn()会wakeup这个delayed_work,来实现周期性的writeback:

Page Cache之writeback

周期为dirty_writeback_interval,可以通过 /proc/sys/vm/dirty_writeback_centisecs来设置,默认是 5秒。

writeback的主体是在wb_do_writeback():

Page Cache之writeback

writeback分以下两种方式:

1. periodic writeback

    对应wb_check_old_data_flush():

    Page Cache之writeback

     对expired dirty inode进行writeback,expired时间为dirty_expire_interval,默认是30秒,可以通过/proc/sys/vm/dirty_expire_centisecs设置

2. background writeback

    对应wb_check_background_flush(),如果dirty数据超过bg_thresh则进行writeback ,bg_thresh可以通过/proc/sys/vm/dirty_background_bytes或/proc/sys/vm/dirty_background_ratio来设置。

那么数据是在哪里标记为dirty的呢?当用户write()时,会调用到mark_buffer_dirty(),进而调用到__mark_inode_dirty(),将对应的inode标记为dirty并添加到b_dirty对列:

Page Cache之writeback

相关文章:

  • 2021-09-08
  • 2021-07-12
  • 2021-09-26
  • 2022-01-09
  • 2022-02-19
  • 2021-07-18
  • 2022-12-23
猜你喜欢
  • 2021-09-11
  • 2022-12-23
  • 2022-12-23
  • 2021-10-31
  • 2022-12-23
  • 2022-12-23
  • 2021-08-06
相关资源
相似解决方案