mount -o sync与open系统调用O_SYNC选项的差异及优先级问题
mount -o sync 与 open O_SYNC 的差异及优先级问题
两者的核心差异
作用范围不同
mount -o sync是挂载级别的全局设置,对整个挂载点下的所有文件生效——不管是哪个进程打开的文件,只要在这个挂载路径内,所有写操作都会强制立即刷盘。O_SYNC是文件描述符级别的选项,只对当前open调用创建的这个文件描述符生效。其他进程打开同一个文件时,如果不带O_SYNC,依然遵循挂载点的默认规则。同步粒度不同
mount -o sync会强制所有写操作(包括文件数据变更、元数据变更比如权限修改、文件创建/删除)都立即同步到磁盘,没有例外。O_SYNC(遵循POSIX标准)要求写操作等待文件数据和元数据都持久化后才返回,但它是针对单个文件描述符的设置,不会影响其他文件或元数据操作的同步规则。性能影响范围不同
mount -o sync会拉低整个挂载点的IO性能,因为所有写操作都要等待磁盘的确认信号,哪怕是不需要严格同步的操作。O_SYNC只影响单个文件描述符的写操作,挂载点内其他文件的IO性能不受影响,影响范围小很多。
open选项能否覆盖mount -o sync?
在主流Linux系统中,mount -o sync 的优先级更高,属于全局强制规则,open的选项无法取消或覆盖这个挂载设置:
- 如果挂载时指定了
sync,那么不管open时是否带O_SYNC,该挂载点下的所有文件写操作都会强制立即刷盘。 - 反过来,如果挂载是默认的
async模式,open时指定O_SYNC可以让当前文件描述符的写操作同步刷盘,覆盖挂载的默认异步规则。
内容的提问来源于stack exchange,提问作者jasonjifly
相关产品推荐
相关产品推荐

