同一文件描述符上并发调用fsync的后果
并发调用fsync同一实体的行为分析
首先得明确:POSIX标准里确实没专门定义fsync()的并发场景,但在主流Unix-like系统(比如Linux)里,实际行为是可预期的:
内核会串行化处理同一实体的fsync调用:当两个线程同时对同一个文件/目录调用
fsync()时,内核不会让它们的同步操作并行执行,而是会把请求排队,挨个处理。也就是说,第二个线程的fsync()会阻塞,直到第一个的同步操作完全完成。针对目录同步的场景(比如创建新文件后同步目录):不管两个线程谁先触发
fsync(),最终的结果都是一致的——目录的元数据(新创建的文件条目)会被完整持久化到磁盘。即使两个线程各自创建了不同的文件,只要它们都对目录调用了fsync(),最终磁盘上的目录会包含所有新文件的条目,不会出现元数据丢失或损坏的情况。因为内核会确保所有未完成的元数据变更,都会在任意一次fsync()调用时被写入磁盘,后续的fsync()只会确认数据已经落盘,不会重复执行无效操作。性能层面的影响:并发调用
fsync()不会带来性能收益,反而可能让两个线程的总等待时间更长。因为fsync()本身是阻塞调用,第二个线程必须等第一个完成才能开始,总耗时基本等于两次fsync()的时间之和,和串行调用的效果差不多。
另外要注意:如果两个线程在fsync()前对目录做了冲突的修改(比如一个删除文件,一个创建同名文件),内核会按照操作的先后顺序处理元数据,fsync()只是把最终的元数据状态刷到磁盘,不会因为并发调用导致状态混乱。
内容的提问来源于stack exchange,提问作者Funny
相关产品推荐
相关产品推荐

