您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux

Linux文件API的持久化保障

时间:2020-10-15 10:30:55  来源:  作者:
Linux文件API的持久化保障

 

在研究云系统提供的持久性时,想确保自己了解基本知识。首先阅读NVMe规范,以了解disks提供的保证(https://www.evanjones.ca/durability-nvme.html)。简单来说,你应该假设,在发出写入到刷新或强制数据单元访问写入完成之间,数据已损坏。

大多数程序使用系统调用来写入数据。本文着眼于linux文件API提供的保证。看起来这应该很简单:程序调用write()并且完成后,数据是持久的。然而,write()仅将数据从应用程序复制到内存中的内核缓存中。为了强制数据持久,您需要使用一些其他机制。

本文知识的凌乱集。(简单来说使用fdatasync或使用O_DSYNC打开)。更好更清晰的概述,请参见LWN的文章(https://lwn.net/Articles/457667/)。


write()的语义

在IEEE POSIX标准中,将write系统调用定义为尝试将数据写入文件描述符。成功返回后,即使是由其他进程或线程读取或写入的,也需要进行读取以返回已写入的字。

常规文件操作的线程交互:“如果两个线程各自调用这些函数之一,则每个调用应看到另一个调用的所有指定效果,或者都不看到。” 这表明所有文件I / O必须有效地持有一个锁。

这是否意味着写是原子的?从技术上讲,是的:将来的读取必须返回写入的全部内容,或者不返回任何内容。但是,写入并不一定要完成,只允许传输部分数据。例如,有两个线程,每个线程将1024个字节附加到一个文件描述符中。两次写入到每次只写入一个字节是可以接受的。这仍然是“原子的”,但也会导致不希望的交错输出。有一个很棒的StackOverflow答案,有更多细节。https://stackoverflow.com/questions/42442387/is-write-safe-to-be-called-from-multiple-threads-simultaneously/42442926#42442926


fsync / fdatasync

在磁盘上获取数据的最直接方法是调用fsync()。它要求操作系统将缓存中所有修改的块以及所有文件元数据(例如访问时间,修改时间等)传输到磁盘。元数据很少有用,因此除非你知道需要元数据,否则应使用fdatasync。该fdatasync是flush尽可能多的元数据作为必要“的后续数据读取要正确处理”,这才是多数应用关心的事,。

一个问题是不能保证可以再次找到该文件。特别是,第一次创建文件时,需要在包含该文件的目录上调用fsync,否则在失败后该文件可能不存在。原因基本上是在UNIX中,由于硬链接,一个文件可以存在于多个目录中,因此,当你在文件上调用fsync时,无法确定应该写出哪个目录(https://www.quora.com/When-should-you-fsync-the-containing-directory-in-addition-to-the-file-itself)。ext4实际上可能会自动同步目录,但是对于其他文件系统可能并非如此。

实施方式会因文件系统而异。使用blktrace来检查ext4和xfs使用了哪些磁盘操作。他们都对文件数据和文件系统日志发出正常的磁盘写操作,使用高速缓存刷新,然后对日志进行FUA(Force Unit Access)写操作,这可能表示操作已提交。在不支持FUA的磁盘上,这涉及两次缓存刷新。实验表明,fdatasync比fsync快一点,而blktrace显示fdatasync倾向于写入更少的数据(ext4:fsync为20 kiB,fdatasync为16 kiB)。实验还表明,xfs的速度比ext4稍快,并且blktrace再次表明它倾向于清除较少的数据(xfs:fdatasync为4 kiB)。


用O_SYNC / O_DSYNC打开

系统要求耐久性。另一种选择是在open()系统调用中使用O_SYNC或O_DSYNC选项。这将导致每个写入的语义与写入后分别带有fsync / fdatasync的语义相同。POSIX规范将此称为“同步I / O文件完整性完成”和“数据完整性完成”。这种方法的主要优点是,你只需要单个系统调用,而不是先写入后跟fdatasync。最大的缺点是使用该文件描述符的所有写入都将被同步,这可能会限制应用程序代码的结构。


使用O_DIRECT的直接I / O

open()系统调用具有O_DIRECT选项,该选项旨在绕过操作系统的缓存,而直接对磁盘进行I / O。这意味着在许多情况下,应用程序的写调用将直接转换为磁盘命令。但是,通常这不能替代fsync或fdatasync,因为磁盘本身可以自由延迟或缓存那些写入。更糟糕的是,在某些情况下,意味着O_DIRECT I / O会退回到传统的缓冲I / O上。最简单的解决方案是也使用O_DSYNC选项打开,这意味着在每次写入后都将有效地跟随fdatasync。


sync_file_range

Linux还具有sync_file_range,它可以允许将文件的一部分刷新到磁盘而不是整个文件,并触发异步刷新,而不是等待它。但是,手册页指出它“极度危险”,因此不鼓励使用它。用sync_file_range最好地描述了某些差异和危险,这是Yoshinori Matsunobu的有关其工作原理的文章。

http://yoshinorimatsunobu.blogspot.com/2014/03/how-syncfilerange-really-works.html


系统要求持久的I / O

结论是,持久性I / O基本上有三种方法。所有这些都要求在首次创建文件时在包含目录上调

用fsync()。

  1. 写入后使用fdatasync或fsync(最好使用fdatasync)。
  2. 写在用O_DSYNC或O_SYNC(最好是O_DSYNC)打开的文件描述符上。
  3. 具有RWF_DSYNC或RWF_SYNC标志的pwritev2(首选RWF_DSYNC)。

一些随机性能观察

它们许多差异很小。

  1. 覆盖比追加快(快2-100%):追加涉及其他元数据更新,即使在进行系统逻辑调用之后,但效果的大小也有所不同。我的建议是为获得最佳性能,请调用fallocate()来预分配所需的空间,然后将其显式零填充并进行fsync。这样可以确保在文件系统中将块标记为“已分配”,而不是“未分配”,这是一个很小的改进(〜2%)。此外,某些磁盘在首次访问某个块时可能会降低性能,这意味着零填充会导致较大的改进(〜100%)。值得注意的是,这可能发生在AWS EBS磁盘(不是官方的,尚未确认)和GCP永久磁盘(官方的;已确认)。
  2. 更少的系统调用更快5%):与O_DSYNC一起使用open或与RWF_SYNC一起使用pwritev2似乎要快一些,而不是显式调用fdatasync。怀疑这是因为系统调用开销稍少(一个调用而不是两个)。但是,两者之间的差异很小。

更多阅读:https://www.evanjones.ca/durability-filesystem.html



Tags:API   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Tags: API  点击:(6)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  Tags: API  点击:(20)  评论:(0)  加入收藏
10月18号, W3C中网络平台孵化器小组(Web Platform Incubator Community Group)公布了HTML Sanitizer API的规范草案。这份草案用来解决浏览器如何解决XSS攻击问题。 网络安全中...【详细内容】
2021-12-07  Tags: API  点击:(18)  评论:(0)  加入收藏
当我们通过kubectl来查看、修改Kubernetes资源时,有没有想过后面的接口到底是怎样的?有没有办法探查这些交互数据呢?Kuberenetes客户端和服务端交互的接口,是基于http协议的。所...【详细内容】
2021-11-23  Tags: API  点击:(29)  评论:(0)  加入收藏
前言客户端请求API,通常需要通过返回码来判断API返回的结果是否符合预期,以及该如何处理返回的内容等。相信很多同学都吃过返回码定义混乱的亏,有的API用返回码是int类型,有的是...【详细内容】
2021-10-28  Tags: API  点击:(51)  评论:(0)  加入收藏
凭借着平缓的学习曲线和简单直接的语法,Python在全球范围内的受欢迎程度,正在呈指数级增长。该编码语言往往可以被用于Web开发、软件开发、数学计算、系统脚本、以及几乎所有...【详细内容】
2021-09-22  Tags: API  点击:(47)  评论:(0)  加入收藏
Guava提供的RateLimiter可以限制物理或逻辑资源的被访问速率,咋一听有点像java并发包下的Samephore,但是又不相同,RateLimiter控制的是速率,Samephore控制的是并发量。RateLimit...【详细内容】
2021-09-17  Tags: API  点击:(72)  评论:(0)  加入收藏
前言前后端分离开发模式中,api文档是最好的沟通方式。今天就来说一说如何整合Swagger生成一套漂亮、美观、实用的接口文档。 源码传送门: https://gitee.com/huoqstudy/xiliu-...【详细内容】
2021-09-08  Tags: API  点击:(65)  评论:(0)  加入收藏
注:商业级功能效果演示,非开源,无源码。研发基础在之前AJAX请求数据加密效果之上,更进一步,对返回数据加密。之前是单纯用于登录场景。更广泛的场景是所有此类AJAX WEB API接口。...【详细内容】
2021-09-03  Tags: API  点击:(73)  评论:(0)  加入收藏
最近一连串的 API 安全事件(Peloton、Experian、Clubhouse 等)无疑迫使许多安全和开发团队仔细检查他们的 API 安全状况,以确保它们不会成为下一个被攻击对象。创建面向外部受...【详细内容】
2021-09-01  Tags: API  点击:(59)  评论:(0)  加入收藏
▌简易百科推荐
作用显示文件或目录所占用的磁盘空间使用命令格式du [option] 文件/目录命令功能显示文件或目录所占用的磁盘空间一些写法的区别du -sh xxx 显示总目录的大小,但是不会列出...【详细内容】
2021-12-23  mitsuhide1992    Tags:du命令   点击:(12)  评论:(0)  加入收藏
什么是linux内核linux就像是一个哲学的最佳实践。如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪地说着:“linux的美丽简直让人沉醉。”我只能说是我处在linux学习的修炼...【详细内容】
2021-12-23  linux上的码农    Tags:linux内核   点击:(15)  评论:(0)  加入收藏
本文将比较 Linux 中 service 和 systemctl 命令,先分别简单介绍这两个命令的基础用法,然后进行比较。从 CentOS 7.x 开始,CentOS 开始使用 systemd 服务来代替 service服务(dae...【详细内容】
2021-12-23  软件架构    Tags:systemctl   点击:(13)  评论:(0)  加入收藏
mv是move的缩写,可以用来移动文件或者重命名文件名,经常用来备份文件或者目录。命令格式mv [选项] 源文件或者目录 目标文件或者目录命令功能mv命令中第二个参数类型的不同(...【详细内容】
2021-12-17  入门小站    Tags:mv命令   点击:(23)  评论:(0)  加入收藏
大数据技术AI Flink/Spark/Hadoop/数仓,数据分析、面试,源码解读等干货学习资料 98篇原创内容 -->公众号 Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处...【详细内容】
2021-12-17  仙风道骨的宝石骑士    Tags:sed命令   点击:(21)  评论:(0)  加入收藏
Node是个啥?  写个东西还是尽量面面俱到吧,所以有关基本概念的东西我也从网上选择性地拿了下来,有些地方针对自己的理解有所改动,对这些概念性的东西有过了解的可选择跳过这段...【详细内容】
2021-12-15  linux上的码农    Tags:node   点击:(21)  评论:(0)  加入收藏
难道只有我一个人觉得Ubuntu的unity桌面非常好用吗?最近把台式机上面的Ubuntu 16.04格式化了,装了黑苹果用了一周,不得不说,MacOS确实很精美,软件生态比Linux丰富很多,比Windows简...【详细内容】
2021-12-14  地球末日村    Tags:ubuntu   点击:(34)  评论:(0)  加入收藏
简介Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。输出信息含义执行net...【详细内容】
2021-12-13  窥镜天    Tags:Linux netstat   点击:(26)  评论:(0)  加入收藏
对于较多数量的文件描述符的监听无论是select还是poll系统调用都显得捉襟见肘,poll每次都需要将所有的文件描述符复制到内核,内核本身不会对这些文件描述符加以保存,这样的设计...【详细内容】
2021-12-13  深度Linux    Tags:Linux   点击:(16)  评论:(0)  加入收藏
今天,我们来了解下 Linux 系统的革命性通用执行引擎-eBPF,之所以聊着玩意,因为它确实牛逼,作为一项底层技术,在现在的云原生生态领域中起着举足轻重的作用。截至目前,业界使用范...【详细内容】
2021-12-10  架构驿站    Tags:eBPF   点击:(24)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条