标签:

1 介绍

数据库系统从诞生那天开始,就面对一个很棘手的问题,fsync的性能问题。组提交(group commit)就是为了解决fsync的问题。最近,遇到一个业务反映MySQL创建分区表很慢,仔细分析了一下,发现InnoDB在创建表的时候有很多fsync——每个文件会有4个fsync的调用。当然,并不每个fsync的开销都很大。

这里引出几个问题:

(1)问题1:为什么fsync开销相对都比较大?它到底做了什么?

(2)问题2:细心的人可以发现,第一次open数据文件后,第二次fsync的时间远远小于第1次调用fsync的时间,为什么?

(3)问题3:能否优化fsync?

来着这些疑问,一起来了解一下fsync。

2 原因分析

我们先通过一个测试程序来学习一下fsync在块层的基本流程。

2.1 测试程序1

Write page 0

Sleep 5

Fsync

用blktrace跟踪结果如下:

上半部红色框内为pwrite在块层的流程,下半部黄色框内为fsync在块层流程,中间刚好相差5秒。

4722712为测试文件的第1个block对应的扇区号,590339(block号) * 8=4722712(扇区号)。

无论是pwrite,还是fsync,主要的开销都发生IO请求提交给驱动和IO完成之间,也就是说开自设备驱动。差不多占了整个系统调用的1/2的开销。

另外,可以看到调用fsync时,发生了3次块层IO,起始扇区分别是19240、19248和19256,物理上3个连续的块。实际上这3个块为内核线程kjournald写的日志,分别描述块(2405)、数据块(2406)和提交块(2407)。为了验证,不妨看一下这三个块的实际数据。

块2405:

#define JFS_MAGIC_NUMBER 0xc03b3998U

#define JFS_DESCRIPTOR_BLOCK 1

#define JFS_COMMIT_BLOCK 2

开始的4个字节为JFS_MAGIC_NUMBER,然后是block type:JFS_DESCRIPTOR_BLOCK。

块2407:

的确是提交块。

2.2 fsync的实现

既然fsync的开销很大,就来看看代码吧。

函数ext3_sync_file:

函数log_start_commit负责唤醒kjounald内核线程,log_wait_commit等待jbd事务提交完成。

从代码来看,fsync的主要开销在于调用log_wait_commit后的等待。也就是说fsync要等待kjournald把事务提交完成,才会返回。

到这里,我们已经知道了fsync开销的主要来源:(1)硬件驱动层的开销;(2)ext3写日志。

另外,当log_start_commit返回0时,fsync就不会等待事务提交完成。到这里已经基本可以确认第2次fsync的开销为什么那么小了——没有wait事务提交。

下面验证这一想法。为了方便调试,打开了内核jbd debug日志。

2.3 测试程序2

Write page 0

Fsync

Write page 0

Fsync

Write page 1

Fsync

Write page 2

Fsync

从第2个红框的日志来看,第2次fsync时,的确是没有wait的,所以开销这么小,而其它3次fsync都调用了log_wait_commit函数。

问题4:第2次fsync为什么不会调用log_wait_commit?

因为挂载文件系统的时候,data=writeback,即写数据本身不会写jbd日志。第2次pwrite没有引起文件扩展,只会修改ext3 inode的i_mtime,而i_mtime只精确到second,也就是说第2次pwrite不会引起inode信息改变,所以,不会生成jbd日志,也就不需要等待事务提交完成。

下面验证一下该想法。

2.4 测试程序3

Write page 0

Fsync

Sleep 1 second

Write page 0

Fsync

Write page 1

Fsync

Write page 2

Fsync

在第2次pwrite之前,sleep 1秒钟,保证ext3 inode的i_mtime修改。

想法被证实了,第2次fsync的时间回到正常水平。

可以看到,第2次fsync调用提交了新的事务,并调用了log_wait_commit等待事务完成。

3 优化

如何优化fsync?是个难题。

(1)系统减少对fsync的调用。

作者:YY哥

出处:http://www.cnblogs.com/hustcat/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

mysql fsync_mysql fsync相关推荐

  1. mysql fsync_mysql分组提交和实时fsync

    Group commit and real fsync 分组提交和实时fsync During the recent months Ive seen few cases of customers up ...

  2. mysql fsync_MySQL - InnoDB特性 - Buffer Pool漫谈

    缓存管理是DBMS的核心系统,用于管理数据页的访问.刷脏和驱逐:虽然操作系统本身有page cache,但那不是专门为数据库设计的,所以大多数数据库系统都是自己来管理缓存.由于几乎所有的数据页访问都涉 ...

  3. mysql 郝朝阳_秒级故障切换!用MHA轻松实现MySQL高可用(三)

    作者介绍郝朝阳,运维工程师,专注于运维自动化的实现.现就职于宜搜科技,负责前端运维工作.虽然多方面开花,却致力于形成自己运维体系思想. 在上一篇的MHA介绍中提及过其它一些MySQL的高可用解决方案, ...

  4. mysql 给几个主键值 批量校验是否存在_MySQL基础知识整理

    MySQL基础架构 MySQL基础架构 简单来说MySQL主要分为Server层和存储引擎层.Server层主要包括连接器.查询缓存.分析器.优化器和执行器等,所有跨存储引擎的功能都在这一层实现,比如 ...

  5. 如何控制MySQL事务提交后,刷redo-log的策略?

    既然涉及到事务提交,那么我们就是以InnoDB来说明的. MySQL有一个参数,能够控制事务提交时,刷redo log的策略.该参数为:innodb_flush_log_at_trx_commit. ...

  6. mysql源码分析——InnoDB的内存结构分析

    一.基本的数据结构 在InnoDB中,数据的分配和存储也有自己的数据结构,在前面分析过MySql中的内存管理,但是内存管理是有一个不断抽象的过程.在InnoDB中还会有一层自己的内存管理.在InnoD ...

  7. mysql fsync_用一分钟了解: fsync这个系统调用!

    1前言 不要诧异在MySQL专题中突然插入fsync系统调用,因为马上就要和大家分享MySQL的undo log.redo log.bin log了,在分享这些文章的时候会经常说fsync这个名词,所 ...

  8. fsync mysql_使用O_DIRECT_NO_FSYNC来提升MySQL性能

    这篇文章很短,但很有价值~ MySQL下InnoDB存储引擎有个innodb_flush_method只读参数,用户设置InnoDB的数据和redo日志文件flush行为.defines the me ...

  9. php 面试mysql,mysql中优化必读

    通用规则 多读少写加缓存,少读多写加队列 带事务的不要整体commit,分段commit 一.要保证数据库的效率,要做好以下四个方面的工作: ① 数据库设计 ② sql语句优化 ③ 数据库参数配置 ④ ...

最新文章

  1. 使用LeNet对于旋转数字进行识别:合并数字集合
  2. mysql生成uui mybatis_mybatis----基础
  3. eclipse报Access restriction: The type 'BASE64Decoder' is not API处理方法
  4. CANN 5.0黑科技解密 | 算力虚拟化,让AI算力“物尽其用”
  5. JAVA基础——异常详解
  6. 【jQuery笔记Part4】01-jQuery-节点操作-添加节点-删除节点-复制节点
  7. 【问答】总结|开放领域问答梳理系列(1)
  8. 深入理解 Javascript 面向对象编程
  9. 葡萄酒酒进销存单机版_葡萄酒销售问题| 找到销售葡萄酒的最大利润
  10. 记休产假前的一些杂想
  11. 【408:计算机组成原理】起源:带你速看计算机伟大历史
  12. licecap图片区域问题
  13. 400错误,The server cannot or will not process the request due to something that is perceived to be a c
  14. 时间刻度线css,纯CSS时间轴列表
  15. Hadoop大数据入门到实战(第六节)- HDFS文件系统(JavaApi)
  16. 人工智能和机器学习在医疗领域中的应用
  17. Windows 下PowerShell 美化之旅(极其简单)
  18. Icon图标制作(转化)工具
  19. 辽宁省大连市谷歌高清卫星地图下载
  20. CSS3-KeyFrames

热门文章

  1. 流利阅读 2019.3.2 The Google and Apple app that helps Saudi men limit female relatives’ travel
  2. 密码算法分类 (学习笔记)
  3. 学习java的第一个实践练手项目---彩票预测系统
  4. 仔细看private与public的区别
  5. 软件构造—ADT的理解
  6. 使用opencv标定双目摄像头
  7. 那些年啊,那些事——一个程序员的奋斗史 ——51
  8. ubuntu 18.04 安装pycharm社区免费版
  9. itoa 头文件 linux,Linux下的itoa函数
  10. 介绍一款绝对好用的词典,比金山词霸好n倍