zoukankan      html  css  js  c++  java
  • mysql-5.7 Using Asynchronous I/O on Linux详解

    一、mysql - innodb 使用异步IO的场景

      总的来说innodb 只会对数据文件采用异步IO,为了保存日志是真正被写入到磁盘,innodb不会对日志文件启用异步IO

      更新细一步的说,innodb只会对数据文件的read-ahead ,write 这两个操作启用异步IO

    二、异步IO在mysql中解决了什么问题:

      在没有IO这个功能之前,innodb对数据的读写请求先放入任务队列,后台read-thread ,write-thread从任务队列中

      拿出任务并执行读写操作;后台读写线程的个数可以通过show engine innodb status 语句来查看

    show engine innodb status;
    
    --------
    FILE I/O
    --------
    I/O thread 0 state: waiting for i/o request (insert buffer thread)
    I/O thread 1 state: waiting for i/o request (log thread)
    I/O thread 2 state: waiting for i/o request (read thread)
    I/O thread 3 state: waiting for i/o request (read thread)
    I/O thread 4 state: waiting for i/o request (read thread)
    I/O thread 5 state: waiting for i/o request (read thread)
    I/O thread 6 state: waiting for i/o request (write thread)
    I/O thread 7 state: waiting for i/o request (write thread)
    I/O thread 8 state: waiting for i/o request (write thread)
    I/O thread 9 state: waiting for i/o request (write thread)
    Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
     ibuf aio reads:, log i/o's:, sync i/o's:
    Pending flushes (fsync) log: 0; buffer pool: 0
    376 OS file reads, 54 OS file writes, 7 OS fsyncs
    41.77 reads/s, 21886 avg bytes/read, 6.00 writes/s, 0.78 fsyncs/s

      由上面的内容可以看出默认情况下innodb会有4个read-thread 和4个write-thread ,问题就出现在这里,如果业务繁重,那么

      读写任务就会非常的多,而innodb只有八个读写线程,这样的话队列中的其它读写请求就没能得到及时的响应。

      

      引入异步IO之后就变天啦,读写请求不再像之前那样先放入队列,等着后台的读写线程去执行任务;而是查询线程直接发起异步

      请求,这样一来冲破了读写线程个数的硬性限制,二来由于异步IO是否阻塞的这也进一步提高了性能。

    三、怎么启用mysql异步IO:

      在linux系统下的mysql版本默认是开启异步IO的,当然啦也可以在配置文件中明确的指定启用异步IO

    [mysqld]
    innodb_use_native_aio=ON

    四、说了这么多异步IO的优点,难道它就这么完美吗:

      启用异步IO之后,由于每一个查询线程都能发起IO请求,不在经由后台的读写线程;也就是说在启用异步IO

      的情况下相当于是我们把IO的控制权交出去了。

     ----

    交流学习&打赏

  • 相关阅读:
    You need to use a Theme.AppCompat theme
    Objective-C中nil与release的区别与用法
    objective-c中自己创建的对象为什么不能调用release
    NSString类的相关用法
    [Bug-IOS]
    中国有什么旅游社交网站吗?
    om.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException
    【剑指Offer学习】【面试题22:栈的压入、弹出序列】
    2-08. 用扑克牌计算24点(25) (ZJU_PAT 数学 枚举)
    在北京工作了两年,如今跳槽到了广州,社保公积金该怎样办理?
  • 原文地址:https://www.cnblogs.com/JiangLe/p/7513846.html
Copyright © 2011-2022 走看看