任何使用缓冲在 linux ext4 文件系统上写入数据的行为


  1. 我在 linux 2.6 内核上使用 ext4。我在字节数组中有记录,范围从几百到16MB。与缓冲 X MB 然后在 X MB 上使用 write() 相比,对每条记录使用 write() 的应用程序有什么好处吗?

  2. 如果缓冲有好处,那么 ext4 的好值是什么。这个问题适用于在 ext4 中分析过多块分配器行为的人。

  3. 我的理解是文件系统将以页面大小的倍数缓冲并尝试将它们刷新到磁盘上。如果提供给 write() 的缓冲区大于文件系统缓冲区会发生什么?这是强制文件系统刷新到磁盘的粗略方法吗()

"正确"答案取决于您真正想对数据做什么。

write(2) 被设计为进入内核空间的单次旅行, 并提供了对 I/O 的良好控制。但是,除非使用 O_SYNC 打开文件,否则数据将仅进入内核的缓存,而不进入磁盘。O_SYNC更改以确保文件同步到磁盘。对磁盘的实际写入是由内核缓存发出的,ext4 将尝试分配作为大缓冲区进行写入以最大程度地减少碎片 iirc。一般来说,带有缓冲文件或O_SYNC文件的 write(2) 是控制数据是进入内核还是仍在应用程序的缓存中的好方法。

但是, 对于写入大量记录, 您可能对 writev(2) 感兴趣, 它从缓冲区列表中写入数据。与 write(2) 类似,它是一个原子调用(当然,这只是在操作系统语义中,而不是在磁盘上,除非再次使用直接 I/O)。

相关内容

最新更新