11

当 write 调用返回时,数据被复制到内核管理的某个页面上。该页面可以包含来自多个进程的写入。因此,当其中一个应用程序发出 fsync 调用时,这是否会导致刷新整个页面,这意味着也会刷新其他应用程序的数据,但调用 fsync 的进程会产生成本。这个对吗?

4

2 回答 2

9

fsync对单个文件进行操作。它将刷新对该文件所做的所有更改。如果多个进程正在写入单个文件,则进行fsync调用的进程将暂停,直到所有更改都写入磁盘。

当某些日志文件系统发挥作用时,这会更加复杂。例如,具有“有序”模式的 ext3 和 ext4(在较小程度上)需要在日志中的 fsync 文件之前刷新对所有文件的所有更改。

这意味着,如果程序一直在写入大型数据库、大型日志文件或视频文件,然后fsync是两行配置文件,则fsync必须等待所有这些兆字节的数据写入后才能返回。

这就是为什么我在“写回”模式下运行我的 ext4 的原因,这可能会在崩溃后产生一些不愉快的后果,例如文件大小正确但填充为零。但在正常操作中,“写回”要快得多,我觉得这种权衡是值得的。

于 2012-12-21T19:09:42.980 回答
2

手册页状态'flushes to disk any data written to this file' 包括文件元数据。

sync 我认为您将其与将整个缓存中的所有脏页写入磁盘相混淆。脏页 == 更改数据。这个过程必须等待所有这些完成。如果成本是指等待,那么是的,这会产生成本。内核时间被添加到进程系统时间资源使用中。

fsync 也会产生成本,加上比同步(通常)少得多的内核时间。

于 2012-12-21T18:51:32.970 回答