当“write”调用返回时,数据会被复制到由内核管理的某个页面上。该页面可能包含来自多个进程的写入。因此,当其中一个应用程序发出“fsync”调用时,这是否会导致刷新整个页面,这意味着刷新其他应用程序的数据,但成本将由调用“fsync”的进程承担。这正确吗?
当“write”调用返回时,数据会被复制到由内核管理的某个页面上。该页面可能包含来自多个进程的写入。因此,当其中一个应用程序发出“fsync”调用时,这是否会导致刷新整个页面,这意味着刷新其他应用程序的数据,但成本将由调用“fsync”的进程承担。这正确吗?
fsync
操作针对单个文件,会刷新该文件的所有更改。如果多个进程正在向单个文件写入,则进行fsync
调用的进程将暂停,直到所有的更改都被写入磁盘。
当一些日志文件系统参与时,情况就会变得更加复杂。例如,使用“有序”模式的ext3和ext4(在较小程度上)需要刷新所有在日志中位于fsync
文件之前的所有文件的更改。
这意味着,如果程序一直在写入大型数据库、大型日志文件或视频文件,然后您尝试使用fsync
同步两行配置文件,那么fsync
必须等待这些兆字节的数据全部写入磁盘才能返回。
这就是为什么我运行我的ext4在“writeback”模式下,虽然在崩溃后可能会出现一些不愉快的后果,如正确大小但填充了零的文件。但在正常操作中,“writeback”要快得多,以至于我认为这种权衡是值得的。