文档章节

异步AIO的研究

mickelfeng
 mickelfeng
发布于 2017/09/08 12:54
字数 816
阅读 72
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

异步网络模型

首先声明一下epoll+nonblock从宏观角度可以叫做全异步,但从微观的角度来看还是同步的IO。只是在数据到达后得到系统通知,然后同步执行recv取回数据,没有iowait。

真正的异步IO(下面会统一叫做AIO)应该像Windows IOCP一样,传入文件句柄,缓存区,尺寸等参数和一个函数指针,当操作系统真正完成了IO操作,再执行对应的函数。

实际上对于socket来说,epoll已经是最高效的模型了,虽然比AIO多一次recv系统调用,但总体来看没有任何IO等待,效率很高。而且epoll是天然的reactor模型,程序实现更容易。AIO如windows的IOCP,是异步回调的方式,开发难度很高。

为什么还是需要AIO呢,原因是文件句柄跟socket完全不同,它总是处于可读状态。不能使用epoll+nonblock来实现异步化。如果在一个epoll的全异步Server中,要读写文件那必须得使用AIO。下面说下AIO的几种实现方案。

gcc AIO

gcc遵循posix标准实现了AIO。头文件为 <aio.h>,支持FreeBSD/Linux。是通过阻塞IO+线程池来实现的。主要的几个函数是aio_read/aio_write/aio_return。

优点:支持平台多,兼容性好,无需依赖第三方库,阻塞IO可以利用到操作系统的PageCache。

缺点:据说有一些bug和陷阱,一直未解决。不过这个都是网上文章中讲的,gcc发展这么多年,不至于还有遗留bug吧。这里有待测试。

Linux Native Aio

由操作系统内核提供的AIO,头文件为<linux/aio_abi.h>。Native Aio是真正的AIO,完全非阻塞异步的,而不是用阻塞IO和线程池模拟。主要的几个系统调用为io_submit/io_setup/io_getevents。

优点:由操作系统提供,读写操作可以直接投递到硬件,不会浪费CPU。

缺点:仅支持Linux,必须使用DirectIO,所以无法利用到操作系统的PageCache。对于写文件来说native aio的作用不大,应为本身写文件就是先写到PageCache上,直接返回,没有IO等待。

Libeio

libev的作者开发的AIO实现,与gcc aio类似也是使用阻塞IO+线程池实现的。优点与缺点参见上面。它与gcc aio的不同之处,代码更简洁,所以bug少更安全稳定。但这是一个第三方库,你的代码需要依赖libeio。

总结

如果你的程序读写的文件很大,随即性强,这样PageCache的命中率低,那可以选择Native AIO,降低CPU使用率。

如果读写的文件很小,而且是固定的一些文件,这样PageCache的命中率高,可以选择gcc aio或者libeio。

本文转载自:http://rango.swoole.com/archives/282

mickelfeng

mickelfeng

粉丝 238
博文 2811
码字总数 607897
作品 0
成都
高级程序员
私信 提问
加载中

评论(0)

NIO.2特性总结(三)AIO

接上一篇《NIO.2特性总结(二)增强的通道 NetworkChannel》 We’ve finally reached the most powerful feature introduced in NIO.2, the asynchronous channel API. 我觉得第一个问题就是......

Gaischen
2012/12/03
4.5K
4
smart-ioc 首版发布:为 Android 打造的国产 NIO 通信框架

项目背景 在几年前作者便开始NIO的学习与研究,并在码云上提交了第一个作品smart-socket(NIO版)。本来期望将其打造成异步非阻塞的通信框架,如同netty一样,却最终效果并不理想。恰逢Java ...

三刀蜀黍
2018/05/28
3K
13
smart-socket v1.2.0 预告:依然是最轻量的 AIO 框架

smart-socket估计是目前最轻量的一款AIO框架,已其极少的代码量特性和爆炸式的性能表现,非常适合新手学习研究。同时对于具备一定技术能力的朋友,完全掌握smart-socket估计也就十几分钟的事...

三刀蜀黍
2017/10/27
1.4K
5
【Java IO】IO的发展史之BIO、NIO、AIO

任何事物的发展都是由不完善到更好的方向发展的,至于能不能发展到完善,我这里可以负责任的说:是不能的,因为随着时代的发展,任何过去时的研究成功不能总满足当下或将来的状况。这就像我们...

火拳-艾斯
2019/04/12
62
0
java架构之路-(tomcat网络模型)简单聊聊tomcat(二)

  上节课我们说到的Tomcat,并且给予了一般的tomcat配置,和配置的作用,提到了HTTP/1.1 也就是我们的网络通讯模型,那么HTTP/1.1又代表什么呢。我们来简答看一下。 tomcat有四种网络通讯模...

osc_dwomrlil
2019/09/07
2
0

没有更多内容

加载失败,请刷新页面

加载更多

在Git存储库中查找并恢复已删除的文件 - Find and restore a deleted file in a Git repository

问题: Say I'm in a Git repository. 假设我在Git存储库中。 I delete a file and commit that change. 我删除文件并提交更改。 I continue working and make some more commits. 我继续工作......

javail
34分钟前
15
0
基于Centos7系统一键部署EFK服务

最近平台EFK版本均作了升级,平台采用EFK(ElasticSearch-7.6.2 + FileBeat-7.6.2 + Kibana-7.6.2)架构。这里建议三个组件主次版本保持一致。考虑到服务器比较多,所以写成脚本来批量部署。 ...

linuxprobe2020
今天
23
0
检查键是否存在于JavaScript对象中? - Checking if a key exists in a JavaScript object?

问题: How do I check if a particular key exists in a JavaScript object or array? 如何检查JavaScript对象或数组中是否存在特定键? If a key doesn't exist, and I try to access it, ......

fyin1314
今天
27
0
jasypt-spring-boot提示Failed to bind properties

1 问题描述 在Spring Boot中使用jasypt-spring-boot进行加密,但是提示: Description:Failed to bind properties under 'spring.datasource.password' to java.lang.String: Reason:......

氷泠
今天
29
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部