fsync系统调用在linux中如何工作?

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

fsync在一个文件上运行。 它将刷新对该文件所做的所有更改。 如果多个进程正在写入一个文件,那么进行fsync调用的进程将被暂停,直到所有更改都写入磁盘。

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

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

这就是为什么我运行我的ext4在“回写”模式,这可能会导致一些不愉快的后果,如正确大小的文件,但填充零。 但是在正常的操作中,“回写”速度要快得多,所以我认为这种折衷是值得的。

手册页描述了'flushes to disk any data written to this file'包括文件元'flushes to disk any data written to this file'

我认为你把这个sync写在磁盘上,把整个缓存中的所有脏页都写出来。 脏页面==改变了数据。 这个过程必须等待所有这些完成。 如果按成本计算,你的意思是等待,那么这是一个成本。 内核时间被添加到进程系统时间资源使用情况。

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