日常使用中 fsync 被调用的频率是多少?

日常使用中 fsync 被调用的频率是多少?

假设我花了一些时间作为用户使用 、 和 等命令与cp文件mv系统mkdir交互rmfsync在正常操作中这些命令都不会调用。

文件系统可以在没有 fsync 的情况下无限期运行吗?这会让我的数据面临风险吗?我应该尝试确定自上次 fsync 以来已经过去了多长时间?

答案1

简短的回答是:是,是,不是。

是的,文件系统可以无限期地运行,而无需应用程序调用fsync:文件系统不依赖它来确保数据(最终)存储在磁盘上,还有其他机制。没有fsync通话确实会使您的数据面临轻微风险:例如,如果您复制文件并删除原始文件,那么您的系统就会断电,删除操作有可能将其保存到磁盘,但副本将不完整。

通常,您可以更改一些配置设置来控制操作系统尝试在磁盘上存储数据的速度;还有大棒sync,它会导致所有未完成的数据被写入。 (请注意,在所有情况下,操作系统只能确保数据到达磁盘控制器,并且可能要求磁盘刷新其缓冲区 - 不能绝对保证数据实际上存储在磁盘上。)

在 Linux 上,您可以调整的设置位于/proc/sys/vm;相应的文档是admin-guide/sysctl/vm.rst- 寻找dirty_。各种设置允许您指定在操作系统开始将数据写入磁盘之前可以等待写入多少数据或等待多长时间。有两种机制可以介入这里:有一个后台线程将挂起的数据写入磁盘(dirty_background_...),当进程开始产生太多数据时,操作系统将导致它们的写入刷新到磁盘(有效地引入类似的东西fsync)。存在两种机制的原因是操作系统试图在 I/O 性能和处理性能之间保持平衡:只要正在运行的进程写入数据的速度不是太快,后台线程就会处理它;但是,一旦它们开始写入太多数据而磁盘无法跟上,它们就会减慢速度,这既有助于系统赶上正在写入的待处理数据,又可以避免写入过多的数据。

如果您担心您的数据,请不要尝试检查是否fsync已被调用,只需运行sync

(忽略/proc/sys/vm/dirtytime_expire_seconds,那完全是另一回事。)

相关内容