花了十多天的时间把原来的WEB服务由BIO(阻塞IO)模式改写成NIO(非阻塞IO)模式,然后在xp机子上用ab测试并发性能,确实提升了30%左右的并发性能,测试完成后,当时感觉还是挺满意的。几天前在网上看到有文章中谈到关于NIO中的select()在windows机子上的实现有性能问题,原因是NIO在windows上使用的是select/poll技术(网上有文章指出:select ()最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。对于那些需要支持几千上万连接服务器来说显然太少了。传统的select/poll另一个致命弱点就是当你拥有一个很大的socket集合,不过由于网络延时,任一时间只有部分的socket是"活跃"的,但是select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。但是epoll不存在这个问题。),但在linux2.6+上,Java的NIO实现为epoll,所以在linux上不存在性能问题。

然后看到一些资料中提到,jdk7新增的异步IO(AIO)在windows上实现为IOCP,解决了NIO在windows上高并发时遇到的性能问题。

在最近三四天,我又重写了代码,这次用AIO重写之前完成的NIO代码花费的时间明显比NIO重写BIO花费的时间短很多,主要原因是AIO和NIO在处理业务方面的代码有很多相似的地方。

使用AIO重写代码后,用ab进行大量的并发测试,测试的结果如下:

• 在没有开启HTTP的持久连接(Connection: close)情况下:

用ab进行压力测试,在100-1000并发的情况下,AIO比NIO的并发性能提升了10%左右。

• 在开启HTTP的持久连接(Connection: keep-alive)情况下:

1. 在50 - 200并发的情况下,AIO比NIO的并发性能慢了20%左右。

2. 在200 - 500并发的情况下,AIO比NIO的并发性能慢了10% - 5%左右。

3. 在500 - 1000并发的情况下,AIO与NIO并发性能基本持平,有的时候还表现更快一些。

我的xp机子上,ab最大只能开到1000,1000+的情况,我没测试。

原以为使用AIO重写的代码在各个方面都会强于NIO,曾经因为这个测试结果困扰了我一二天时间。

今天上午在CSDN上看到一篇性能调优攻略:http://sd.csdn.net/a/20120621/2806814_2.html,其中有一段内容提到异步IO:

异步操作。我们知道Unix下的文件操作是有block和non-block的方式的,像有些系统调用也是block式的,如:Socket下的select,Windows下的WaitforObject之类的,如果我们的程序是同步操作,那么会非常影响性能,我们可以改成异步的,但是改成异步的方式会让你的程序变复杂。异步方式一般要通过队列,要注间队列的性能问题,另外,异步下的状态通知通常是个问题,比如消息事件通知方式,有callback方式,等,这些方式同样可能会影响你的性能。但是通常来说,异步操作会让性能的吞吐率有很大提升(Throughput),但是会牺牲系统的响应时间(latency)。这需要业务上支持。

通过AIO重写的代码可以看出,AIO的每一次callback(回调)是通过线程池中的一个线程执行的,而我之前写的NIO代码仅在一个线程中执行(仅使用一个selector),可能因此在开启持久连接时,低并发的情况下会出现AIO的并发性能还不如NIO,当并发数越来越高的时候,测试结果也表明,AIO的并发性能开始慢慢接近甚至超越NIO。

此时,之前的困扰已渐渐的散去。

2012-06-25

浅谈使用NIO,AIO的感受的更多相关文章

  1. (转)也谈BIO | NIO | AIO (Java版)

    原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...

  2. 也谈BIO | NIO | AIO (Java版--转)

    关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  3. 转载:BIO | NIO | AIO

    http://my.oschina.net/bluesky0leon/blog/132361 也谈BIO | NIO | AIO (Java版)   转载自:zheng-lee博客 发布时间: 201 ...

  4. 浅谈测试rhel7新功能时的感受及遇到的问题【转载】

    半夜起来看世界杯,没啥激情,但是又怕错误意大利和英格兰的比赛,就看了rhel7 相关新功能的介绍. rhel7的下载地址: https://access.redhat.com/site/downloa ...

  5. Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...

  6. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  7. !! 浅谈Java学习方法和后期面试技巧

    浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...

  8. Yorhom浅谈:作为一名初中生,自学编程的点点滴滴 - Yorhom's Game Box

    Yorhom浅谈:作为一名初中生,自学编程的点点滴滴 我是一名不折不扣的初中生,白天要背着书包去上学,晚上要拿起笔写作业.天天如此,年年如此. 我的爱好很广泛,喜欢了解历史,读侦探小说,骑车,打篮球, ...

  9. 浅谈MacOS-20155205郝博雅

    预备作业3:安装虚拟机 我的电脑是MacBook Air,因此按照娄老师说的,不需要安装Linix系统便能完成之后的学习.所以我就浅谈一下用MacOS系统的感受. 优点:人性化&便捷 与同系列 ...

随机推荐

  1. 20155301 Exp9 Web安全基础

    20155301 Exp9 Web安全基础 1.实验后回答问题 (1)SQL注入攻击原理,如何防御 答 :原理: 利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web ...

  2. Hiberante持久化对象的3种状态

        近日一同事问我关于Hibernate中对象的3种状态的问题,因此特意总结一下.在Hibernate中对象是有以下3中状态: 瞬时态(transient object): 没有OID值,没有被s ...

  3. Eclipse中Maven插件配置

    1. Maven插件配置 http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 2. Ma ...

  4. PowerBI开发 第十一篇:报表设计技巧(更新)

    PowerBI版本在持续的更新,这使得报表设计能够实现更多新的功能,您可以访问 PowerBI Blog查看PowerBI的最新更新信息,本文总结了PowerBI新版本的重要更新和设计技巧. 我的Po ...

  5. Hexo站点之域名配置【2】

    该系列博客列表请访问:http://www.cnblogs.com/penglei-it/category/934299.html 摘要 因为Hexo个人博客是托管在github之上,每次访问都要使用 ...

  6. kubernetes 集群新增node 节点并将应用分配到新增节点

    第一章 1.重新安装一台kubernetes node节点,新增节点:192.168.1.192 网址:https://www.cnblogs.com/zoulixiang/p/9504324.htm ...

  7. 关于T/G/M/K

    //扫盲贴 K, G, T,都是表数量,只是个数字,在不同的场合下表示的不同.在计算机行业中,这几个量可用来表示数据传输速度和容量,下面分别讨论,希望不了解的朋友不要被某知道上的误解了.如果有什么错误 ...

  8. 基于spring框架的apache shiro简单集成

    关于项目的安全保护,我一直想找一个简单配置就能达到目的的方法,自从接触了shiro,这个目标总算达成了,以下结合我使用shiro的经验,谈谈比较轻便地集成该功能. 首先我们先了解一下shiro是什么. ...

  9. PAT甲题题解-1077. Kuchiguse (20)-找相同后缀

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

  10. 用IDEA开发简单的Servlet

    最近学习java,主要是servlet相关的内容.IDEA和servlet之前都没有碰过,所以做了一下小实验,走了一些弯路:这里把一个完整的步骤写出来,加深一下印象. IDEA创建项目步骤 1. 在i ...