假设我花了一些时间作为用户使用cp
、mv
和mkdir
等命令与文件系统交互rm
。在正常操作中这些命令都不会调用fsync
。
文件系统可以在没有 fsync 的情况下无限期运行吗?这会让我的数据面临风险吗?我应该尝试确定自上次 fsync 以来已经过去了多长时间?
简短的回答是:是,是,不是。
\n是的,文件系统可以无限期地运行,而无需应用程序调用fsync
:文件系统 don\xe2\x80\x99t 依赖于此来确保数据(最终)存储在磁盘上,还有其他机制。没有fsync
呼叫确实会使您的数据面临轻微风险:例如,如果您复制文件并删除原始文件,那么您的系统就会断电,\xe2\x80\x99s 删除的数据有可能会保存到磁盘上,但是副本将不完整。
通常,您可以更改一些配置设置来控制操作系统尝试在磁盘上存储数据的速度;还有\xe2\x80\x99s 还有大棒,sync
它会导致所有未完成的数据被写入。(请注意,在所有情况下,操作系统只能确保数据到达磁盘控制器,并且可能要求磁盘刷新其缓冲区\xe2\x80\x94,不能绝对保证数据实际上存储在磁盘上.)
在 Linux 上,您可以调整的设置位于/proc/sys/vm
;对应的文档是admin-guide/sysctl/vm.rst
\xe2\x80\x94 查找dirty_
. 各种设置允许您指定在操作系统开始将数据写入磁盘之前可以等待写入多少数据或等待多长时间。有两种机制可以介入这里:\xe2\x80\x99s 一个后台线程,它将挂起的数据写入磁盘(dirty_background_...
),并且当进程开始产生太多数据时,操作系统将导致它们的写入刷新到磁盘(有效地引入类似fsync
)的内容。之所以有两种机制,是因为操作系统试图在 I/O 性能和处理性能之间保持平衡:只要正在运行的进程\xe2\x80\x99t 写入数据的速度太快,后台线程就会处理它; 但是,一旦它们开始写入太多数据而磁盘无法跟上,它们就会减慢速度,这既有助于系统赶上正在写入的待处理数据,又可以避免写入过多的数据。
如果您担心您的数据,请不要尝试检查是否fsync
已被调用,只需运行sync
.
(忽略/proc/sys/vm/dirtytime_expire_seconds
,那个\xe2\x80\x99完全是别的东西。)