据我所知,在linux系统中,当修改文件内容时,页面缓存中包含该文件内容的页面将被标记为脏,并最终被刷新到磁盘。
我想知道的是,当这些页面刷新到磁盘时,它们是按块刷新的吗?
例如,如果块大小是4kB,我需要刷新一些1024kB的内容,那么磁盘写入次数是1024 / 4 = 256次吗?
答案1
这是一个非常复杂的主题,取决于磁盘、磁盘控制器和内核设置。
一般来说,内核会尝试尽可能高效。例如,如果您在可调整的时间窗口(通常为 30 秒左右)内多次更新同一个块,并且每次都没有显式强制同步到磁盘,则大多数写入操作只会更新数据缓存中,只有最终结果才会真正写入磁盘。
如果您写入一长串连续的块,内核肯定会尝试以存储控制器和磁盘本身允许的尽可能少和尽可能大的块来执行它。
内核的 I/O 调度程序还可以优化磁盘操作的顺序,以实现最有效的磁盘访问。此优化在虚拟机和 SSD 上几乎无关紧要,因此可以将其关闭。 (即使您以霰弹枪方式访问随机块,SSD 也足够快;在虚拟机上,虚拟机管理程序通常会根据整组虚拟机及其所有磁盘操作重做优化,因此尝试在级别上进行微优化单个虚拟机的工作量是浪费精力。)
某些磁盘可能对 I/O 操作大小有限制或建议:
# fdisk -l /dev/sdb
Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
例如,该 HDD 内部使用 4k 扇区大小,尽管它模拟传统的 512 字节磁盘扇区。因此,指定最小 I/O 大小为 4k。