aio-enhance

Java AIO 内核增强类库
授权协议 Apache
开发语言 Java
所属分类 程序开发、 其他开发相关
软件类型 开源软件
地区 国产
投 递 者 郁明诚
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

aio-enhance(音译:硬汉) 是一款无侵入式的 Java AIO 内核增强类库注意:这不是一款通信框架),解决原生 AIO 架构设计中存在的缺陷,提供更高效、更稳定的通信能力。

aio-enhance 采用了 NIO 技术实现了一套全新的异步 IO 模型,兼容完整的 Java AIO 接口。用户可自由选择 Java 原生提供的,或者 aio-enhance 增强的 AIO 实现,架构如下图。

一、项目背景

2.1 解决平台兼容性问题。

Java 原生 AIO 在 Mac 操作系统下存在兼容性问题,进行性能压测会偶发性的系统崩溃。

2.2 修复官方 AIO 架构缺陷

Java 原生 AIO 在底层架构设计上存在缺陷(参考:Java AIO通信模型)。多核 CPU 环境下处理高并发请求,会引发比较严重的锁竞争现象,以致无法充分发挥机器性能。

普通4核机器竞争压力不大,AIO 的运行表现实测优于NIO。但随着 CPU 核数的增加,AIO 的性能优势逐渐下降。

2.3 优化 AIO 线程模型

Java AIO 相较于 NIO 多了一层异步线程模型,极大降低了开发人员的编程难度。但是通信过程中的 accept、connect、read、write 等事件都是复用同一组线程资源,容易造成读写回调进入死锁状态。 AIO通信框架在设计上需要特别关注这一点,但如果引入 aio-enhance 则无此顾虑。

二、适用场景

如果您符合以下几个条件,aio-enhance 会是一个不错的选择。

  • 基于 Java AIO 实现的通信框架,如:smart-socket;
  • 对高并发实时性有严苛要求;
  • 多核CPU环境(至少4核以上)

三、集成

步骤一:依赖

引入增强包:aio-enhance.jar。可以通过maven方式引入依赖,亦可直接下载 jar 包并导入classpath。

<dependency>
	<groupId>org.smartboot.aio</groupId>
	<artifactId>aio-enhance</artifactId>
	<version>1.0.0</version>
</dependency>

步骤二:启动

可以通过硬编码的方式设置系统属性,如下:

System.setProperty("java.nio.channels.spi.AsynchronousChannelProvider", "org.smartboot.aio.EnhanceAsynchronousChannelProvider");

也可在 java 启动命令行中设置,如下:

java -Djava.nio.channels.spi.AsynchronousChannelProvider=org.smartboot.aio.EnhanceAsynchronousChannelProvider xxx.jar

四、性能对比

为了更加客观的展现 Java 原生 AIO、NIO 以及通过 aio-enhance增强后的 AIO 的性能表现,我们选择 smart-socket 和 netty 在 TFB 上的测试结果做了比较。

  • aio:smart-socket
  • nio:netty
  • aio-enhance: smart-socket

4核CPU

28核CPU

五、总结

虽说在实验场景下 Java AIO 的表现不如 NIO,但是异步非阻塞的设计思想是值得被肯定的。况且在现实场景中,这点性能差别很容易就被业务逻辑所抹平,大家无需去计较孰优孰劣,适合自己的就是最好的选择。如今有了 aio-enhance 做备选,Java AIO本身设计上的缺陷也就没那么重要了。

 相关资料
  • 问题内容: 我正在测试内核异步io函数(不是posix aio),并试图弄清楚它是如何工作的。下面的代码是一个完整的程序,其中我简单地将一个数组重复写入使用O_DIRECT打开的文件中。我在回调函数中收到一个错误“写错的字节期望1024得到0”(请参阅​​work_done()中的fprintf语句)。 对于不熟悉内核aio的用户,以下代码将执行以下操作: 初始化一些结构 准备AIO(io_pre

  • 在将我的等级更新到1.0.1之后,我的appengine构建失败 我得到了错误: > 错误:执行任务“:AppEngine:AppEngineEnhance”失败。 增强DataNucleus类时出错。 尝试: 使用--debug选项运行以获取更多日志输出。

  • 我正在逐个迭代字符串对象列表中的元素: 在这里,每次我调用list上的get()时,列表都会从其一端一直迭代到第i个元素——因此上面循环的复杂性是O(n^2)。 是a.)对于增强型for循环,与上面相同,还是b.)对于循环,将指针保持在最后一个指针所在的位置,因此下面循环的复杂性是O(n)? 如果上面的情况(b)——我想是这样的——在列表上使用迭代器有什么好处吗。这是简单的迭代--没有回头路 蒂亚

  • ZGC 或 Z 垃圾收集器是在 Java 11 中引入的,作为一种低延迟垃圾收集机制。ZGC 确保垃圾收集暂停时间不依赖于堆大小。无论堆大小是 2MB 还是 2GB,它都不会超过 10 毫秒。 但是 ZGC 在将未使用的堆内存返回给操作系统方面存在限制,例如 G1 和 Shenandoah 等其他 HotSpot VM GC。以下是使用 Java 13 完成的增强功能: ZGC 默认将未提交的内存

  • 我有一个手风琴,它在我的页面内工作得很好。当你点击标题时,隐藏的div会显示,当你再次点击它时,它会再次隐藏。我想通过增加一个功能来增强手风琴,使手风琴一次只显示一个项目。换句话说,如果我打开了一个项目,并单击另一个标题,则当前打开的项目将自动关闭。 这是HTML 这是我的jQuery代码 如您所见,我有一个main(div class=“cap”)后跟一个(div class=“capitalo

  • 除了agent和环境之外,强化学习的要素还包括策略(Policy)、奖励(reward signal)、值函数(value function)、环境模型(model),下面对这几种要素进行说明: 策略(Policy) ,策略就是一个从当环境状态到行为的映射; 奖励(reward signal) ,奖励是agent执行一次行为获得的反馈,强化学习系统的目标是最大化累积的奖励,在不同状态下执行同一个行