NIO的极限

 
为了避免我的BOSS见到我的BLOG认为我是个天天除了睡觉就是玩游戏上网聊天骗公司钱好吃懒做不务正业带坏公司风气的家伙而遭到“炒鱿鱼”的悲惨命运继而钱包空空被迫流浪街头睡天桥并且小狗争夺垃圾箱里食物的悲惨日子,我决定写一些和技术打擦边球的东西
在很早很早以前,有一群叫做C程序员的精英,他们使用C来开发网络程序,性能很好。
接着出现了一个叫做SUN的公司,做了一个叫做OAK的东东,后来改名叫做"JAVA"。"JAVA"很好用,于是出现了包括ARBOW等很多很多靠它混饭吃的程序猿。
JAVA支持SOCKET,可以写网络程序,大家都很高兴,因为用JAVA写网络程序似乎挺简单。很多很多有名的WEB服务器,都是用JAVA写的,如TOMCAT,WEBLOGIC。
不 过用JAVA写的网络程序性能很低,即使使用了多线程,甚至线程池。C程序员对这破烂东西是不顾一屑di。后来有几个”老程序员“想了一些办法,使用 JNI,调用C库,使用似乎很NB的Select模型,后来SUN还把它搞出来一个JCP标准,集成到JAVA 1.4里面,叫做NIO。NIO好阿,好东西,无阻塞,一个线程搞定N个并发请求,不少软件都开始使用它了。有些”好事之徒“还把NIO再封装了一层,搞 了一个什么框架出来,一个叫什么MINA的,还有一个是中国人写的,叫做CINDY,估计是他的MM的名字。广州某个角落有一个叫做"ARBOW"的小四 眼就在用着这个东西,估计用的人还有不少。
不过Select模型缺点还是有的,并发一上来,这NIO就隔屁咯。看C上 面,Windows有完成端口IOCP,LINUX 2.6 KERNEL提供了一个叫做EPOLL的模型,据说比什么Select和Poll要高一个档次。SUN怎么不提供这些东东的JAVA实现呢?
Google又开始忙碌了,结果找到了一个叫做"Blackdown Java-Linux Java 2 SE v1.4.2-02"的网站( http://www.blackdown.org/java-linux/java2-status/jdk1.4-status.html ),里面有这样一段文字:
Epoll based NIO Selector:
In order to use the epoll based NIO selector instead of the default poll based one, you have to run your code with '-Djava.nio.use_epoll=true'

噢,似乎是好东东,让我简单测试一下。

JRE: SUN JVM 1.4.2_07,BEA WebLogic JRockit(TM) 1.4.2_05,Blackdown JRE 1.4.2-02

简单用MINA的HTTPSERVER example作为服务器程序,Apache ab作为压力测试客户端,机子环境等略过,每次测试都是使用同一环境。

1K并发:吞吐量、每秒处理请求数等,Blackdown的和Sun的基本相同,JRockit比它们高出一倍。

JRockit JVM的网络性能不是盖的阿。

并发数似乎不多,提高一下,看看JRockit的和Blackdown的表现如何。

3K并发,JRockit似乎不行了,IO和CPU占用非常高,Server程序的Response大量出错。然而Blackdown似乎保持了良好的负载能力,IO等占用大概在50%左右徘徊。

来一个10K并发,Blackdown还是保持50%左右的IO占用,程序没垮,只是用浏览器访问有时非常慢,估计是到极限了,再增加并发数,吞吐量不会在继续增加,只会有更多的客户端连接超时。

看 来,使用EPOLL作为NIO Selector后,负载大大增强了。估计在程序上面优化的空间已经不大,好点的办法是升级硬件,使用群集,或者干脆用C写。据说eDonkey的服务器 采用了EPOLL模型跑在4G内存的LINUX上,支持的最大用户已经超过了280K。

NIO加上使用EPOLL的JVM,能够支撑这么大的并发,已经让我很满意了,估计这基本是NIO的极限了,如果需要高性能的服务器程序,使用C吧,为了高效,可以牺牲掉维护性、扩展性和移植性。

http://blog.csdn.net/elssann/ 和 http://blog.csdn.net/sodme/ 是两位搞高性能服务器程序的高手的BLOG,如果对“高性能的服务器程序”感兴趣,不妨去看看

你可能感兴趣的:(java,weblogic,网络,服务器,Mina,sun)