【问题标题】:the linux page cache flush orderlinux页面缓存刷新顺序
【发布时间】:2014-12-29 16:59:22
【问题描述】:

在我们将数据写入磁盘之前有页面缓存。

所以如果我有两个操作。

write(fileA)
write(fileB)

如果系统突然关机。 我们不会主动调用 sync() 调用。

我想知道是否有可能我们写入fileB的数据已经flush到磁盘,而我们写入fileA的数据还没有flush到磁盘?

【问题讨论】:

    标签: linux-kernel page-caching


    【解决方案1】:

    我相信 fileB 有可能在 fileA 之前写入磁盘,因为写入将被捆绑到块 I/O 请求中,并且可以由 I/O 调度程序在块设备层重新排序,以尝试尽量减少磁盘查找。

    有关 I/O 调度程序(电梯)的更多信息,请参阅内核文档: http://lxr.free-electrons.com/source/Documentation/block/biodoc.txt#L885

    【讨论】:

      【解决方案2】:

      为了简短地回答您的问题,您可能需要考虑在您的应用程序中在write() 之后调用sync()fsync() 系统调用,以确保数据立即同步到磁盘。

      flush(或pdflush)内核线程负责将脏页同步到磁盘。当系统正确shutdown时,所有脏缓冲区都会同步/写入磁盘。然而,这在突然断电的情况下是不同的,因为尚未刷新/同步到磁盘的数据显然会丢失。

      如果您不在应用程序中调用 sync(),那么脏缓冲区会在某些内核可调参数时写入磁盘。您可以通过sysctl 内核可调参数控制应用程序数据如何同步(非活动脏页)。您可能需要考虑阅读有关以下内容的更多信息:

      vm.dirty_expire_centisecs - 脏了多久(以 1/100 秒计) 页面必须在写入磁盘之前完成

      vm.dirty_writeback_centisecs - 内核多久唤醒一次 BDI-flush 线程将脏页同步到磁盘上

      vm.dirty_background_ratio - 系统内存百分比 脏了然后系统可以开始向磁盘写入数据

      vm.dirty_ratio - 脏的系统内存百分比 进行写入的进程应该阻塞以将脏页写入 磁盘

      【讨论】:

      • 是的,我不在我的应用程序中调用sync()。那么我想知道 pdflush 内核线程是如何刷新数据的?是否需要记录脏页,并且新的脏页会在插入时附加到该数组中。那么pdflush将数据从头部刷新到尾部?
      • enum pageflags 有一个字段PG_dirty
      猜你喜欢
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 2017-05-24
      • 2011-04-11
      • 1970-01-01
      • 2013-10-18
      相关资源
      最近更新 更多