小文件超过一分钟未提交到磁盘



我有一个嵌入式Linux应用程序,它以相当慢的速度(50字节/秒左右)写入文件。该文件位于硬盘驱动器 XFS 文件系统上。正在通过调用 write() 而不是 fwrite() 来写入文件。

如果我重新启动系统并检查文件,则会丢失超过一分钟的数据。我认为默认的 Linux 行为是每 5 秒同步一次磁盘缓存(我可以容忍 5 秒的数据丢失,所以他们不会有问题)。我应该检查什么以查看为什么长时间没有同步? /proc/sys/vm/dirty_writeback_centisecs是 500。我应该检查其他可变的东西吗?这绝对是一个磁盘缓存问题 - 如果我ls -l文件,大小符合预期,并且在电源循环后它比以前少。

五秒行为仅适用于 ext3/ext4 文件系统,您可以通过提交挂载选项来控制这一点(默认值为 commit=5)。我不知道 XFS 的行为如何。

您可能是指 VM 子系统中的 30 秒限制。默认情况下,Linux 最多可以等待 30 秒来写入数据。您可以使用以下命令获取/设置限制:

# cat /proc/sys/vm/dirty_expire_centiseconds
3000

显示第二名的光芒。

嗯,我不确定 5s 是否为"Linux 中的默认值"。据我所知,延迟取决于文件系统,尽管我可能弄错了。我相信 XFS 上缓存同步的最大延迟是(或至少在一段时间前)30 秒。5 秒的数字对于一些较旧的文件系统(我相信是 ext2 和 ext3)是正确的,如果我没记错的话,对于 ext4 来说则不成立。

总之,发生在你身上的是预期的行为。

如果你想超越缓存,我相信你需要使用 fsync、O_SYNC 或 O_DIRECT。或者在挂载文件系统时应用"sync"选项,这应该可以全局解决问题。

好吧,XFS以这种"失败"而闻名。问题与写缓存有关。有关 XFS 常见问题解答的更多信息。

最新更新