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

  2. 如果缓冲有好处,那么 ext4 的价值是多少。这个问题是针对那些在 ext4 中分析了多块分配器行为的人。

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

4

1 回答 1

1

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

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

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

于 2012-06-16T14:17:26.377 回答