现代 Linux 中 sync、fsync 与 fdatasync:打破传统认知,理清核心区别

发布时间:2026/7/18 21:43:43

现代 Linux 中 sync、fsync 与 fdatasync:打破传统认知,理清核心区别
现代 Linux 中 sync、fsync 与 fdatasync打破传统认知理清核心区别许多经典的 UNIX 编程书籍会告诉你sync只是将脏缓冲区排入写队列就返回并不等待磁盘写入完成一个名为update的守护进程会周期性地调用sync。但在今天的 Linux 系统上这些描述已经不再准确。本文将澄清这些误解并深入对比sync、fsync和fdatasync在现代 Linux 中的真实行为与使用场景。1. 传统描述的“过时”之处sync不再“异步”旧版 UNIX 及 POSIX 标准允许sync()仅仅调度所有脏缓冲区的写入然后立即返回不保证数据实际落盘。然而在Linux 上自从 1.3.20 内核起sync()就会等待所有写入完成即函数返回时所有被修改的缓冲区都已提交给底层存储设备除非设备本身忽略缓存刷新的请求。所以在现代 Linux 中sync是一个全局同步落盘的操作。update守护进程已经消失过去需要用户态的update守护进程定期调用sync来冲刷内核缓冲区。现代 Linux 早已将这项工作交给内核线程完成如pdflush后来演进为flusher工作队列完全不再需要用户态的守护进程。因此“update 每 30 秒调用一次 sync”的说法已经过时。fsync与fdatasync的行为依然正确这两个函数的行为与现代 Linux 实现一致没有本质变化fsync(fd)将指定文件的数据和元数据同步到磁盘并等待对应的 I/O 完成。fdatasync(fd)同步文件的数据部分以及后续读取所必需的元数据如文件大小但不必强制刷新时间戳等非关键元数据可能比fsync更高效。2. 现代 Linux 中sync与fsync的核心区别既然现在两者都会等待写入完成那它们还有什么不同区别非常大主要体现在作用范围、错误处理和使用场景上。作用范围sync()作用于整个系统。它会将该系统上所有文件系统的所有脏页包括文件数据、文件元数据、超级块等全部刷到磁盘。调用后整个系统缓存被清空。fsync(fd)只作用于单个打开的文件。仅将fd所代表的那个文件的数据和元数据落盘对其他文件毫无影响。错误处理sync()永远返回成功。如果某个文件的写入发生 I/O 错误调用者完全无法得知也无从处理。这对于需要可靠性的程序来说是不可接受的。fsync(fd)会报告错误。如果磁盘写入失败返回 -1 并设置errno程序可以确切地知道“这个文件持久化失败”从而采取重试或报错等补救措施。使用场景sync()系统级维护操作。例如关机/重启前的数据全局回写shutdown时会调用sync命令行工具的手动调用少数需要牺牲一切性能换取“整个系统尽可能稳定落盘”的极端场景。普通应用程序不应调用它。fsync()应用程序保证单文件持久化的标配。数据库的 WAL 日志写入、电子邮件的可靠投递、配置文件的安全更新等都需要精确知道某个文件是否已安全存盘。性能与阻塞sync()触发全局刷脏瞬间产生大量 I/O可能导致整个系统在几秒甚至更长时间内 I/O 阻塞严重影响所有进程。fsync()只针对一个文件I/O 量可控对系统其他部分几乎无影响且可配合fdatasync进一步优化。3.fsyncvsfdatasync一点点效率上的差别对于大多数程序如果只需要保证数据写入而不关心文件的访问时间atime或修改时间mtime等元数据是否精确更新fdatasync是更优选择。它可以减少一次磁盘元数据写入尤其在日志型文件系统或大量小文件写入时差异会比较明显。但请注意文件大小改变这类会影响后续正确读取的元数据fdatasync也是会同步的你无需担心数据读不出来。// 例子可靠地写入一条记录write(fd,buf,len);fdatasync(fd);// 仅保证数据和必要的元数据落盘// 或fsync(fd);// 保证数据和所有元数据落盘4. 一张表快速总结函数作用范围是否等待写入报错能力适用场景sync()全局系统是Linux无关机、全局刷脏fsync(fd)单个文件是有数据库、关键文件落盘fdatasync(fd)单个文件是有同上追求更高性能结语下次你再看到“sync只是调度写入后就返回”这类描述时要意识到那描述的是传统 UNIX 语义而不是现代 Linux 的现实。对于需要保证数据可靠落盘的应用程序请永远使用fsync或fdatasync并妥善检查它们的返回值。而sync留给系统和关机脚本去调用就好。希望这篇梳理能帮你避开那些经典的“过时陷阱”写出更可靠的 Linux 程序。

相关新闻

AI 当下 ,软件工程的全方位变革

AI 当下 ,软件工程的全方位变革

2026/7/18 21:43:43

当前生成式 AI、编码 Agent 已经从编辑器插件进化为全研发基础设施,不再只是辅助写代码,而是重构开发范式、生命周期、团队分工、工具链、质量标准、工程治理六大核心板块,传统软件工程的底层逻辑正在全面改写。一、开发范式:从 “…

如何选择适合自己设备的溢流阀?

如何选择适合自己设备的溢流阀?

2026/7/18 21:43:43

引言溢流阀在液压系统中扮演着至关重要的角色。它能够精确控制液压系统中的压力,防止系统压力过高而损坏设备,保障整个液压系统的稳定运行。无论是工业生产中的大型机械设备,还是一些精密的仪器仪表,溢流阀的存在都不可或缺。目前…

Visual C++运行库整合包解决方案:告别DLL缺失错误的终极方案

Visual C++运行库整合包解决方案:告别DLL缺失错误的终极方案

2026/7/18 21:43:43

Visual C运行库整合包解决方案:告别DLL缺失错误的终极方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾在安装新游戏或软件时&#xff0c…

知识库向量化流水线:增量更新的挑战比全量重建更大

知识库向量化流水线:增量更新的挑战比全量重建更大

2026/7/18 23:23:47

知识库向量化流水线:增量更新的挑战比全量重建更大基础设施不需要漂亮话。全量重建是一个 batch job,写好就能跑;增量更新是长在系统里的持续服务,每一步都可能掉链子。一、全量重建为什么"简单" 知识库向量化的全量重建…

情感识别实践(二):数据标注、数据清洗与数据增强,这些细节决定了模型上限

情感识别实践(二):数据标注、数据清洗与数据增强,这些细节决定了模型上限

2026/7/18 23:23:47

上一篇博客,我详细分享了自建情感数据集的必要性,以及数据采集阶段踩过的实战坑。很多小伙伴看完都有个误区:数据采集完,直接跑代码训练模型就完事了?其实这是模型训练最大的认知偏差!做过完整情感识别项目…

想喝到最清甜的椰子鸡煲汤,椰客用哪种椰子水?

想喝到最清甜的椰子鸡煲汤,椰客用哪种椰子水?

2026/7/18 23:23:47

走进位于广州天河路208号天河城购物中心7楼712的椰客,这股海岛冬日里最治愈的气息便扑面而来。但对于老饕而言,真正决定一锅椰子鸡煲成败的,并非单纯的鸡肉,而是那一汪看似清澈、实则暗藏玄机的汤底。许多食客都会在尝过第一口后产…

终极PlayStation 1记忆卡编辑器:如何专业管理你的经典游戏存档

终极PlayStation 1记忆卡编辑器:如何专业管理你的经典游戏存档

2026/7/18 23:23:47

终极PlayStation 1记忆卡编辑器:如何专业管理你的经典游戏存档 【免费下载链接】memcardrex Advanced PlayStation 1 Memory Card editor 项目地址: https://gitcode.com/gh_mirrors/me/memcardrex 你是否曾因PS1游戏存档损坏而心痛?是否在不同模…

Python从入门到精通(五):自动化工程、测试驱动与架构设计的终极演进

Python从入门到精通(五):自动化工程、测试驱动与架构设计的终极演进

2026/7/18 23:23:47

在经历了基础语法的洗礼、底层系统的剖析以及全栈生态的探索之后,Python的学习已经步入了一片更加广阔的天地。如果说前四篇内容赋予了我们构建复杂系统的硬实力,那么本篇所探讨的自动化工程、测试驱动开发、架构设计哲学以及工程化最佳实践,…

线上CPU飙高怎么排查?从日志→代码→根因的三层定位法,附3个真实案例

线上CPU飙高怎么排查?从日志→代码→根因的三层定位法,附3个真实案例

2026/7/18 23:13:47

生产问题排查:CPU 飙高、内存泄漏、慢 SQL 三场景实战 问题场景:线上服务突然变慢,CPU 飙到 90%,日志刷屏但看不出根因——给你 15 分钟,你会怎么排查? 读完收获:① 掌握 CPU/内存/慢SQL 三类问…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/18 14:07:00

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/17 17:34:09

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/18 5:51:23

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

2026/7/18 0:02:02

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

2026/7/18 0:02:02

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

某智驾大牛创业

某智驾大牛创业

2026/7/18 0:02:02

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…