Linux下msync的可靠性:能否确保数据物理写入磁盘且不丢失?
Linux中msync能不能保证数据物理写入硬盘?
首先明确:msync本身没法直接保证数据100%写入硬盘物理介质,得看参数和硬件配置:
msync的两种工作模式
- 用
MS_ASYNC参数或者默认调用msync():只是把内存映射里的数据提交到内核的块设备层就直接返回,根本不等实际写入完成,这时候数据可能还在系统缓存或者硬盘缓存里飘着。 - 用
MS_SYNC参数:msync()会等内核确认数据已经传给硬盘设备才返回,但这里的“确认”有坑——现在大部分硬盘都自带写缓存,硬盘收到数据先存进自己的缓存就告诉系统“写完了”,但真正写到磁盘盘片上可能还得等会儿。
msync返回后系统崩溃/断电,数据会不会丢?
答案是不能100%确保不丢:
如果硬盘的写缓存没关,哪怕msync(MS_SYNC)返回成功了,数据可能还在硬盘的缓存里,这时候断电或者系统直接崩溃,缓存里的数据就会丢失。另外有些RAID卡或者存储设备也有自己的中间缓存,同样会影响数据的物理落地。
要真正确保数据物理写入,得这么做
- 关掉硬盘的写缓存:比如用
hdparm -W 0 /dev/sdX(针对机械硬盘)或者对应NVMe设备的工具关闭,但这么做会降低硬盘的写入速度。 - 用
O_DIRECT标志打开文件:绕过系统的页缓存直接写设备,但得自己处理数据对齐这类细节,而且还是得注意硬盘自身的缓存问题。 - 如果是操作文件描述符而非内存映射,也可以用
fdatasync()或者fsync(),但同样得配合关闭硬盘缓存才能彻底保证物理写入。
内容的提问来源于stack exchange,提问作者Samuel Hapak
相关产品推荐
相关产品推荐

