fsync性能问题
最近在测试种发现程序里调用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性能问题的更多相关文章
- 【珍藏】linux 同步IO: sync、fsync与fdatasync
		传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列, ... 
- 第1讲 Redis部署与基本操作
		目录 一.简介 二.安装 1.默认安装位置 2.指定安装位置 3.安装的可执行文件的作用 三.启动与关闭 四.配置文件 五.Redis的数据类型 1. 共计5种类型 2. String(子串类型) 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 ... 
- redis 优化
		系统优化echo "vm.overcommit_memory=1" > /etc/sysctl.conf 0, 表示内核将检查是否有足够的可用内存供应用进程使用:如果有足够的 ... 
- Redis配置文件之————redis.conf配置及说明
		基本设置 1. 备释当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写):1k =< 1000 bytes1kb =< 1024 by ... 
- innodb关键特性之double write
		# 脏页刷盘的风险 两次写的原理机制 1.解决问题 2.使用场景 3.doublewrite的工作流程 4.崩溃恢复 # doublewrite的副作用 1.监控doublewrite负载 2.关闭d ... 
- InnoDB的4个特性
		innodb 的四个特性 insert buffer innodb使用insert buffer"欺骗"数据库:对于为非唯一索引,辅助索引的修改操作并非实时更新索引的叶子页,而是把 ... 
- InnoDB表优化
		InnoDB表存储优化 适时的使用 OPTIMIZE TABLE 语句来重组表,压缩浪费的表空间.这是在其它优化技术不可用的情况下最直接的方法. OPTIMIZE TABLE 语句通过拷贝表数据并重建 ... 
- redis conf 详解
		2.8配置 # Redis configuration file example # Note on units: when memory size is needed, it is possible ... 
随机推荐
- 查找大文件 & 索引节点(inode)爆满 解决办法
			经常遇到磁盘满或者文件节点满的情况,整理如下 查找大文件 查找超过某个大小的文件, 如1G find . -type f -size +1G 查找文件大小的时候,现实文件属性 find . -type ... 
- .NET平台上的Model-View-Presenter模式实践
			为什么要写这篇文章 笔者当前正在负责研究所中一个项目,这个项目基于.NET平台,初步拟采用C/S部署体系,所以选择了Windows Forms作为其UI.经过几此迭代,我们发现了一个问题:虽然业务逻辑 ... 
- L2TP/IPSec一键安装脚本
			本脚本适用环境:系统支持:CentOS6+,Debian7+,Ubuntu12+内存要求:≥128M更新日期:2017 年 05 月 28 日 关于本脚本:名词解释如下L2TP(Layer 2 Tun ... 
- open和close函数
			1.open函数的使用 调用open函数可以打开或创建一个文件 #include <sys/stat.h> #include <fcntl.h> #include <sy ... 
- 修改 CentOS 中的 repo
			修改 CentOS 中的 repo 原因 由于安装 odoo 10 太慢,因为服务器是国外的. 修改 进入 repo 文件夹 cd /etc/yum.repos.d/ ls 可以看到所有的源. 
- 【STL源码学习】std::list类的类型别名分析
			有了点模板元编程的traits基础,看STL源码清晰多了,以前看源码的时候总被各种各样的typedef给折腾得看不下去, 将<list>头文件的类继承结构简化如下 #include < ... 
- java代码啊==indexOf()方法返回字符第一次出现的位置
			package com.s.x; public class Wang { public static void main(String[] args) { if ("woaini" ... 
- 杂项:大数据 (巨量数据集合(IT行业术语))
			ylbtech-杂项:大数据 (巨量数据集合(IT行业术语)) 大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞 ... 
- USB驱动程序之概念介绍学习笔记
			现象:把USB设备接到PC 1. 右下角弹出"发现android phone" 2. 跳出一个对话框,提示你安装驱动程序 问1. 既然还没有"驱动程序",为何能 ... 
- mac环境下IDEA无法下载plugin或者自动下载Library
			卧槽,原谅我这么晚还在写blog,明天早上还要上班. 问题,idea 新建springmvc无法自动下载lib,报这个: you have JVM property "https.proxy ... 
