背景

在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据。但是我们都知道,linux系统的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的功能吗?本文将试图理解、解释这些概念的作用和区别。

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

这里重点说一下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系统调用:

http://man7.org/linux/man-pages/man2/open.2.html

相关参数的说明:

以及innodb相关的文档:

https://lwn.net/Articles/457667/

fsync和fdatasync的区别:

http://man7.org/linux/man-pages/man2/fsync.2.html

msync:

http://man7.org/linux/man-pages/man2/msync.2.html

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://my.oschina.net/fileoptions/blog/3061822

linux模拟内存数据落盘,Linux:保证数据安全落盘相关推荐

  1. linux 共享内存_盘点那些linux 后台开发类常见问题及知识点

    一.linux和os: netstat :显示网络状态 tcpdump:主要是截获通过本机网络接口的数据,用以分析.能够截获当前所有通过本机网卡的数据包.它拥有灵活的过滤机制,可以确保得到想要的数据. ...

  2. linux 挂载有数据硬盘分区,linux下磁盘分区、挂载知多少

    0x01 Linux 分区简介 主分区 vs 扩展分区 硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两个分区,一个是主分区(Primary Partion)一个是扩展分区(extende ...

  3. linux disk 清除数据,如何在Linux中使用TestDisk恢复已删除的文件

    我们都知道寻找文件而不是找到文件的感觉,即使是在垃圾桶里也是如此. 由于TestDisk ,文件和数据丢失带来的创伤应该结束 - 这是一个免费的开源软件,最初设计用于恢复内存分区并使不可引导的磁盘再次 ...

  4. Linux系统内存管理实验报告,Linux 内存管理 综合实验报告.pdf

    Linux 内存管理 综合实验报告 计算机与通信学院 Linux 内存管理 综合实验报告 指导老师:孙建华 组员 :夏槟 20040810720 段翼真 20040810503 米晓亮 2004081 ...

  5. linux malloc内存数据结构分析

    在linux用户态程序中,我们经常调用malloc接口根据自身需要灵活分配内存.但是我们是否了解malloc所分配的内存相关数据结构在内存中的具体分布呢?下面我们以实际程序实例介绍malloc分配的内 ...

  6. linux系统安装内存测试,一种Linux系统下基于IDK内存注错的测试方法及系统与流程...

    本发明涉及计算机服务器的 技术领域: :,具体涉及到一种Linux系统下基于IDK内存注错的测试方法及系统. 背景技术: ::在服务器领域中,内存是服务器中重要的部件之一,它是与CPU进行沟通的桥梁. ...

  7. linux跟踪内存检测原理,wooyun/Linux下基于内存分析的Rootkit检测方法.html at master · exitmsconfig/wooyun · GitHub...

    Linux下基于内存分析的Rootkit检测方法 - 路人甲 原文地址:http://drops.wooyun.org/tips/4731 0x00 引言 某Linux服务器发现异常现象如下图,确定被 ...

  8. linux接收网络数据并存存储,linux网络数据包数据结构 Socket Buffer

    Linux网络核心数据结构是套接字缓存(socket buffer),简称skb.它代表一个要发送或处理的报文,并贯穿于整个协议栈.1.套接字缓存skb由两部分组成:(1)报文数据:它保存了实际在网络 ...

  9. linux共享内存变量 tiaojianbianliang,修改linux共享内存大小

    这是实际linux系统显示的实际数据: beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmax 33554432 beijibing@bjb-deskto ...

最新文章

  1. java基础 多维数组_java基础:3.2 多维数组
  2. Netflix 官方技术博客:个性化分发与推荐,走在前列的 Netflix 是怎么做的?
  3. 应用层之E-mail服务及javaMail邮件发送的知识总结
  4. VS2017学习OpenGL时遇到的一些小问题和解决方法
  5. LBP(local binary pattern)
  6. pgpool-II中间件
  7. 数据结构-----Trie树
  8. python 计算订单_python实现apriori算法的关联规则之支持度、置信度、提升度
  9. ext2.0 主体皮肤 (xtheme-black)
  10. PHP foreach如何判断是数组最后一个元素
  11. HDU3746 Cyclic Nacklace KMP求循环节
  12. 90. php 命名空间
  13. netbeans写登录界面java_NetBeans 界面美化与字体设置
  14. 使用phpmyadmin管理远程sql_CentOS7系统配置phpMyAdmin
  15. sed 去掉最后一行_shell sed命令匹配替换删除最后第一行字符正则表
  16. html:button按钮背景图片设置
  17. Android程序的目录结构分析——manifests目录、Java目录、res目录
  18. 框架集frames笔记
  19. java解决数独_Java解决“数独”之三
  20. MVC简单学习以及浅显理解

热门文章

  1. 【文末福利】元宇宙真的是人间天堂吗?元宇宙时代的5大风险
  2. 2020年平均工资出炉!这个行业最高
  3. 一篇清华博士的美赛心得 | 参加世界最牛数学建模竞赛是一种怎样的体验?
  4. linux nohup 运行,linux – 如何获取使用nohup运行的程序列表
  5. 有了 elseif 为什么还要 switch case
  6. Ubuntu开发环境搭建
  7. redis stream学习总结
  8. Arrays.deepToString的使用
  9. Arrays.sort()用来自定义排序的使用
  10. 数据结构实验之栈七:出栈序列判定