fsync 是一个在Unix和类 Unix 里使用的系统调用
在解释 fsync 之前,我们先回顾一下在 unix 上修改保存一份文件的步骤
- 打开文件: 如果熟悉 python 的小伙伴,可能会联想到 open 这个关键字。没错,open 是获取一个文件描述符,这个描述符用于之后的所有读写操作
- 选取文件: 调用 read,使用文件描述符从文件中读取数据
- 写入文件: 调用 write,通过文件描述符把修改后的数据写入缓冲区,注意,这时还没被写入硬盘,而是存在缓冲区
- 同步文件: 调用我们的主角 fsync,这阶段会强制将文件系统缓冲区的所有修改和元数据写入硬盘,保证数据的持久性,即便系统不小心挂了或者电源断了也能防止数据丢失(是不是有点像数据库的 commit 操作?)
- 关闭文件: 最后调用 close来关闭文件描述符,释放资源,整个修改保存过程结束
为什么不直接往硬盘写,而是再调用 rsync?
- 速度快: 内存的读写速度远快于硬盘,特别是频繁的小文件写入操作
- 减少硬盘损耗: 硬盘频繁的读写会加速硬盘的损耗,而使用缓冲区能有效的减少硬盘读写次数
- 提高效率: 当有多个写入请求指向同一文件时,操作系统可以合并这些写入操作,一次性将所有更改写入硬盘,而不是每次修改都进行一次硬盘写入