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的功能吗?本文将试图理解、解释这些概念的作用和区别。

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

9351d064692ad94996784c8a464a826f.png

这里重点说一下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

相关参数的说明:

3778ff5f5eed10b245dfdef72a94383a.png

以及innodb相关的文档:

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

766feae5f5d01c3b90a42c709c8bb4cc.png

fsync和fdatasync的区别:

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

0139191e81f0408e2106a0f5a708a9cd.png

msync:

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

aed9b6f5a17b9798d944bd3c5e4ebe86.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云高级技术专家周哲:阿里云边缘云原生应用实践

简介: 为什么需要边缘云原生?边缘云原生的技术特性和优势是什么?它可以为行业提供哪些关键能力?又有哪些场景适合边缘云原生呢?在MEC全球应用开发者大会的“MEC开放论坛”上,阿里云高级技术专家周哲进行了《…

dataframe 如何选中某列的一行_PySpark和SparkSQL基础:如何利用Python编程执行Spark(附代码)

作者:Pinar Ersoy翻译:孙韬淳校对:陈振东本文约2500字,建议阅读10分钟本文通过介绍Apache Spark在Python中的应用来讲解如何利用PySpark包执行常用函数来进行数据处理工作。Apache Spark是一个对开发者提供完备的库和API的集群计算…

重磅官宣:Nacos2.0 发布,性能提升 10 倍

简介: 继 Nacos 1.0 发布以来,Nacos 迅速被成千上万家企业采用,并构建起强大的生态。但是随着用户深入使用,逐渐暴露一些性能问题,因此我们启动了 Nacos 2.0 的隔代产品设计,时隔半年我们终于将其全部实现&…

deepin linux 2014 硬盘安装教程,Linux Deepin的硬盘安装

于是装了,问题来了,即使执行了sudo umount -l /cdrom,也不能直接把原来的个人文件分区挂成/home,因为liveCD的内容还放在这个上面(想不通,我只是挂载,又不格式化,怎么就行了?新氧好像…

一站式云原生智能告警运维平台——SLS新版告警发布!

简介: 本文介绍什么是云原生可观测性需求以及告警限制,介绍一站式云原生智能告警运维平台——SLS新版告警。 前言 本篇是SLS新版告警系列宣传与培训的第一篇,后续我们会推出20系列直播与实战培训视频,敬请关注。 系列目录&#…

ansible 修改文件变量_基于ansible的批量配置生成

背景网络运维,我们有很多时间是在准备配置的路上,咱们之前也讲过,从脑海中或者是从自己的宝藏笔记中找出模板,一顿操作猛如虎,Ctrl C Ctrl V。这个过程是十分危险的,因为人不是机器,肯定会出错&…

Fluid — 云原生环境下的高效“数据物流系统”

简介: 为了解决大数据、AI 等数据密集型应用在云原生计算存储分离场景下,存在的数据访问延时高、联合分析难、多维管理杂等痛点问题,南京大学 PASALab、阿里巴巴、Alluxio 在 2020 年 9 月份联合发起了开源项目 Fluid。Fluid 本质上是一个云原…

普通大学生的 Java 开发能力到什么水平才能进大厂?

对于刚开始接触编程的同学来说,选择一门合适的编程语言非常重要。Java一直以来都是被广泛使用的语言,其服务端开发占比90%,83次在TIOBE排行第一,是很多程序员的首选语言。在发展前景方面,Java的就业范围很广&#xff0…

delphi7 如何判定dbgrid两行重复_教你如何在服装上加入好看的毛线刺绣花边

有时候一件旧衣服我们给它添加一些新的元素,会产生意外惊喜的效果。今天,我们就来学学如何用毛线在衣服上刺绣花边,让衣服变得更加漂亮的方法吧!在本教程中,我们使用了一些零头羊毛线,11号木针和用于刺绣的…

阿里的 RocketMQ 如何让双十一峰值之下 0 故障?

简介: 2020 年双十一交易峰值达到 58.3 W 笔/秒,消息中间件 RocketMQ 继续数年 0 故障丝般顺滑地完美支持了整个集团大促的各类业务平稳。 作者 | 愈安 来源 | 阿里巴巴云原生公众号 2020 年双十一交易峰值达到 58.3 W 笔/秒,消息中间件 Roc…

英特尔携手谷歌云加速最新虚拟机;谷歌云平台下调抽成比例;Hitachi Vantara推出全新云成本优化服务...

NEWS新闻回顾GitLab 将上市随着收入持续增长和亏损扩大,DevOps 宠儿 GitLab 终于申请了首次公开募股 (IPO)。GitLab 一直致力于成为开发人员的一站式商店,与 GitHub(2018 年被微软以 75 亿美元高价收购)和其他 DevOps 公司竞争。在…

eq linux_音乐家和音乐爱好者的开放硬件 | Linux 中国

从 3D 打印乐器到无线播放声音的设备,有很多通过开放硬件项目来奏乐的方法。-- Michael Weinberg这个世界到处都是很棒的开源音乐播放器,但为什么只是将开源用在播放音乐上呢?你还可以使用开源硬件奏乐。本文中描述的所有工具都是经过了开源硬…

“匿名句柄” 是一切皆文件背后功臣……

作者 | 奇伢 来源 | 奇伢云存储匿名 fd 的样子?我们经常在 /proc/${pid}/fd/ 下面能看到 anon_inode : 前缀的句柄,如下:rootubuntu:~/temp# ll /proc/5398/fdlr-x- 1 x x 64 Aug 4 9:9 8 -> anon_inode:inotify lrwx- 1 x x 64 Aug …

Flink集成Iceberg在同程艺龙的实践

简介: 本文由同城艺龙大数据开发工程师张军分享,主要介绍同城艺龙 Flink 集成 Iceberg 的生产实践。 本文由同城艺龙大数据开发工程师张军分享,主要介绍同城艺龙 Flink 集成 Iiceberg 的生产实践。内容包括: 背景及痛点Flink Ice…

阿里巴巴开源容器镜像加速技术

简介: 近日阿里巴巴开源了其云原生容器镜像加速技术,其推出的overlaybd镜像格式,相比于传统的分层tar包文件格式,实现了基于网络的按需读取,从而使得容器可以快速启动。 近日阿里巴巴开源了其云原生容器镜像加速技术&…

Unity重写Inspector简化分组配置文件

Unity重写Inspector简化分组配置文件 重写Inspector创建分组管理配置文件创建修改参数参数对应类工程在我的资源中名为CreateConfig,免费下载 重写Inspector创建分组管理配置文件 创建 修改参数 参数对应类 using UnityEngine;public class GameConfig : Scriptab…

985大学的高材生只会写代码片段,丢人吗?

很多同学在学习编程的时候都会遇到各种各样的难题,比如:没有合适的资料、学习过于碎片化、资料的质量层次不齐、看了很多视频自己动手时却还是不会、接触不到完整项目、无法检测自己的编程水平是不是企业所认可的……最近,小郭和小解同学也遇…

快手基于RocketMQ的在线消息系统建设实践

简介: 快手需要建设一个主要面向在线业务的消息系统作为 Kafka 的补充,低延迟、高并发、高可用、高可靠的分布式消息中间件 RocketMQ 正是我们所需的。 作者:黄理 黄理,10多年软件开发和架构经验,热衷于代码和性能优…

基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

简介: 本文将对 RocketMQ-Exporter 的设计实现做一个简单的介绍,读者可通过本文了解到 RocketMQ-Exporter 的实现过程,以及通过 RocketMQ-Exporter 来搭建自己的 RocketMQ 监控系统。RocketMQ 在线可交互教程现已登录知行动手实验室&#xff…

c语言结构体函数平面向量加法公式,插值 拟合 符号变量与符号表达式 微积分 解方程 向量运算...

7.1.1 分段线性插值所谓分段线性插值就是通过插值点用折线段连接起来逼近原曲线,这也是计算机绘制图形的基本原理。实现分段线性插值不需编制函数程序,MATLAB自身提供了内部函数interp1其主要用法如下:interp1(x,y,xi) 一维插值◆ yiinterp1(…