深入理解Unix/Linux中sync、fsync、fdatasync和sync_file_range系统调用以及他们的区别

在这里插入图片描述

前言

在linux内核中都有缓冲区或者页面高速缓存,大多数磁盘IO都是通过缓冲写的。当你想将数据write进文件时,内核通常会将该数据复制到其中一个缓冲区中,如果该缓冲没被写满的话,内核就不会把它放入到输出队列中。当这个缓冲区被写满或者内核想重用这个缓冲区时,才会将其排到输出队列中。等它到达等待队列首部时才会进行实际的IO操作。在进行数据库开发时,为了避免缓存中的数据还没有写入到磁盘就宕机导致的数据丢失,就需要使用fsync或这fdatasync来保证数据成功写入磁盘。

sync系统调用

函数定义:void sync(void);

我们知道write系统调用只是写入到PageCache,脏页不会立刻写入到磁盘,而是由内核的flusher线程在满足一定阈值(一定时间间隔、脏页达到一定比例),调用sync函数将脏页同步到磁盘上(放入设备的IO请求队列)。

POSIX语义要求sync系统调用只需将脏页提交到块设备IO队列就可以返回。所以我们看到sync函数返回值为void。同时sync函数返回后,并不等于写入磁盘结束,仍然会出现故障,此时sync函数是无法知晓的。对于可靠性要求比较高的应用,write提供的松散的异步语义是不够的,所以我们需要内核提供的同步IO来保证,常用fsync以及fdatasync

sync函数是针对整个PageCache的,对所有的文件更新产生的脏页都会flush。

fsync系统调用

函数定义:int fsync(int fd);

fsync将文件描述符 FD 所引用的文件的所有修改的核心数据(即修改后的缓冲区缓存页)传输(“刷新”)到该文件所在的磁盘设备(或其他永久存储设备)。调用会阻塞,直到设备报告传输已完成。它还会刷新与文件关联的元数据信息。

调用 fsync并不一定能确保包含该文件的目录中的条目也已到达磁盘。为此,还需要在目录的文件描述符上显式 调用fsync。

fsync会确保一直到写磁盘操作结束才会返回。所以fsync适合数据库这种程序。

通常文件的数据和元数据是存储在磁盘不同位置的,因此fsync至少需要两次IO操作,一次数据、一次元数据。根据Wikipedia的数据,当前硬盘驱动的平均寻道时间(Average
seek time)大约是3~15ms,7200RPM硬盘的平均旋转延迟(Average rotational
latency)大约为4ms,因此一次IO操作的耗时大约为10ms左右。所以多一次IO操作时昂贵的。

fdatasync系统调用

函数定义:int fdatasync(int fd);

将文件的所有数据缓冲区刷新到磁盘(在系统调用返回之前)。它类似于 fsync,但不需要更新元数据,例如访问时间。

访问数据库或日志文件的应用程序通常会写入一个微小的数据片段(例如,日志文件中的一行),然后立即调用fsync,以确保写入的数据以物理方式存储在硬盘上。不幸的是,fsync总是会启动两个写入操作:一个用于新写入的数据,另一个用于更新存储在 inode 中的修改时间。

上文提到fsync会同步数据以及元数据,增大延迟,因此POSIX定义了fdatasync,放宽了同步的语义,以提高性能。

fdatasync的功能与fsync类似,但是仅仅在必要的情况下才会同步metadata,因此可以减少一次IO写操作。那么什么是“必要的情况”呢?

举例来说,文件的尺寸(st_size)如果变化,是需要立即同步的,否则OS一旦崩溃,即使文件的数据部分已同步,由于metadata没有同步,依然读不到修改的内容。而最后访问时间(atime)/修改时间(mtime)是不需要每次都同步的,只要应用程序对这两个时间戳没有苛刻的要求,基本无伤大雅。

open函数的O_SYNCO_DSYNC

open函数的O_SYNCO_DSYNC参数有着和fsyncfdatasync类似的含义:使每次write都会阻塞到磁盘IO完成。

O_SYNC:使每次write操作阻塞等待磁盘IO完成,文件数据和文件属性都更新。

O_DSYNC:使每次write操作阻塞等待磁盘IO完成,但是如果该写操作并不影响读取刚写入的数据,则不需等待文件属性被更新。

O_DSYNCO_SYNC标志有微妙的区别:

文件以O_DSYNC标志打开时,仅当文件属性需要更新以反映文件数据变化(例如,更新文件大小以反映文件中包含了更多数据)时,标志才影响文件属性。在重写其现有的部分内容时,文件时间属性不会同步更新。

文件以O_SYNC标志打开时,数据和属性总是同步更新。对于该文件的每一次write都将在write返回前更新文件时间,这与是否改写现有字节或追加文件无关。相对于fsync/fdatasync,这样的设置不够灵活,应该很少使用。

实际上:Linux对O_SYNCO_DSYNC做了相同处理,没有满足POSIX的要求,而是都实现了fdatasync的语义。

sync_file_range

IO密集型的程序如果频繁的刷盘,会有很大的性能问题。Linux在内核2.6.17之后支持了sync_file_range,可以让我们在做多个更新后,一次性的刷数据,这样大大提高IO的性能。

sync_file_range可以将文件的部分范围作为目标,将对应范围内的脏页刷回磁盘,而不是整个文件的范围。好处是,当我们对大文件进行了修改时,如果修改了大量的数据块,我们最后fsync的时候,可能会很慢。即使fdatasync,也是有问题的,例如这个大文件的长度在我们的修改过程中发生了变化,那么fdatasync将同时写metadata,而对于文件系统来说,单个文件系统的写metadata是串行的,这势必导致影响其他用户操作metadata(如创建文件)。

sync_file_range是绝对不会写metadata的,所以用它非常合适,每次对文件做了小范围的修改时,立即调用sync_file_range,把对应的脏数据刷到磁盘,那么在结束对文件的修改后,再调用fdatasync (flush dirty data page)、fsync(flush dirty data+metadata page)都是很快的。

sync_file_range提供了几个flag:

  • SYNC_FILE_RANGE_WRIT:是异步的,可以结合fsync、fdatasync使用。
  • SYNC_FILE_RANGE_WAIT_BEFORE:写前做一次全文件范围的sync_file_range。从而保证在调用fdatasync或fsync前,该文件的dirty page已经全部刷到磁盘。
  • SYNC_FILE_RANGE_WAIT_AFTER:写后做一次全文件范围的sync_file_range。从而保证在调用fdatasync或fsync前,该文件的dirty page已经全部刷到磁盘。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5000字深入讲解:企业数字化转型优先从哪个板块开始?

很多企业都知道数字化转型重要,但不知道应该怎样入手,分哪些阶段。以下引用国内领先数字化服务商 织信Informat 的数字化转型方法论材料,且看看他们是如何看待数字化转型的?数字化转型应该从哪先开始?如何做&#xff1…

编译工具-Gradle

文章目录 Idea中配置Gradle项目project目录settings.gradlebuild.gradlegradlewgradlew.bat Gradle Build生命周期编写Settings.gradle编写Build.gradleTasksPlugins Idea中配置 配置项:gradle位置 及仓库位置 Gradle项目 Task,settings.gradle,build.…

【ai】tx2 nx:ubuntu18.04 yolov4-triton-tensorrt 成功部署server 运行

isarsoft / yolov4-triton-tensorrt运行发现插件未注册? 【ai】tx2 nx: jetson Triton Inference Server 部署YOLOv4 【ai】tx2 nx: jetson Triton Inference Server 运行YOLOv4 对main 进行了重新构建 【ai】tx2 nx :ubuntu查找NvInfer.h 路径及哪个包、查找符号【ai】tx2…

调用京灵平台接口,很详细

调用京灵平台接口,很详细 一、准备1、开发资源2、申请环境 二、测试接口调用1、查看接口文档2、查看示例代码3、引入对应依赖4、改造后需要的依赖5、测试调用 三、工具类1、配置dto2、公共参数dto3、请求参数dto4、响应参数dto4、调用工具类(重要&#x…

免费翻译API及使用指南——百度、腾讯

目录 一、百度翻译API 二、腾讯翻译API 一、百度翻译API 百度翻译API接口免费翻译额度:标准版(5万字符免费/每月)、高级版(100万字符免费/每月-需个人认证,基本都能通过)、尊享版(200万字符免…

matlab中simulink仿真软件的基础操作

(本内容源自《详解MATLAB/SIMULINK 通信系统建模与仿真》 刘学勇编著的第二章内容,有兴趣的可以阅读该书) 例:简单系统输入为两个不同频率的正弦、余弦信号,输出为两信号之和,建立模型。 在…

webpack源码深入--- webpack的编译主流程

webpack5的编译主流程 根据watch选项调用compiler.watch或者是compiler.run()方法 try {const { compiler, watch, watchOptions } create();if (watch) {compiler.watch(watchOptions, callback);} else {compiler.run((err, stats) > {compiler.close(err2 > {callb…

使用鸿蒙HarmonyOs NEXT 开发 快速开发 简单的购物车页面

目录 资源准备:需要准备三张照片:商品图、向下图标、金钱图标 1.显示效果: 2.源码: 资源准备:需要准备三张照片:商品图、向下图标、金钱图标 1.显示效果: 定义了一个购物车页面的布局&#x…

[方法] Unity 3D模型与骨骼动画

1. 在软件中导出3D模型 1.1 3dsmax 2014 1.1.1 TGA转PNG 3dsmax的贴图格式为tga,我们需要在在线格式转换中将其转换为Unity可识别的png格式。 1.1.2 模型导出 导出文件格式为fbx。在导出设置中,要勾选三角算法,取消勾选摄像机和灯光&#…

mysql解压版本安装5.7

1. 官网下载好解压版本 我这边5.7版本 https://dev.mysql.com/downloads/file/?id523570 mysql官网 创建 my.ini文件 内容如下 [client] #客户端设置,即客户端默认的连接参数# socket /data/mysqldata/3306/mysql.sock #用于本地连接的socket套接字 # 默…

运维锅总详解HAProxy

本文尝试从HAProxy简介、HAProxy工作流程及其与Nginx的对比对其进行详细分析;在本文最后,给出了为什么Nginx比HAProxy更受欢迎的原因。希望对您有所帮助! HAProxy简介 HAProxy(High Availability Proxy)是一款广泛使…

【知识学习】阐述Unity3D中Profile和性能的概念及使用方法示例

在Unity3D中,"Profile"和"性能"是两个相关但不同的概念,它们在游戏开发中扮演着重要的角色。 Profile(配置文件) "Profile"在Unity中通常指的是一种配置文件,它包含了一系列的设置和参…

JAVA医院绩效考核管理系统源码:系统优势、系统目的、系统原则 (自主研发 功能完善 可直接上项目)

JAVA医院绩效考核管理系统源码:系统优势、系统目的、系统原则 (自主研发 功能完善 可直接上项目) 医院绩效考核系统优势 1.实现科室负责人单独考核 对科室负责人可以进行单独考核、奖金发放。 2. 科室奖金支持发放到个人 支持奖金二次分配&…

Numpy array和Pytorch tensor的区别

1.Numpy array和Pytorch tensor的区别 笔记来源: 1.Comparison between Pytorch Tensor and Numpy Array 2.numpy.array 4.Tensors for Neural Networks, Clearly Explained!!! 5.What is a Tensor in Machine Learning? 1.1 Numpy Array Numpy array can only h…

已解决问题 | 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的

在Chrome浏览器中,如果你看到“该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的”这样的提示,通常是因为该扩展程序没有通过Chrome网上应用店进行安装。以下是解决这个问题的步骤: 解决办法:…

Bridging nonnull in Objective-C to Swift: Is It Safe?

Bridging nonnull in Objective-C to Swift: Is It Safe? In the world of iOS development, bridging between Objective-C and Swift is a common practice, especially for legacy codebases (遗留代码库) or when integrating (集成) third-party libraries. One importa…

uniapp+vue3开发微信小程序踩坑集

本文主要记录使用uniappvue3开发微信小程序遇见的各种常见问题及注意点。(持续更新) 问题: 自定义组件为什么有些样式加不上去 给自定义组件增加class的时候,有时候不生效有时候生效,一度让我怀疑自己记忆错乱。后来…

揭秘Etched AI:三个哈佛辍学00后挑战英伟达,推出Transformer专用ASIC芯片sohu

人工智能领域最近掀起了一股新的热潮,三位哈佛辍学的00后本科生创建了Etched AI,并成功推出了一款超强AI芯片sohu,直指英伟达的AI芯片帝国。这款芯片被誉为比英伟达H100快20倍,吸引了众多科技界的关注。本文将深入探讨Etched AI及…

css 布局出现无法去除的空白

案件介绍&#xff1a;在没有设置任何的css样式的情况下 文字顶部出现无法去除的空白 源代码 <div click"onClick" ><div class"tableTextButton--container"></div><Icon v-if"loading || thisLoading" type"ios-lo…

springboot的特点是什么?

Spring Boot是一个基于Spring框架的开源项目&#xff0c;它旨在简化Spring应用的初始搭建和开发过程。以下是Spring Boot的一些主要特点&#xff1a; 快速开发&#xff1a; Spring Boot提供了许多默认配置&#xff0c;使得开发者可以更快地开始开发应用程序&#xff0c;而无需…