对于块设备而言,linux可以使用同步IO、POSIX IO、linux AIO、io-uring,前俩者是linux的同步IO接口,后者是linux内核提供的异步io接口,linux AIO只支持直接IO,未来趋势是io-uring。网络IO多用select/epoll,将其封装使用起来像异步IO,同步与异步区别在于是否堵塞线程,磁盘性能,同步异步IO都可以压榨完,对于同步异步的选择应该看每种IO方式的IO链路,以及对数据的拷贝次数,并结合自己场景和需求去分析,可接受应该在应用层改变。

Lunix AIO是否不成熟

glibc 的AIO,采用的是POSIX接口,无论有无bug、调试难度,API中无connect、accept、send、recv,存在的都是文件IO的使用者,数据库开发者,MySQL 5.6 innodb在lunix下已经使用native AIO实现了,innodb-use-native-aio变量默认开启。

以nginx 为例,说明nginx仅支持在读取文件时使用AIO,写入文件时往往是写入内存就立刻返回,AIO不支持缓存操作,即使需要操作的文件在linux文件缓存中存在,也不会通过操作缓存中的文件块来代替实际对磁盘的操作,会降低实际处理能力的性能。

  • 仅支持direct IO 只能使用O-DIRECT,不能借助文件缓存来缓存当前的IO请求,还存在size对齐
  • 仍然可能被阻塞  在系统层上events条件不成立,会进入睡眠
  • 拷贝开销大 大量小io场景下 拷贝影响比较大
  • API 不友好 submit wait-for-completion
  • 系统调用开销大

io-uring

  • 易用,对其中常用的功能进行了一次封装,提供了简单易用的接口liburing
  • 可扩展,支持网络I/O等非块设备
  • 高效,减少了每次调度要传的参数大小,减少系统调用次数,通过一次系统调用提交多个IO请求的方式
  • 可伸缩,用户态和核心态都支持轮询,可以在不调用syscall的情况下直接处理IO请求

原理与结构

  • 原理是让用户态进程与内核通过一个共享内存的无锁环形队列进行高效交互
  • 共享内存,减少系统调用过程中的参数内存拷贝,将内核态地址空间映射到用户态的方式,通过用户态对io-uring fd进行mmap,可以获得io-uring相关的两个内核队列(IO请求,IO完成时间)的用户态地址,用户态程序可以直接操作俩个队列向内核发送IO请求,接收完内核完成IO事件通知,
  • 无锁环形队列,单生产者与单消费者的无锁队列,来实现用户态程序与内核对共享内存的高效并发访问,生产者只修改队尾指针,消费者只修改队头指针,不会相互阻塞。
  • 内存屏障与保序,保证内存操作顺序和一致性,1 修改队列状态时,保证对队列元素的写入已完成,编译器可以实现,防止编译器将修改队列的指令放到队列元素写入完成之前,2 读取队列状态时,需要获取最新写入和修改的值,保证缓存一致性刷新

轮询模式

  • io-uring 提供io-uring-enter系统调用接口,用于通知内核IO请求的产生以及等待内核完成的请求,仍然需要反复调用系统调用,进行上下文切换。ioring-setup- iopoll 和 ioring-setup-sqpoll 同时设置,内核线程会同时对io-uring的队列和设备驱动队列做轮询,对请求队列、完成事件队列、设备驱动队列全部使用轮询模式,达到最优的IO性能,会产生更多的CPU开销。

调用接口

  • io-uring-setup 创建接口
  • io-uring-enter 通知内核有IO请求待处理,并根据参数等待请求完成
  • io-uring-register 注册fd和buffer为常用对象,避免内核反复拷贝

具体实现

  • 让用户态程序与内核共享内存,并发修改同一数据结构,是一种危险行为,用户态异常操作内核处理逻辑,可能让用户态程序破坏内核机制
  • uring 的head/tail 指针错误,会导致内核处理没有设置过的sqe,sqe是内核预分配过的内存,不会造成内核访问非法内存地址
  • uring entries被错误修改,可能会造成内核异常,在创建io-uring时就已经确定,可以为每个io-uring单独保存一份用于实际逻辑处理逻辑,而不使用共享内存中的部分。
  • io-uring提供了复杂而强大的异步IO接口,又实现了liburing来屏蔽高级特性带来的复杂度,通过共享内存与无锁队列与内核进行高性能交互,而避免大量的syscall嗲来的性能开销和限制,可用于加速实时性要求不高的系统调用。

为何不选择lunix AIO的更多相关文章

  1. 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

    单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式     一 表结构如下:  万行 CREATE TABLE t_audit_operate_log (  Fid b ...

  2. MySQL索引选择不正确并详细解析OPTIMIZER_TRACE格式

    一 表结构如下: CREATE TABLE t_audit_operate_log (  Fid bigint(16) AUTO_INCREMENT,  Fcreate_time int(10) un ...

  3. 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

    一 表结构如下:  万行 CREATE TABLE t_audit_operate_log (  Fid bigint(16) AUTO_INCREMENT,  Fcreate_time int(10 ...

  4. AIO

    IBM® 市场 (英文) 提交   我的 IBM 站点导航   学习 开发 社区 学习 Java technology 内容   概览 简单介绍 Asynchronous I/O 开始简单的异步 I/ ...

  5. [转]为何选择 Flink

    本文转自:https://www.ituring.com.cn/book/tupubarticle/23229 第 1 章 为何选择 Flink 人们对某件事的正确理解往往来自基于有效论据的结论.要获 ...

  6. 程序员PC选购

    程序员PC选购[转载] http://www.cnblogs.com/legendtao/p/4631150.html 好马配上好鞍,自然事半功倍.一台好的PC能给你更好的工作娱乐体验~~(卧槽,感觉 ...

  7. Linux内核探索之路——关于方法

    转载自:http://blog.chinaunix.net/uid-20608849-id-3014502.html   Linux内核实践之路 -给那些想从Linux内核找点乐趣的人 一个不能回避的 ...

  8. Caffe︱构建lmdb数据集、binaryproto均值文件及各类难辨的文件路径名设置细解

    Lmdb生成的过程简述 1.整理并约束尺寸,文件夹.图片放在不同的文件夹之下,注意图片的size需要规约到统一的格式,不然计算均值文件的时候会报错. 2.将内容生成列表放入txt文件中.两个txt文件 ...

  9. 除非你是BAT,前端开发中最好少造轮子

    站在前人的肩膀上 HTML.CSS.JavaScript是前端的根基,这是无可否认的事实.正如一辆车当然都是由一堆钢板和螺钉组成的,但是现在还有人拎着个锤子敲敲打打的造车吗?李书福说过,“汽车不过是四 ...

随机推荐

  1. 《剑指offer》刷题笔记

    简介 此笔记为我在 leetcode 上的<剑指offer>专题刷题时的笔记整理. 在刷题时我尝试了 leetcode 上热门题解中的多种方法,这些不同方法的实现都列在了笔记中. leet ...

  2. SpringCloud-微服务架构编码构建

    SpringCloud Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线).分布式系统的协调导致了样板模式, ...

  3. UVA11292杀怪

    题意:      一个怪物有N个头,每个头都有半径,然后有M个骑士,每个骑士能砍掉半径小于等于 X[i]的头,花费为X[i],并且一个骑士只能用一次,问砍掉怪物所有头的最小花费. 思路:       ...

  4. PowerShell-2.解决禁止本地执行脚本

    现象 直接找到XXX.ps1右键 使用PowerShell运行没反应,然后打开PowerShel把脚本推进去显示这个: 原因是因为脚本执行权限默认是Restricted,这个是禁止执行任何本地脚本. ...

  5. Andrew Ng机器学习算法入门((七):特征选择和多项式回归

    特征选择 还是回归到房价的问题.在最开始的问题中,我们假设房价与房屋面积有关,那么最开始对房价预测的时候,回归方程可能如下所示: 其中frontage表示的房子的长,depth表示的是房子的宽. 但长 ...

  6. chemfig化学式转换为pdf

    SMILES 与 chemfig 针对化学分子结构,可以用SMILES (用ASCII字符串明确描述分子结构的规范)来定义. SMILES(Simplified molecular input lin ...

  7. 跟我一起学Go系列:gRPC 入门必备

    RPC 的定义这里就不再说,看文章的同学都是成熟的开发.gRPC 是 Google 开源的高性能跨语言的 RPC 方案,该框架的作者 Louis Ryan 阐述了设计这款框架的动机,有兴趣的同学可以看 ...

  8. Codeforces Round #691 (Div. 2)

    A. Red-Blue Shuffle 题意:有两个长度为n的数组,数组a和数组b,问那个数组中的数字相比之下比另一个数组中相应位置的元素值更大一些,如果数组a大就输出RED,如果数组b大就输出BLU ...

  9. phpstudy2018 开启目录浏览

    废话不多说直接开始 一.打开 vhosts-ini 配置文件 二.加入以下内容  注意填写自己的网站根目录 <Directory "你自己的网站根目录"> Option ...

  10. UVA OJ 623 500!

    500!  In these days you can more and more often happen to see programs which perform some useful cal ...