fsync是否能保证后续读取来自磁盘而非内核缓冲区?
关于Linux
fsync() 调用后内核缓冲区的行为 核心结论
调用 fsync() 成功返回后,内核会将对应文件的脏缓冲区刷新到磁盘,但并不会主动释放这些缓冲区。内核依然会把这些数据留在页缓存中,后续读取操作优先从缓存获取,而非直接访问磁盘。
具体细节
- 未调用
fsync()时,内核会根据内存压力等策略决定何时回收页缓存,但只要缓存未被回收,后续读取就会命中缓存。 fsync()的设计目标仅保证数据持久化到磁盘,并不负责管理页缓存的生命周期。手册页未提及缓存释放,是因为这不属于它的职责范围——缓存管理是内核内存子系统的独立逻辑。- 对磁盘写入故障测试而言,若要确保后续读取直接从磁盘获取,不能依赖
fsync(),需要主动清理对应文件的页缓存,可通过以下方式实现:- 调用
posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED):告知内核不再需要该文件的缓存,内核会在合适时机释放对应页缓存。 - 调用
fdatasync()配合上述缓存清理操作。 - 卸载挂载点后重新挂载(仅适用于测试场景)。
- 调用
内容的提问来源于stack exchange,提问作者Richard Parkins
相关产品推荐
相关产品推荐

