linux页面缓存刷新顺序

bao*_*iao 5 linux-kernel page-caching

在将数据写入磁盘之前有页面缓存.

如果我有两个操作.

write(fileA)
write(fileB)
Run Code Online (Sandbox Code Playgroud)

然后,如果系统突然关闭.我们不主动调用sync()调用.

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

aus*_*ton 5

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

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


ask*_*skb 0

简而言之,您可能需要考虑在应用程序中调用sync()或系统调用fsync()write()系统调用,以确保数据立即同步到磁盘。

\n\n

lush(或pdflush)内核线程负责将脏页同步到磁盘。当系统正常时shutdown,所有脏缓冲区都会同步/写入磁盘。但是,如果突然断电,情况就不一样了情况就不一样了,因为尚未刷新/同步到磁盘的数据显然会丢失。

\n\n

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

\n\n
\n

vm.dirty_expire_centisecs - 脏页在写入磁盘之前必须存在多久(以 1/100 秒为单位)

\n\n

vm.dirty_writeback_centisecs - 内核唤醒 BDI 刷新线程以将脏页同步到磁盘的频率\n

\n\n

vm.dirty_background_ratio - 系统内存的百分比,当脏时系统可以开始将数据写入磁盘

\n\n

vm.dirty_ratio - 系统内存的百分比,当执行写入的进程变脏时,该百分比应阻止将脏页写入磁盘

\n
\n