Flush neighbor page

  1、工作原理

  2、参数控制

AIO

  1、开启异步IO

一、刷新邻接页功能

1、工作原理

  当刷新一个脏页时,innodb存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。这样做的好处显而易见,通过AIO可以将多个IO写入操作合并为一个IO操作,增大写入量,减少了物理写IO,故该工作机制在传统机械磁盘下有着显著的优势。

  1、在写入次数基本不增加的情况下,增加了写入的量;

  2、加速了脏页的回收;

  3、充分利用double write每次1M写入的特征;

  4、这个功能打开以后会发现iostat里面的wrqm(合并写)这个值会比较高;

2、问题考虑

  1、是不是可能将不怎么脏的页进行了写入,而该页之后又会很快变成脏页?

  2、固态硬盘有着较高的 IOPS,是否还需要这个特性?

  为此,InnoDB 存储引擎从 1.2.x 版本开始提供了参数 innodb_flush_neighbors,用来控制是否启用该特性。对于传统机械硬盘建议启用该特性,而对于固态硬盘有着超高 IOPS 性能的磁盘,则建议将该参数设置为 0、即关闭此特性。

3、参数控制:innodb_flush_neighbors

mysql> show variables like '%neigh%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| innodb_flush_neighbors | 1 |  #默认刷新邻接页功能开启
+------------------------+-------+
1 row in set (0.00 sec)

  1,表示打开了刷新邻接页的功能,顺带着刷新在 buffer pool 中位于磁盘上相同的 extend 区的相邻的脏页。

  0,表示关闭刷新邻接页

  2 ,表示刷新在 buffer pool 中位于磁盘上相同的 extend 区的脏页。

4、Flush neighbor page的影响

  1、对于insert频繁的系统,这个功能比较适合

  2、对于update频繁的系统,这个功能可能会带来一些副作用

    1、update顺带着刷新其他页;

    2、对于update频繁的表,这些页马上就脏了,白白浪费写负载。

二、异步IO功能

1、关于AIO与SIO

  为了提高磁盘操作性能,当前的数据库系统都采用异步IO的方式来处理磁盘操作。

  1、异步IO:用户可以在发出一个IO请求后立即再发出另外一个IO请求,当全部IO请求发送完毕后,等待所有IO操作完成,这就是AIO。

  2、与AIO对应的是Sync IO,即每进行一次IO操作,需要等待此次操作结束才能继续接下来的操作。

2、开启异步IO

  首先OS要有异步io,且开启,然后mysqld要链接,要不然OS异步io没有开启,数据库的异步io也起不来。(this variable applies to Linux systems only, and cannot be changed while the server is running.)

  1、文件系统层面需要打开这个功能:一般都是默认开启的。

[root@localhost /]# ldconfig -v|grep libaio
libaio.so.1.0. -> libaio.so.1.0.
libaio.so. -> libaio.so.1.0.

  2、AIO是数据库层面的一个特性需要打开:默认是开启,开启的native aio性能提升,可以提高到75%。

mysql> show variables like 'innodb_use_native_aio';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_use_native_aio | ON |
+-----------------------+-------+
1 row in set (0.00 sec)

3、异步IO的好处  

  1、不用等待直接响应上一个用户的请求;

  2、多次的请求在一起排序,请求的数据页是在一起的,一次读出来,减少多次读。(数据库的读写请求队列放在文件系统中单独分配的一块小内存结构里,非文件系统的缓存)

4、wio:wait io

  1、同步IO一定会产生wait IO

  2、异步IO会降低wait IO,但是也可能会有wait IO

  3、尽量采用异步IO(性能高于同步IO)

  4、数据库层面启用异步IO

  5、文件系统层面启用异步IO,Linux具备异步IO的能力

  6、操作系统层面wio的含义理解

[root@localhost /]# sar
Linux 2.6.-.el6.x86_64 (one) // _x86_64_ ( CPU) :: AM CPU %user %nice %system %iowait %steal %idle
:: AM all 0.17 0.00 0.33 0.00 0.00 99.50
:: AM all 0.00 0.00 1.00 0.00 0.00 99.00
^C
[root@localhost /]# iostat
Linux 2.6.-.el6.x86_64 (one) // _x86_64_ ( CPU) avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.02 0.02 0.00 99.96 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.26 6.70 4.07
scd0 0.00 0.00 0.00

  说明进程或是线程等待io的时间,值最好是小于5,大于25一定是io有问题。

在InnoDB存储引擎中,read ahead方式的读取都是通过AIO完成,脏页的刷新,也是通过AIO完成。

InnoDB关键特性之刷新邻接页-异步IO的更多相关文章

  1. InnoDB关键特性学习笔记

    插入缓存 Insert Buffer Insert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能.不过这个名字可能会让人认为插入缓冲是缓冲池中的一个组成部分.其实不然,Inn ...

  2. innodb 关键特性(两次写与自适应哈希索引)

    两次写: 场景: 当发生数据库宕机时,可能innodb存储引擎正在写入某个页到表中,而这个页只写了一部分,这种情况被称为部分写失效,如果发生,可以通过重做日志进行恢复,重做日志中记录的是对页的物理操作 ...

  3. innodb关键特性之double write

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

  4. InnoDB关键特性之doublewrite

    部分写失效 想象这么一个场景,当数据库正在从内存向磁盘写一个数据页时,数据库宕机,从而导致这个页只写了部分数据,这就是部分写失效,它会导致数据丢失.这时是无法通过重做日志恢复的,因为重做日志记录的是对 ...

  5. InnoDB关键特性之insert buffer

    insert buffer 是InnoDB存储引擎所独有的功能.通过insert buffer,InnoDB存储引擎可以大幅度提高数据库中非唯一辅助索引的插入性能. 数据库对于自增主键值的插入是顺序的 ...

  6. InnoDB关键特性之change buffer

    一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主 ...

  7. InnoDB关键特性之自适应hash索引

    一.索引的资源消耗分析 1.索引三大特点 1.小:只在一个到多个列建立索引 2.有序:可以快速定位终点 3.有棵树:可以定位起点,树高一般小于等于3 2.索引的资源消耗点 1.树的高度,顺序访问索引的 ...

  8. innodb 关键特性(insert buffer)

    一.insert buffer 性能改善 insert buffer和数据页一样,也是物理页的一个组成部分. 在innodb存储引擎中,主键是行唯一的标识符.通常应用程序中行记录的插入顺序是按照主键递 ...

  9. Innodb关键特性之自适用Hash索引

    一.索引的资源消耗分析 1.索引三大特点 1.小:只在一个到多个列建立索引 2.有序:可以快速定位终点 3.有棵树:可以定位起点,树高一般小于等于3 2.索引的资源消耗点 1.树的高度,顺序访问索引的 ...

随机推荐

  1. 简单介绍phpcms以及phpcms如何安装?

    一.先大体介绍一下phpcms,及存放位置 1.将phpcms放在www目录下的phpcms,并解压 其中,readme 没什么用,重要的是install_package; 2.打开install_p ...

  2. Linux版微信

    一.到github上下载https://github.com/geeeeeeeeek/electronic-wechat/releases下载linux-x64.tar.gz,具体根据操作系统是32位 ...

  3. [转] SOLID五大设计原则

    我们知道,面向对象对于设计出高扩展性.高复用性.高可维护性的软件起到很大的作用.我们常说的SOLID五大设计原则指的就是:       S = 单一职责原则 Single Responsibility ...

  4. SICP-1.6-高阶函数

    高阶函数 将函数作为参数 例如 def sum_naturals(n): total, k = 0, 1 while k <= n: total, k = total + k, k + 1 re ...

  5. (1)认识javascript

    认识javascript 在本篇学习资料中,讲解javascript的基本概念.编写工具.在html中的使用: JavaScript 是脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务 ...

  6. zend studio里面这块注释是用什么快捷键按出来的?

    写完类或函数(注意必须写完,不然出现的信息会不完整)后,在其上方空行输入/**,然后回车 /** * * @param string $a * @param string $b * @param st ...

  7. Hibernate缓存和懒加载的坑你知道多少?这5个简单问题回答不上来就不敢说会用hibernate

    问题1:session.flush()调用之后,懒加载还生效吗? 如果不生效,那是抛异常还是没有任何反应,或者直接返回null? 答案:生效.可以理解为在同一个session当中,懒加载只会执行一次. ...

  8. Kafka 源代码分析之MessageSet

    这里分析MessageSet类 MessageSet是一个抽象类,定义了一条log的一些接口和常量,FileMessageSet就是MessageSet类的实现类.一条日志中存储的log完整格式如下 ...

  9. 第一章(认识jQuery)

    1.3.2编写简单的jQuery代码 ①$是jQuery的简写 ②$("#foo") = $("#foo") ③$.ajax  =  jQuery.ajax ④ ...

  10. KBEngine WebConsole Guide

    https://github.com/kbengine/kbengine/tree/master/docs