对于块设备而言,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. Cube painting UVA - 253

     We have a machine for painting cubes. It is supplied with three different colors: blue, red and gre ...

  2. Ugly Numbers UVA - 136

    Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9 ...

  3. 浅入Kubernetes(8):外网访问集群

    目录 查询 Service Service 外部服务类型 配置 ServiceType 伸缩数量 阶段总结 在前面几篇文章中,我们学习了 kubeadm .kubectl 的一些命令,也学会了 Dep ...

  4. Web操作摄像头、高拍仪、指纹仪等设备的功能扩展方案

    摘要:信息系统开发中难免会有要操作摄像头.高拍仪.指纹仪等硬件外设,异或诸如获取机器签名.硬件授权保护(加密锁)检测等情况.受限于Web本身运行机制,就不得不使用Active.浏览器插件进行能力扩展了 ...

  5. istio1.2.2 安装及使用示例

    前言 本文介绍istio的安装及使用 dashboard,grafana,prometheus,kiali,jaeger的配置示例.演示通过istio的ingressgateway统一访问入口 Ist ...

  6. windows CMD实现的信息收集工具

    bat1 @echo off echo ====================================================== echo [*] 所有盘符下的有趣文件 @For ...

  7. UVA10780幂和阶乘

    题意:       输入两个整数n,m(1<m<5000,0<n<10000)求最小的k使得m^k是n!的因子. 思路:      比较容易想,一开始手残wa了好几次,我们直接 ...

  8. canvas绘制虚线图表

    最近有读者加我微信咨询这个问题,如下图所示: 要实现的效果如下: 其实难度不大,但是考虑一些人员对于canvas不熟悉,还是简单的介绍下. 其实该图表,就是一个圆圈外面在套一个圆弧的效果, 主要的难点 ...

  9. 续订Jetbrain学生包

    今天打开IDEA和Pycharm都不约而同的告诉我我的账号无法使用学生包了 此刻我的内心是: 冷静下来我算了算,嗷,原来是一年的订阅期到了,那就简单了,直接续订吧,唉.其实续订和重新认证是一样的. 首 ...

  10. [LeetCode每日一题]153.寻找旋转排序数组中的最小值

    [LeetCode每日一题]153.寻找旋转排序数组中的最小值 问题 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1, ...