【问题标题】:Any use of buffering for writing data on linux ext4 filesystem?是否使用缓冲在 linux ext4 文件系统上写入数据?
【发布时间】:2012-04-21 23:38:57
【问题描述】:
  1. 我在 linux 2.6 内核上使用 ext4。我有字节数组的记录,范围从几百到 16MB。在应用程序中对每条记录使用 write() 而不是说缓冲 X MB 然后在 X MB 上使用 write() 有什么好处吗?

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

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

【问题讨论】:

  • 即使缓冲了内核调用的数量也会产生影响。这里不太可能是个问题,但是 1k x 1byte 写入通常会比 1 x 1kbytes 更差……当然,我选择了极端情况。

标签: linux ext4


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2015-07-27
    • 2012-05-14
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多