最近在测试种发现程序里调用fsync刷文件到磁盘时,开销只有几百微秒,于是对fsync相关机制进行了一番调查。

磁盘(或RAID卡)自身通常会有硬件缓存机制,对于写操作,有write back和write through两种机制,前者将数据写至缓存就会返回,而后者则会将数据写到磁盘介质上。当使用write back机制时,fsync刷的文件数据可能只是写到磁盘缓存就返回了,导致从应用看来,写数据到磁盘的开销很小(实际上并未执行磁盘写操作);所以,使用write back机制时,即使上层应用显式fsync成功,数据也是可能丢失的,比如缓存里的数据还未刷到磁盘时掉电了,有些存储设备会使用备用电池(BBU,Battery backup unit)来避免掉电时缓存数据丢失。

如果要保证fsync调用成功后,数据一定持久化到磁盘,则要使用内核的write barrier机制。该机制通过在IO操作之前和之后显式刷新存储设备的缓存来达到目的,在文件系统mount的时候可以指定是否开启barrier机制,ext4默认启用barrier机制。

对于内存映射(mmap)的文件数据,msync的功能与fsync类似,将内存映射数据刷到磁盘,msync使用时有3个标志。

  • MS_SYNC,数据同步刷到磁盘后返回(可能只是写到磁盘缓存)
  • MS_ASYNC, 对于更新的文件数据会提交IO操作到底层,但不会等IO操作执行完成,而是立即返回
  • MS_INVALIDATE,更新文件对应的其它映射数据(如内存区域M1、M2都映射了文件F的数据,如果在msync M1的时候指定了该标记,则M2内存区域里的数据也会被更新)。

要想映射内存msync后被持久化到磁盘,需要使用MS_SYNC标记;而msync调用后数据是否一定持久化,则要看存储设备使用的缓存机制以及内核write barrier是否启用。

fsync性能问题的更多相关文章

  1. 【珍藏】linux 同步IO: sync、fsync与fdatasync

    传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列, ...

  2. 第1讲 Redis部署与基本操作

    目录 一.简介 二.安装 1.默认安装位置 2.指定安装位置 3.安装的可执行文件的作用 三.启动与关闭 四.配置文件 五.Redis的数据类型 1. 共计5种类型 2. String(子串类型) 3 ...

  3. Redis学习笔记一:基本安装和配置

    1.安装 wget http://download.redis.io/releases/redis-3.2.3.tar.gz编译安装: tar xf redis-3.2.3.tar.gz cd red ...

  4. redis 优化

    系统优化echo "vm.overcommit_memory=1" > /etc/sysctl.conf 0, 表示内核将检查是否有足够的可用内存供应用进程使用:如果有足够的 ...

  5. Redis配置文件之————redis.conf配置及说明

    基本设置 1. 备释当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写):1k =< 1000 bytes1kb =< 1024 by ...

  6. innodb关键特性之double write

    # 脏页刷盘的风险 两次写的原理机制 1.解决问题 2.使用场景 3.doublewrite的工作流程 4.崩溃恢复 # doublewrite的副作用 1.监控doublewrite负载 2.关闭d ...

  7. InnoDB的4个特性

    innodb 的四个特性 insert buffer innodb使用insert buffer"欺骗"数据库:对于为非唯一索引,辅助索引的修改操作并非实时更新索引的叶子页,而是把 ...

  8. InnoDB表优化

    InnoDB表存储优化 适时的使用 OPTIMIZE TABLE 语句来重组表,压缩浪费的表空间.这是在其它优化技术不可用的情况下最直接的方法. OPTIMIZE TABLE 语句通过拷贝表数据并重建 ...

  9. redis conf 详解

    2.8配置 # Redis configuration file example # Note on units: when memory size is needed, it is possible ...

随机推荐

  1. CMS搭建,织梦CMS使用教程

    http://www.dedejs.com/ 织梦DedeCms 5.7全站去版权去广告方法(含后台) http://429006.com/article/technology/3367.htm 1. ...

  2. kubectl&docker容器命令行窗口太小

      #k8s  kubectl exec -ti busybox env COLUMNS=$COLUMNS LINES=$LINES bash #k8s example kubectl exec -t ...

  3. 数据双向绑定页面无反应(angularjs)

    问题引入 使用 angularjs进行过一段时间的开发后,基本上都会遇到一个这样的坑:页面进行了双向数据绑定,控制层的数据也已经改变了,但是视图层的数据却没有改变. 其实造成这个问题的原因大致分为以下 ...

  4. 使用cookie纪录访问次数

    由于是简单的demo,我就没有链接数据库,退出重新登陆访问次数清零,只能靠下刷新来维持下访问次数 把用户名和次数初始化放进cookie Cookie uesrnameCookie = new Cook ...

  5. java的try-with-resource机制

    在java7之后可以使用try(resource1, resource2){...}这样声明之后,在try{}执行完成之后或者抛异常跳出,都会调用reouce1.close(),resource2.c ...

  6. Android 操作文件系统失败: Read-only file system

    现象: $ adb push /d/Aaron/Desktop/libreference-ril-LS.so system/lib failed to copy 'D:/Aaron/Desktop/l ...

  7. ubuntu :安装skype聊天工具

    如题,今天就想搞个软件在ubuntu能聊天,查一下skype,好像网上有人说不是每个安装包都用的了,skype-ubuntu-precise_4.2.0.13-1_i386.deb可以, 我在微盘下载 ...

  8. dts、dtb编译

    设备树(Device Tree)包括DTC(device tree compiler),DTS(device tree source和DTB(device tree blob). dtc编译器能够把 ...

  9. 部署docker

    部署和开发环境不一样,我们不需要频繁地进入到容器内部,所以一般我们会将代码和环境打包到一块,部署到服务器上 Clone 代码 将项目代码克隆到本地 git clone git@git.coding.n ...

  10. MySql触发器实现数据同步学习

    触发器实现:(增.删.改操作事件触发数据单向同步)数据库触发器教程:https://www.cnblogs.com/phpper/p/7587031.html同步代码: DELIMITER $ DRO ...