Mina 2.0 如何调整并发效率

来源:互联网 发布:淘宝级别最高的店铺 编辑:程序博客网 时间:2024/06/01 03:58

使用mina作为应用程序框架来处理站内的一些请求.但是发现一个问题,实际等待的请求数,比mina实际显示出来的请求要高.

取得mina目前正在handle的请求数:session.getService().getManagedSessionCount()

这个数量和netstat -anp|grep -c ":1234"得到的数量不同,后面的这个要高很多,排除了一些在统计时长内已经断开的连接,也还是偏高.

为什么呢? 如何调整呢?

第一:

区分IoHandlerAdapter的sessionOpened和sessionCreated两个的区别,

sessionCreated:

Invoked from an I/O processor thread when a new connection has been created. Because this method is supposed to be called from the same thread that handles I/O of multiple sessions, please implement this method to perform tasks that consumes minimal amount of time such as socket parameter and user-defined session attribute initialization.

这个方法是在I/O处理阶段连接建立完成时调用的,这个线程同时要处理很多其他的会话进程,所以这个方法的实现,调用成本会很高,尽量不要在这里做代码实现

sessionOpened则是在另一个线程调用的,不会影响主I/O线程的效率.如果没有绝对的需要,最好用sessionOpened来代替sessionCreated做一些处理代码.

这部分处理完以后,mina的处理就可以流畅一些.

第二:

该动手时就动手

继承IoHandlerAdapter,可以实现很多方法,除了必须实现的几个,如messageReceived以外,,其他的也最好可以实现,当出现了不正常的情况时,当任务已经完成时,当发现Idle时,尽快断开客户端连接,避免线程堆积.

第三:

返回主题,这里涉及的就是如何合理的设置线程并发和线程队列了

NioSocketAcceptor在初始化的时候,可以指定并发数量的,这个值,在一些地方推荐的是CPU核心数 +1 ,但是在当今的服务器CPU处理效率上看,这个已经偏低了,当然,还需要根据业务的需求去设置.我增加了一下这个值.

为NioSocketAcceptor增加一个线程的处理池:acceptor.getFilterChain().addLast("ThreadPool",new ExecutorFilter(Executors.newCachedThreadPool()));

另外,backlog,也就是处理队列的大小,有些人可能认为这个队列越大越好.但是实际上,这个也需要考虑客户端的需求,客户端需要的是效率还是质量,客户端的等待是不是会带来问题.对于我的应用来说,客户端等待的时间越长,越容易产生问题.所以我减小了这个值.

经过这几个修改,感觉mina在处理的时候比以前要流畅了很多.

原创粉丝点击