基于MINA构建简单高性能的NIO应用-优化指南
来源:互联网 发布:手机上淘宝电脑版登录 编辑:程序博客网 时间:2024/05/21 09:13
基于MINA构建简单高性能的NIO应用-优化指南
本文为Sparkle发于《程序员》2008年2月刊的文章,与《程序员》的协议,可以在个人博客中发布,转载请保留出处。
优化指南 MINA默认配置的性能并不是很高的,部分原因是MINA目前还保留初期版本的架构,另外一个原因是因为JVM的发展。
首先我们关闭默认的ThreadModel设置
IoAcceptor acceptor = ...;IoServiceConfig acceptorConfig = acceptor.getDefaultConfig();acceptorConfig.setThreadModel(ThreadModel.MANUAL);
ThreadModel是一个很简单的线程实现,用于IoService。但是它实在太弱,以至于在并发环境产生大量问题。在MINA 2.0中,ThreadModel直接被取消。你应该使用ExecutorFilter来实现线程。然后我们增加I/O处理线程(Article by Sparkle) 每一个Acceptor/Connector都使用一个线程来处理连接,然后把连接发送给I/O processor进行读写操作,我们只可以修改I/O processor使用的线程数,用以下代码设置
IoAcceptor acceptor = new SocketAcceptor(Runtime.getRuntime().availableProcessors() + 1, Executors.newCachedThreadPool());
当然是要将ExecutorFilter加入,上文已经很详细地描述了acceptor.getDefaultConfig().getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool());
笔者在开发过程中,多次遇到OutOfMemoryError,经过研究之后才发现原因。MINA默认是使用direct memory实现ByteBuffer池的方案(以下简称direct buffer),通过JNI在内存开辟一段空间来使用,该方案在早期的MINA版本中是一个非常好的特性,那是因为MINA开发初期,JVM并没有现在的强大,带有池效果的direct buffer性能比较好。但是当我们使用-Xms -Xmx等指令增加JVM可使用的内存,那仅仅增加了堆的内存空间,而direct memory的空间并没有增加,导致MINA实际使用的时候经常出现OutOfMemoryError。如果你的确想使用direct memory,可以通过-XX:MaxDirectMemorySize选项来设置。不过笔者不建议这样做,因为最新的测试表明,在现代的JVM里面,direct memory比堆的表现更差。这里可能有读者会觉得奇怪,为什么不用池,而要用堆呢,而且还需要gc。那是因为现在的JVM gc能力已经很强了,而且在并发环境里面,pool的同步也是一个性能的问题。我们可以通过这样的代码进行设置(Article by Sparkle)ByteBuffer.setUseDirectBuffers(false);ByteBuffer.setAllocator(new SimpleByteBufferAllocator());
MINA 2.0已经默认把直接内存分配改成堆,为了提供最好的性能和稳定性。最后一条优化技巧就是,把你的应用部署在Linux上,并且打开Java NIO使用Linux epoll的功能。可能你还没听过epoll,但是你应该听过Lighttpd、Nginx、Squid等,得益于epoll,它们提供很高的网络性能,还占用非常少的系统资源。JDK6已经默认把epoll配置打开,因此笔者建议把你的应用部署在JDK6上面,也同时因为JDK6还有别的优化特性。如果你的应用必须部署在JDK5上,你也可以通过参数把epoll支持打开。
- 基于MINA构建简单高性能的NIO应用-优化指南
- 基于MINA构建简单高性能的NIO应用
- 基于MINA构建简单高性能的NIO应用
- 基于MINA构建简单高性能的NIO应用
- 基于MINA构建简单高性能的NIO应用
- 基于Apache Mina的一个简单应用
- 构建高性能的ASP.NET应用(四)-性能的优化的目标
- 构建高性能的ASP.NET应用(二)-性能优化演绎法
- 构建高性能的弹幕应用
- MINA及其在高性能通讯应用中的突出问题(NIO架构及应用之二)
- 基于 IBM InfoSphere Streams 平台高性能流计算应用的构建
- 基于NIO 的轻量级高性能的websocket服务器
- 高性能ASP.NET站点构建之简单的优化措施
- 基于NIO实现的一个高性能通信框架
- 一个基于MINA框架应用的最简单例子
- 构建高性能、高并发的JAVA应用系统
- 基于mina的应用架构
- 基于CentOS构建高性能的LAMP平台
- Levenshtein's eidit distance
- 一个前百度工程师看百度的狼性【2012-11-11】
- HTML css 2 css
- 使用php-excel-reader读取excel文件
- Xcode 4.1/4.2/4.3 免证书(iDP)开发+真机调试+生成IPA全攻略
- 基于MINA构建简单高性能的NIO应用-优化指南
- java swing 实现贪吃蛇小游戏
- 关于J2EE项目中三层架构如何在开发中得到正确的实施
- ruby 使用mysql API
- WCF4中舍去svc文件
- PHP获取当前url路径的函数及服务器变量
- SQL 学习笔记
- PHP phpmailer使用
- 还是利用Map特性,计算字符串里字符出现的次数(Javascript版-Obj特性)