对于块设备而言,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. qsort 快排函数(C语言)

    qsort 快排函数(C语言) 函数原型 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, ...

  2. 如何解压从UK biobank下载下来的tsv.bgz文件?

    今天碰到一个问题,就是从UK biobank下载下来的gwas result file是filename.tsv.bgz格式.这东西需要解压才能阅历,可是用zip或者rar都是搞不定,网上搜了一圈,说 ...

  3. 如何识别自己基因组数据是哪个全基因组参考版本(Genome Reference Versions/ Genome Build)

    首先在这里先感谢我们[Bio生信学习交流群]的群友和创建此群的群主[陈博士后]. 今天解决的问题是怎么查看自己的基因组数据是哪个Genome Reference Versions. 步骤: 第一步,打 ...

  4. 计算机网络第一章bb测试

    错题8,31 课程 211计算机网络 测试 网络概论与体系结构 状态 已完成 尝试分数 得 340 分,满分 360 分 已用时间 14 分钟 说明 第一章 网络概论测试 显示的结果 所有答案, 已提 ...

  5. [VSC] HTML打叹号无法自动提示默认框架

    一般的, 在 VSC 中编辑 HTML 文档时, 打一个叹号 '!', 就会提示, 可生成默认代码, 如: 采纳建议后, 是这样: 问题: 如果出现打叹号无法出现提示的情况, 首先, 请检查当前的语言 ...

  6. mysql 随机选取一条符合条件的记录

    暂时记录下: SELECT *  FROM `kw_user` AS t1 JOIN ( SELECT ROUND( RAND( ) * ( ( SELECT MAX( id ) FROM `kw_u ...

  7. 【SpringBoot】SpringBoot2.x整合定时任务和异步任务处理

    SpringBoot2.x整合定时任务和异步任务处理 一.项目环境 springboot2.x本身已经集成了定时任务模块和异步任务,可以直接使用 二.springboot常用定时任务配置 1.在启动类 ...

  8. hdu4965 巧用矩阵乘法结合律

    题意:      给两个矩阵,n*m的矩阵A,和m*n的矩阵B, 求(A*B)^(n*n)其中 m<=6,n<=1000. 思路:       一开始直接模拟,写了个矩阵快速幂,超时了,因 ...

  9. xposed学习四:总结

    xposed的学习要告一段落,接下来去学习android apk和so加固,这里我们回顾下xposed吧. xposed是个hook框架,它是基于dalvik(确切来说是目前的版本,作者说ART也快出 ...

  10. C#-FTP

    /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo">需要上传的文件 ...