linux模拟内存数据落盘,Linux:保证数据安全落盘
背景
在很多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:保证数据安全落盘相关推荐
- linux 共享内存_盘点那些linux 后台开发类常见问题及知识点
一.linux和os: netstat :显示网络状态 tcpdump:主要是截获通过本机网络接口的数据,用以分析.能够截获当前所有通过本机网卡的数据包.它拥有灵活的过滤机制,可以确保得到想要的数据. ...
- linux 挂载有数据硬盘分区,linux下磁盘分区、挂载知多少
0x01 Linux 分区简介 主分区 vs 扩展分区 硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两个分区,一个是主分区(Primary Partion)一个是扩展分区(extende ...
- linux disk 清除数据,如何在Linux中使用TestDisk恢复已删除的文件
我们都知道寻找文件而不是找到文件的感觉,即使是在垃圾桶里也是如此. 由于TestDisk ,文件和数据丢失带来的创伤应该结束 - 这是一个免费的开源软件,最初设计用于恢复内存分区并使不可引导的磁盘再次 ...
- Linux系统内存管理实验报告,Linux 内存管理 综合实验报告.pdf
Linux 内存管理 综合实验报告 计算机与通信学院 Linux 内存管理 综合实验报告 指导老师:孙建华 组员 :夏槟 20040810720 段翼真 20040810503 米晓亮 2004081 ...
- linux malloc内存数据结构分析
在linux用户态程序中,我们经常调用malloc接口根据自身需要灵活分配内存.但是我们是否了解malloc所分配的内存相关数据结构在内存中的具体分布呢?下面我们以实际程序实例介绍malloc分配的内 ...
- linux系统安装内存测试,一种Linux系统下基于IDK内存注错的测试方法及系统与流程...
本发明涉及计算机服务器的 技术领域: :,具体涉及到一种Linux系统下基于IDK内存注错的测试方法及系统. 背景技术: ::在服务器领域中,内存是服务器中重要的部件之一,它是与CPU进行沟通的桥梁. ...
- linux跟踪内存检测原理,wooyun/Linux下基于内存分析的Rootkit检测方法.html at master · exitmsconfig/wooyun · GitHub...
Linux下基于内存分析的Rootkit检测方法 - 路人甲 原文地址:http://drops.wooyun.org/tips/4731 0x00 引言 某Linux服务器发现异常现象如下图,确定被 ...
- linux接收网络数据并存存储,linux网络数据包数据结构 Socket Buffer
Linux网络核心数据结构是套接字缓存(socket buffer),简称skb.它代表一个要发送或处理的报文,并贯穿于整个协议栈.1.套接字缓存skb由两部分组成:(1)报文数据:它保存了实际在网络 ...
- linux共享内存变量 tiaojianbianliang,修改linux共享内存大小
这是实际linux系统显示的实际数据: beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmax 33554432 beijibing@bjb-deskto ...
最新文章
- java基础 多维数组_java基础:3.2 多维数组
- Netflix 官方技术博客:个性化分发与推荐,走在前列的 Netflix 是怎么做的?
- 应用层之E-mail服务及javaMail邮件发送的知识总结
- VS2017学习OpenGL时遇到的一些小问题和解决方法
- LBP(local binary pattern)
- pgpool-II中间件
- 数据结构-----Trie树
- python 计算订单_python实现apriori算法的关联规则之支持度、置信度、提升度
- ext2.0 主体皮肤 (xtheme-black)
- PHP foreach如何判断是数组最后一个元素
- HDU3746 Cyclic Nacklace KMP求循环节
- 90. php 命名空间
- netbeans写登录界面java_NetBeans 界面美化与字体设置
- 使用phpmyadmin管理远程sql_CentOS7系统配置phpMyAdmin
- sed 去掉最后一行_shell sed命令匹配替换删除最后第一行字符正则表
- html:button按钮背景图片设置
- Android程序的目录结构分析——manifests目录、Java目录、res目录
- 框架集frames笔记
- java解决数独_Java解决“数独”之三
- MVC简单学习以及浅显理解