--MySQL数据库IO问题

----------------------2014/05/25

    看http://www.mysqlperformanceblog.com 的时候,发现Percona Server已经发布到 5.1.58了,其中有一个重大的性能改进在flush 日志文件和doublewrite buffer的时候,使用fdatasync()代替fsync(),具体描述如下:
 
fsync() has been replaced with fdatasync() to improve perfomance where possible. The former is intended to sync the metadata of the file also (size, name, access time, etc.), but for the transaction log and the doublewrite buffer, such sync of metadata isn’t needed. Bug Fixed: #803270 (Yasufumi Kinoshita).
 
下面来介绍下fsync()和 fdatasync()函数吧:
 
传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存(OS Cache),大多数磁盘 I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写 (delayed write)。
 
延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,UNIX系统提供了 sync、fsync和fdatasync三个函数。
 
sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。应该说,速度最快。
 
通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区。命令sync(1)也调用sync函数。
 
fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。fsync可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。速度最慢。
 
fdatasync函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。速度介于二者之间。
 
那么Innodb中,配置参数innodb_flush_method有三个值,分别是fdatasync,O_DSYNC和O_DIRECT,其中fdatasync是默认值。它们控制了InnoDB刷新日志和数据的模式,这个参数对MySQL的性能有较大的影响。
 
fdatasync: 
InnoDB使用fsync()函数去更新日志和数据文件。
O_DSYNC: 
InnoDB使用O_SYNC模式打开并更新日志文件,用fsync()函数去更新数据文件。
O_DIRECT: 
InnoDB使用O_DIRECT模式打开数据文件,日志文件不使用O_DIRECT标记,用fsync()函数去更新日志和数据文件。

我们目前的线上库,该配置参数设置的是O_DIRECT,数据文件的读/写操作都会跳过OS cache,直接在device(disk)上读/写。因为没有了OS cache,所以会O_DIRECT降低文件的顺序读写的效率(因为是直接对磁盘进行操作)。如果不使用O_DIRECT,操作系统被迫开辟大量的Cache来缓存读写数据,不但没有提高读写性能,反而造成读写性能急剧下降(Flush的话,相当于要先Flush到缓存,再在一定得条件下把缓存的结果Flush到磁盘,相当于写了两遍),而且buffer pool的数据缓存和OS Cache都缓存了同样的数据,造成了Buffer的Double(浪费!),因此有可能造成性能的大幅下降。

使用O_DIRECT选项,通常需要带有写缓存的RAID卡,并且设置为Write-Back策略(就是写入会在RAID卡缓存上进行缓冲,不直接写到硬盘),因为这是典型的唯一能保持好性能的方法。

日志缓冲IO

日志缓冲必须被双信道持久化存储,已确保提交的事务完全被持久化,此动作方式可有参数innodb_flush_log_at_trx_commit变量来控制。

  把日志缓冲写到日志文件,并且每秒刷新一次,但是事务提交时不做任何事。

  将日志缓冲写到日志文件,并且每次事务提交都刷新到持久化存储。

  每次提交时把日志缓冲写到日志文件,但是并不刷新。

-----------------------------------------------------这是提到的刷新,就是使用我们上文提到的刷新策略。

具体参考下图:

MySQL数据库IO问题的更多相关文章

  1. mysql数据库性能优化(包括SQL,表结构,索引,缓存)

    优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...

  2. MySQL 数据库性能优化之缓存参数优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...

  3. MySQL数据库在IO性能优化方面的设置选择(硬件)

    提起MySQL数据库在硬件方面的优化无非是CPU.内存和IO.下面我们着重梳理一下关于磁盘I/O方面的优化. 1.磁盘冗余阵列RAID RAID(Redundant Array of Inexpens ...

  4. [原创]java使用JDBC向MySQL数据库批次插入10W条数据测试效率

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?在JDBC编程接口中Statement 有两个方法特别值得注意:通过使用addBatch( ...

  5. mysql数据库开发常见问题及优化

    mysql 数据库是被广泛应用的关系型数据库,其体积小.支持多处理器.开源并免费的特性使其在 Internet 中小型网站中的使用率尤其高.在使用 mysql 的过程中不规范的 SQL 编写.非最优的 ...

  6. 如何在删除ibdata1和ib_logfile的情况下恢复MySQL数据库

    昨天,有个朋友对公司内部使用的一个MySQL实例开启binlog,但是在启动的过程中失败了(他也没提,为何会失败),在启动失败后,他删除了ibdata1和ib_logfile,后来,能正常启动了,但所 ...

  7. MYSQL数据库的优化

    我们究竟应该如何对MySQL数据库进行优化?下面我就从MySQL对硬件的选择.MySQL的安装.my.cnf的优化.MySQL如何进行架构设计及数据切分等方面来说明这个问题. 服务器物理硬件的优化 在 ...

  8. java 通过jdbc连接MySQL数据库

    先了解下JDBC的常用接口 1.驱动程序接口Driver 每种数据库的驱动程序都应该提供一个实现java.sql.Driver接口的类,简称Driver类.通常情况下,通过java.lang.Clas ...

  9. 利用oneproxy部署mysql数据库的读写分离

    实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 oneproxy-rhel ...

随机推荐

  1. angularjs directive (自定义标签解析)

    angularjs directive (自定义标签解析) 定义tpl <!-- 注意要有根标签 --> <div class="list list-inset" ...

  2. web前端CSS2学习2017.6.17

    CSS---表现层,修饰和表现html文档,为了解决结构层和表现层分离的问题. 通过CSS极大的提高了工作效率,方便工作人员维护和管理CSS:层叠样式表,目前用的最广泛的css版本为css2,最新版本 ...

  3. 浅谈 Requests包

    浅谈 Requests包 一:Requests包是做什么的? 简单地说,是用python处理HTTP的一个包. 它的标志也非常有气质,是一个双蛇杖,按照官方的说法,一条蛇代表client,一条代表se ...

  4. 从 RequireJs 源码剖析脚本加载原理

    引言 俗话说的好,不喜欢研究原理的程序员不是好的程序员,不喜欢读源码的程序员不是好的 jser.这两天看到了有关前端模块化的问题,才发现 JavaScript 社区为了前端工程化真是煞费苦心.今天研究 ...

  5. 改进log4go的一些设想

    log4go 的 4.0.2 版本(https://github.com/ccpaging/log4go/tree/4.0.2)发布以后, 看了看别的 go 语言日志文件设计.发现了一篇好文: log ...

  6. 钉钉 机器人接入 自定义webhook

    钉钉出了个webhook机器人接入,自定义的机器人支持随时post消息到群里: 昨天就尝试着用C#写了个: 一开始用python写,但是莫名的提示  {"errmsg":" ...

  7. Serv-U权限设置规则

    Serv-U有服务器--域--组--用户四级账号管理规则,每一级都有相应的根目录,目录访问规则和虚拟路径的设置. 同样其他一些重复设置还有很多,如此很容易给人造成混乱--如果我哪里都设置的话会不会造成 ...

  8. 快速了解cpu、核与线程

    作为一个后台开发人员,我想有必要了解这些基础知识.如果本文有不严谨或者疏忽的地方,请指正. cpu与核心 物理核 物理核数量=cpu数(机子上装的cpu的数量)*每个cpu的核心数 虚拟核 所谓的4核 ...

  9. (转)java中对集合对象list的几种循环访问总结

    Java集合的Stack.Queue.Map的遍历   在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...

  10. Java实现简单文件过滤器

    输入路径查找该路径下的指定文件类型的文件 代码思路: 想要循环遍历文件夹下所有子文件夹,就要用到递归. 首先判断路径是否存在: 是:获取文件 判断是否文件夹: 是:调用自身,继续获取子文件夹下内容 否 ...