0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数据库为什么有可能喜欢Linux AIO(异步I/O)?

BN7C_zengshouji 来源:未知 作者:李倩 2018-09-11 10:42 次阅读

回忆一下

我们都知道Linux的IO模型有阻塞、非阻塞、SIGIO、多路复用(select,epoll)、AIO(异步I/O)等。

数据库可能比较倾向于使用AIO。从时序上面来讲,AIO是用户应用发起IO请求io_submit()后,它就不需要去等待,让后台给它搞定读写。之后本线程或者其他线程就可以通过io_getevents()去同步I/O的结果。

这样的AIO有一个极大的好处在于,IO不会阻塞住CPU的行为,有利于充分利用硬件的资源,有利于让CPU、IO都parallel起来 。当然,同样的动作,似乎用epoll()、SIGIO也可以呈现出来。尤其是epoll(),几乎是C10K问题解决方案在Linux的代名词。epoll_wait()先等待IO请求的read、write可以发生,而后再根据返回的事件发起读写请求:

事件驱动模型libevent等,看起来是事件到来,callback被执行的Reactor模式:

但是其底层其实也是靠epoll()来实现,这个我们透过strace就可以看出。请见我的3分钟小电影:

大不一样

epoll()本质上其实还是先等待IO的读写可以发生,而后再以Linux常规read()、write() API去发起IO请求。而AIO则是不管三七二十一,直接发IO请求,但是并不等待这个请求的结束,让Linux后台自己去完成读写。我们来看一个典型的AIO编程案例:

它是通过io_submit()把IO请求发出去之后,它并不需要等IO的结束。后面用io_getevents()去同步。上面的代码中,io_getevents()的代码与io_submit()的代码摆在一起,但是其实它们并不需要一定是同一个线程。

AIO和传统epoll()的本质区别是,epoll()等方式,它只是一个事件获取机制,获取事件后,之后的read(), write()还是要走Linux的传统路线,经过Linux内核本身的各个层次(如page cache,IO调度等)。而AIO是骨子里面,自己就是一个IO的方式,最终没有经过传统的Linux read(),write()这种"all is file"的类VFS接口。Linux native的AIO本身call的函数,本身就是系统调用。strace执行AIO动作的进程得到的直接就是类似如下的结果:

strace ./aio....

...

io_setup(128, {3077799936}) = 0

io_submit(3077799936, 1, 0xbfa5e730) = 1

io_getevents(-1217167360, 1, 1, {...}NULL) = 1

ARM Linux的系统调用表里也可以看出:

故而,AIO可以更多地把机会交给用户空间,让用户空间根据自身的IO特点来为自己量身定制IO的行为。AIO一般也直接结合DIO(direct IO)来使用,进一步绕开内核本身的IO调度和cache机制。

我中意你

那么AIO有什么可能的优势被数据库所青睐呢?

1. 透过AIO,可以屏蔽掉Linux内核底层的page cache。而制定application-level的cache机制。

我们都知道,Linux会针对每个文件对应的inode,创立一个address_space,并以Radix树来组织它的page cache命中情况,page的替换算法,整体是LRU,预测页面本身的活跃度。这个策略,固然非常符合局部性原理(Locality),但是不能针对用户程序本身的特征,进行用户级的cache。

2.透过AIO(尤其是结合DIO),可以一定程度上,进行用户级别的IO scheduling。采用AIO,用户可以控制发送给内核的IO请求,从而控制谁比谁更重要。内核固然有它的IO调度算法,但是它是比较general的。

3. 透过AIO,可以进行用户级别的read-ahead和write-behind控制。

我们都知道,Linux内核本身会根据用户的读请求,去预测后续的读,从而在后续的读还没有发起的情况下,就提前预读。详见:《宋宝华: 文件读写(BIO)波澜壮阔的一生》,但是这种预读的page,并不一定是上层应用想要的page。而内核的write-behind机制,也可能导致内核累积到很多dirty数据后,出现写磁盘的突发性洪泛。现在AIO机制,我们把这些都交给用户。

4. 透过AIO,不阻塞地在前台线程,直接dispatch IO请求,带来很好的

scalability。在InnoDB里面,可以透过innodb_use_native_aio来配置使用同步的IO还是AIO,而且它有一番对比,值得细细地品读。同步IO的时候,query threads是将IO请求放入queue,由InnoDB后台线程的每个线程处理一个IO请求。而AIO的时候,query threads直接发IO请求。

With synchronous I/O, query threads queue I/O requests, andInnoDBbackground threads retrieve the queued requests one at a time, issuing a synchronous I/O call for each. When an I/O request is completed and the I/O call returns, the InnoDBbackground thread that is handling the request calls an I/O completion routine and returns to process the next request. The number of requests that can be processed in parallel isn, wherenis the number ofInnoDBbackground threads. The number ofInnoDBbackground threads is controlled byinnodb_read_io_threadsand innodb_write_io_threads.

With native AIO, query threads dispatch I/O requests directly to the operating system, thereby removing the limit imposed by the number of background threads.InnoDBbackground threads wait for I/O events to signal completed requests. When a request is completed, a background thread calls an I/O completion routine and resumes waiting for I/O events.

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10831

    浏览量

    211215
  • Linux
    +关注

    关注

    87

    文章

    11233

    浏览量

    208973
  • 数据库
    +关注

    关注

    7

    文章

    3769

    浏览量

    64291

原文标题:今年是“异型屏”转换年!华映看好手机市场Q4复苏

文章出处:【微信号:zengshouji,微信公众号:MCA手机联盟】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux设备驱动中的异步通知与异步I/O

    (struct fasync_struct **fa, int sig, int band);Linux 2.6 异步I/OAIO概念与GNU C库函数AIO基本思想是允许进程发起很多
    发表于 02-21 10:52

    Android如何使用Db4o数据库

    db4o是一个被广泛欢迎的面向对象数据库,起初它基于Java平台,而后发布了.Net平台的版本,db4o具有双授权(GPLv2和商业授 权),所以在很多开源项目中都可以看到db4o的身
    发表于 05-24 07:32

    Linux上安装Oracle 11g数据库

    Linux上安装Oracle 11g数据库
    发表于 09-07 09:14 3次下载
    <b class='flag-5'>Linux</b>上安装Oracle 11g<b class='flag-5'>数据库</b>

    Java I/O 的相关方法分析

    (select and poll),signal driven I/O (SIGIO),asynchronous I/O (the POSIX a
    发表于 09-27 13:18 0次下载
    Java <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 的相关方法分析

    Linux教程之linux下如何备份还原mysql数据库

    本文介绍了linux下如何备份与恢复mysql数据库数据库备份是非常重要的。如果定期做好备份,这样就可以在发生系统崩溃时恢复数据到最后一次正常的状态,把损失减小到最少。
    发表于 10-19 17:18 4次下载

    数据库学习教程之数据库的发展状况如何数据库什么新发展

    本文档的主要内容详细介绍的是数据库学习教程之数据库的发展状况如何数据库什么新发展主要内容包括了:1 数据库技术发展概述2
    发表于 10-25 16:29 5次下载
    <b class='flag-5'>数据库</b>学习教程之<b class='flag-5'>数据库</b>的发展状况如何<b class='flag-5'>数据库</b><b class='flag-5'>有</b>什么新发展

    数据库哪些常见的应用结构数据库应用结构的使用资料概述

    本文档的主要内容详细介绍的是数据库哪些常见的应用结构数据库应用结构的使用资料概述 数据库常见的应用结构:1.集中式结构2.文件服务器结构
    发表于 10-31 16:57 11次下载
    <b class='flag-5'>数据库</b><b class='flag-5'>有</b>哪些常见的应用结构<b class='flag-5'>数据库</b>应用结构的使用资料概述

    嵌入式Linux 异步IO机制

    : 用户进程可以对I/O事件进行阻塞,但是I/O操作并不阻塞。通过select/poll/epoll等函数调用来达到此目的。4. 异步时间非
    发表于 04-02 14:31 345次阅读

    数据库和自建数据库的区别及应用

    数据库是指优化和部署在云端的数据库,阿里云和腾讯云都提供云数据库,云数据库和自己搭建的数据库
    的头像 发表于 11-20 16:26 4586次阅读
    云<b class='flag-5'>数据库</b>和自建<b class='flag-5'>数据库</b>的区别及应用

    Linux中如何使用信号驱动式I/O

    一、Linux 的 5 种 IO 模型 二、如何使用信号驱动式 I/O? 三、内核何时会发送 “IO 就绪” 信号? 四、最简单的示例 五、扩展知识 一、Linux 的 5 种 IO
    的头像 发表于 03-12 14:47 2394次阅读
    <b class='flag-5'>Linux</b>中如何使用信号驱动式<b class='flag-5'>I</b>/<b class='flag-5'>O</b>?

    数据库知识

    数据时代的数据库 --数据采集、数据清洗和分析、数据可视化:提供决策依据 openGauss是一款高性能、高安全、高可靠的企业级开源关
    发表于 06-09 16:10 0次下载

    连接到您最喜欢数据库

    DbVisualizer连接到所有流行的数据库,并支持特定于数据库的对象类型等。
    的头像 发表于 08-11 16:45 616次阅读

    轻量级数据库哪些

    轻量级数据库哪些 随着互联网和物联网等新一代信息技术的广泛应用,数据库系统也变得越来越重要。人们对于数据库数据库的可靠性、安全性和性能等要
    的头像 发表于 08-28 16:41 5892次阅读

    数据库数据恢复—SQL Server数据库出现823错误的数据恢复案例

    SQL Server数据库故障: SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库
    的头像 发表于 09-20 11:46 297次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—SQL Server<b class='flag-5'>数据库</b>出现823错误的<b class='flag-5'>数据</b>恢复案例

    数据库数据恢复—通过拼接数据库碎片恢复SQLserver数据库

    一个运行在存储上的SQLServer数据库1000多个文件,大小几十TB。数据库每10天生成一个NDF文件,每个NDF几百GB大小。数据库包含两个LDF文件。 存储损坏,
    的头像 发表于 10-31 13:21 145次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—通过拼接<b class='flag-5'>数据库</b>碎片恢复SQLserver<b class='flag-5'>数据库</b>