`
zhaohaolin
  • 浏览: 1003207 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

基于MINA构建简单高性能的NIO应用-优化指南<转>

    博客分类:
  • Mina
 
阅读更多
19 February 2010

 

本文为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支持打开。

文章快速索引

  1. 前言
  2. 一个简单的例子
  3. MINA架构
  4. 优化指南
分享到:
评论

相关推荐

    Apache-Mina-2.rar_apache mina_java mina_mina_mina-core-1.1.3

    这使得Mina可以用于创建高性能的服务器端和客户端应用,例如在数据库连接、远程过程调用(RPC)、即时通讯(IM)等领域。 描述中提到的"Mina中文参考手册"对于中国开发者来说是一份宝贵的资源,它详细介绍了如何使用...

    基于Java的实例源码-高性能Java网络框架 MINA.zip

    **标题与描述解析** ...总的来说,这个压缩包为Java开发者提供了一个深入理解并实践MINA框架的机会,通过研究源码和示例,可以提升对网络编程和异步事件驱动模型的理解,以及如何利用MINA构建高性能的网络应用。

    Apache_MINA_2_用户指南.pdf

    Apache MINA 2 是一个基于 Java 语言的网络应用框架,旨在帮助开发者快速构建高性能、可靠、可扩展的网络应用程序。该框架提供了一个灵活的架构,使得开发者可以轻松地构建各种类型的网络应用程序。 Part I - ...

    MINA 2.0.0-M6

    MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、跨平台的网络应用程序框架,主要用于开发网络服务器和客户端应用。MINA提供了高级的网络通信抽象层,简化了开发人员处理低级别I/O操作...

    mina-2.0.0-M6.zip

    Apache MINA是一个开源框架,主要用于构建高性能、高可用性的网络应用程序。这个“mina-2.0.0-M6.zip”压缩包包含的是Apache MINA框架的2.0.0 Milestone 6版本,这是一个预发布版本,用于在正式版本发布前进行测试和...

    apache-mina-2.0.16

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发服务器端和客户端的网络应用。标题"apache-mina-2.0.16"表明我们讨论的是...

    apache-mina-3.0.0-M2-src.zip

    MINA提供了一种高级的、高性能的、异步事件驱动的网络应用程序框架,使得开发者可以专注于业务逻辑,而不用关心底层的网络通信细节。这个"apache-mina-3.0.0-M2-src.zip"文件包含了MINA 3.0.0 Milestone 2版本的源...

    MINA-2.0.0-M4 英文版

    MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,用于构建高并发、高性能的服务器端和客户端应用。这个框架主要针对TCP和UDP协议,但也可以支持其他I/...

    mina

    标题 "MINA" 指的是 Apache MINA (Multipurpose Infrastructure for Network Applications),这是一个由Apache软件基金会开发的Java框架,主要用于构建高性能、高可用性的网络应用程序。MINA提供了一个高级的网络...

    mina学习资料--很实用

    Apache Mina是一个开源框架,主要用于构建高性能、高可用性的网络应用程序。它主要关注网络通信的I/O层,为开发者提供了一种简洁的方式来处理TCP/IP、UDP等协议的网络通信。在Java开发领域,Mina因其高效和灵活的...

    Mina-2.0.7

    它主要设计用于构建高性能、协议无关的网络应用。Mina在Java平台上提供了简单易用的API,使得开发者能够轻松地创建网络服务器和客户端,支持TCP/IP(如HTTP、FTP)和UDP等传输协议,以及各种应用层协议,如SSH、SNMP...

    mina用户指南中文版(waylau).zip

    Apache Mina是一个开源的网络通信应用框架,它简化了高性能、高可用性和高可扩展性的网络应用开发。这份指南深入浅出地介绍了Mina的核心概念,对于初学者和开发者来说都是宝贵的参考资料。 1. **Apache Mina框架...

    基于mina的一个Memcached客户端首发

    Apache MINA是一个网络应用框架,主要用于简化开发高性能且高度可伸缩的网络应用程序,如服务器和客户端。而Memcached则是一种分布式内存对象缓存系统,常用于提高网站或应用的数据访问速度。 在描述中提到了一个...

    Apache MINA 2.0 用户指南( 缺第一章节)

    Apache MINA 2.0 是一款高性能且易于使用的网络应用程序框架,它简化了开发人员在网络编程方面的负担,允许开发者专注于应用程序的核心功能,而不是底层的网络细节。MINA 2.0 支持多种网络协议,包括 TCP 和 UDP,...

    mina库文件

    Apache MINA 是一款高度可扩展、高性能的网络应用程序框架,主要设计用于简化开发跨平台的、多协议的网络应用。MINA 提供了一个抽象层,让开发者可以专注于编写业务逻辑,而无需关心底层网络通信的复杂性。这个库在...

    apache-mina-2.0.7

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发高质量的网络服务。MINA 提供了一个统一的API,可以处理TCP/IP(如Socket)...

    apache-mina-2-user-guide-demos:Apache MINA用户指南的演示《 Apache MINA 2用户指南》的中文翻译,文中用到的示例

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发网络服务,如TCP/IP和UDP/IP协议的应用。MINA为Java开发者提供了高级抽象,...

    3本mina教程和mina帮助文档

    Mina以其高效的性能、灵活性和强大的功能在Java开发者中受到广泛欢迎,尤其适用于构建高性能的服务端应用程序,如FTP、SMTP、NNTP等网络服务。 "3本mina教程和mina帮助文档"的压缩包包含了以下四个文件: 1. **...

Global site tag (gtag.js) - Google Analytics