fsync系统如何在linux中调用?

时间:2012-12-21 18:40:11

标签: linux

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

2 个答案:

答案 0 :(得分:7)

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

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

这意味着如果程序已写入大型数据库或大型日志文件或视频文件,然后fsync一个双行配置文件,则fsync必须等待所有这些在返回之前要写入的兆字节数据。

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

答案 1 :(得分:1)

手册页指出'flushes to disk any data written to this file',其中包含文件元数据。

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

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