博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux:保证数据安全落盘
阅读量:5144 次
发布时间:2019-06-13

本文共 1270 字,大约阅读时间需要 4 分钟。

背景

在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据。但是我们都知道,的IO路径还是很复杂的,分为很多层,每一层都可能会有buffer来加速IO读写。同时,用户态的应用程序和库函数也可能拥有自己的buffer,这又给IO路径增加了一些复杂性。可见,要想保证数据安全的写到磁盘上,并不是简单调一个write/fwrite就可以搞定的。

那么要怎么做呢?很多人会想到很多办法,比如:fflush()、fsync()、fdatasync()、sync()、open()使用O_DIRECT或O_SYNC标志等。嗯,这些手段(或者某些组合)的确可以保证数据安全的持久化,那么它们之间有什么区别呢?fflush()和fsync()有啥区别?O_DIRECT是啥意思,它可以保证数据安全的持久化吗?O_DIRECT和O_SYNC区别什么?O_SYNC和fsync()呢?fsync能完成msync的功能吗?本文将试图理解、解释这些概念的作用和区别。

 IO

所谓一图胜千言,为了解析清楚这些概念的区别,我特意画了一张图,仔细看,应该可以清晰的看出它们的作用和区别。

Linux:保证数据安全落盘Linux:保证数据安全落盘
这里重点说一下O_DIRECT和O_SYNC,首先要明确的是,O_DIRECT只是说数据不会经过page cache(一般用在用户态自己管理buffer)而是直接提交给块设备层,但是不会同步等待数据安全写入磁盘之后才返回(比如数据可能还在块层排队或者在磁盘自己的cache中)。而O_SYNC标志,虽然数据还是会写page cache,但是此时会采用write through的策略,并同步等待数据安全写入磁盘后才会返回。因此如果同时使用O_DIRECT和O_SYNC,则表示数据不会经过page cache并同步等待数据安全写入磁盘才返回,当然这样IO的性能会非常低下。
由于O_DIRECT会bypass page cache,因此如果有另一个进程使用普通的方式读文件,有可能会出现数据不一致的现象,这个也需要注意。
为了做一下辅助说明,此处我贴一下我探讨过程中看过的一些资料。首先是引用open系统调用:
相关参数的说明:
Linux:保证数据安全落盘Linux:保证数据安全落盘
以及innodb相关的文档:
Linux:保证数据安全落盘Linux:保证数据安全落盘
fsync和fdatasync的区别:
Linux:保证数据安全落盘Linux:保证数据安全落盘
msync:
Linux:保证数据安全落盘Linux:保证数据安全落盘

DAX

其实还有一种IO模式,就是DAX(Direct Access ),是不是看上去和O_DIRECT很像。这种模式需要filesystem和block driver都支持才可以,一般主要用在non volatile memory上,本质上也是绕过page cache直接操作设备。DAX本文先不做深入探讨,后面我会自己写一个支持DAX模式的ramdisk块设备驱动,然后格式化为ext4文件系统并-o dax模式挂载,再来详细研究DAX的IO路径。

最后附上Linux在常见场景下的io路径跟踪:

转载于:https://www.cnblogs.com/linuxprobe-sarah/p/11174294.html

你可能感兴趣的文章
for循环:用turtle画一颗五角星
查看>>
浅谈JavaScript中的eval()
查看>>
操作系统学习(七) 、保护机制概述
查看>>
Android中的自定义控件(一)
查看>>
矩阵快速幂---BestCoder Round#8 1002
查看>>
【知识整理】这可能是最好的RxJava 2.x 入门教程(一)
查看>>
为什么要重写hashcode方法和equals方法
查看>>
【Mysql】索引简介
查看>>
[luogu1073 Noip2009] 最优贸易 (dp || SPFA+分层图)
查看>>
IT的灵魂是流程,流程的灵魂是业务,业务的灵魂是战略
查看>>
SQL语句执行与结果集的获取
查看>>
bzoj 3994: [SDOI2015]约数个数和
查看>>
反向树状数组
查看>>
android动画(一)Interpolator
查看>>
关于微软自带的身份和角色验证
查看>>
【产品测评】Android应用商店分析报告——百度应用
查看>>
【Android】Android取消EditText自动获取焦点
查看>>
匈牙利算法---解决最大匹配问题
查看>>
浅拷贝和深拷贝(java)
查看>>
图片延迟加载开源方案-lazysizes
查看>>