4

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

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

4

3 回答 3

1

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

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

# cat /proc/sys/vm/dirty_expire_centiseconds
3000

显示数百秒。

于 2013-01-28T14:12:19.053 回答
0

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

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

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

于 2012-08-09T14:09:04.383 回答
0

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

于 2012-08-09T14:18:29.567 回答