什么因素触发 linux 内核将 IO 缓冲区刷新到磁盘

What factors trigger linux kernel to flush IO buffers to disk

我写了一个写入缓冲IO的程序:-

  current_offset = 0;
  int fd = open(file_name, O_RDWR , 0644);
  while (current_offset + 4096 < 600M) {
     int ret = pwrite(fd, buf, 4096 , current_offset);
     current_offset += 4096;
   } 

  fsync(fd);

即使有大量空闲缓冲区可用并且在代码执行 fsync 之前,内核仍在将缓冲区写入磁盘。

下面的 dstat 输出显示内核正在后台将缓冲区写入磁盘:-

dstat -d -D /dev/sdb
read  writ

0    19M
0    48M
0    16M
0    16M
0    16M
0    15M
0    16M
0    16M
0    16M
0    16M
0    25M
0    32M
0    31M

free -m 说明没有内存压力。

$ free -m
              total        used        free      shared  buff/cache   available
Mem:          64323       27472       35398           0        1452       36187
Swap:             0           0           0

哪些因素决定内核触发将缓冲区写入磁盘?

是否有任何内核可调参数来更改该行为?

pdflush/flush/kdmflush 使用了以下内核参数:

vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 30
vm.dirty_writeback_centisecs = 500

这些记录在 https://www.kernel.org/doc/Documentation/sysctl/vm.txt