博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
yanf4j 1.0-stable的一个压测报告
阅读量:6847 次
发布时间:2019-06-26

本文共 4442 字,大约阅读时间需要 14 分钟。

    采用的是 ,环
境是两台linux机器,都是4核16G内存以及2.6内核,网络环境是公司内网,带宽是1Gbps
,JDK1.6.0_07。对比的是
,两者都在压到16K,5000并发的时候客户端退出,因此后面给出的图有个16K的在5000并发为0,事实上只是几个连接失败,但是benchmark client就忽略了这个数据。实际过程还测试了1万并发连接的情况,但是由于测试客户端很容易退出,因此最后还是选定最大并发5000。注意,并非mina和yanf4j无法支撑1万个连接,而是benchmark client本身的处理,再加上内核tcp参数没有调整造成的。
首先看源码,mina的Echo Server:
package
 org.jboss.netty.benchmark.echo.server;
import
 java.net.InetSocketAddress;
import
 org.apache.mina.core.buffer.IoBuffer;
import
 org.apache.mina.core.service.IoHandlerAdapter;
import
 org.apache.mina.core.session.IoSession;
import
 org.apache.mina.filter.executor.ExecutorFilter;
import
 org.apache.mina.transport.socket.SocketAcceptor;
import
 org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import
 org.jboss.netty.benchmark.echo.Constant;
/**
 * 
@author
 The Netty Project (netty-dev@lists.jboss.org)
 * 
@author
 Trustin Lee (tlee@redhat.com)
 *
 * 
@version
 $Rev: 394 $, $Date: 2008-10-03 12:55:27 +0800 (星期五, 03 十月 2008) $
 *
 
*/
public
 
class
 MINA {
    
public
 
static
 
void
 main(String[] args) 
throws
 Exception {
        
boolean
 threadPoolDisabled 
=
 args.length 
>
 
0
 
&&
 args[
0
].equals(
"
nothreadpool
"
);
        SocketAcceptor acceptor 
=
 
new
 NioSocketAcceptor(Runtime.getRuntime().availableProcessors());
        acceptor.getSessionConfig().setMinReadBufferSize(Constant.MIN_READ_BUFFER_SIZE);
        acceptor.getSessionConfig().setReadBufferSize(Constant.INITIAL_READ_BUFFER_SIZE);
        acceptor.getSessionConfig().setMaxReadBufferSize(Constant.MAX_READ_BUFFER_SIZE);
        acceptor.getSessionConfig().setThroughputCalculationInterval(
0
);
        acceptor.getSessionConfig().setTcpNoDelay(
true
);
        acceptor.setDefaultLocalAddress(
new
 InetSocketAddress(Constant.PORT));
        
if
 (
!
threadPoolDisabled) {
            
//
 Throttling has been disabled because it causes a dead lock.
            
//
 Also, it doesn't have per-channel memory limit.
            acceptor.getFilterChain().addLast(
                    
"
executor
"
,
                    
new
 ExecutorFilter(
                            Constant.THREAD_POOL_SIZE, Constant.THREAD_POOL_SIZE));
        }
        acceptor.setHandler(
new
 EchoHandler());
        acceptor.bind();
        System.out.println(
"
MINA EchoServer is ready to serve at port 
"
 
+
 Constant.PORT 
+
 
"
.
"
);
        System.out.println(
"
Enter 'ant benchmark' on the client side to begin.
"
);
        System.out.println(
"
Thread pool: 
"
 
+
 (threadPoolDisabled
?
 
"
DISABLED
"
 : 
"
ENABLED
"
));
    }
    
private
 
static
 
class
 EchoHandler 
extends
 IoHandlerAdapter {
        EchoHandler() {
            
super
();
        }
        @Override
        
public
 
void
 messageReceived(IoSession session, Object message)
                
throws
 Exception {
            session.write(((IoBuffer) message).duplicate());
        }
        @Override
        
public
 
void
 exceptionCaught(IoSession session, Throwable cause)
                
throws
 Exception {
            session.close();
        }
    }
}
再看Yanf4j的Echo Server,没有多大区别:
package
 org.jboss.netty.benchmark.echo.server;
import
 java.nio.ByteBuffer;
import
 org.jboss.netty.benchmark.echo.Constant;
import
 com.google.code.yanf4j.config.Configuration;
import
 com.google.code.yanf4j.core.Session;
import
 com.google.code.yanf4j.core.impl.HandlerAdapter;
import
 com.google.code.yanf4j.core.impl.StandardSocketOption;
import
 com.google.code.yanf4j.nio.TCPController;
public
 
class
 Yanf4j {
    
public
 
static
 
void
 main(String[] args) 
throws
 Exception {
        
boolean
 threadPoolDisabled 
=
 args.length 
>
 
0
                
&&
 args[
0
].equals(
"
nothreadpool
"
);
        Configuration configuration 
=
 
new
 Configuration();
        configuration.setCheckSessionTimeoutInterval(
0
);
        configuration.setSessionIdleTimeout(
0
);
        configuration
                .setSessionReadBufferSize(Constant.INITIAL_READ_BUFFER_SIZE);
        TCPController controller 
=
 
new
 TCPController(configuration);
        controller.setSocketOption(StandardSocketOption.SO_REUSEADDR, 
true
);
        controller.setSocketOption(StandardSocketOption.TCP_NODELAY, 
true
);
        controller.setHandler(
new
 EchoHandler());
        
if
 (
!
threadPoolDisabled) {
            controller.setReadThreadCount(Constant.THREAD_POOL_SIZE);
        }
        controller.bind(Constant.PORT);
        System.out.println(
"
Yanf4j EchoServer is ready to serve at port 
"
                
+
 Constant.PORT 
+
 
"
.
"
);
        System.out
                .println(
"
Enter 'ant benchmark' on the client side to begin.
"
);
        System.out.println(
"
Thread pool: 
"
                
+
 (threadPoolDisabled 
?
 
"
DISABLED
"
 : 
"
ENABLED
"
));
    }
    
static
 
class
 EchoHandler 
extends
 HandlerAdapter {
        @Override
        
public
 
void
 onMessageReceived(
final
 Session session, 
final
 Object msg) {
            session.write(((ByteBuffer) msg).duplicate());
        }
        @Override
        
public
 
void
 onExceptionCaught(Session session, Throwable t) {
            session.close();
        }
    }
}

    两者都启用线程池(16个线程),开启TCP_NODELAY选项,Client采用SYNC模式,压测结果如下(仅供参考),分别是数据大小为128、1K、4K和16K情况下,随着并发client上升吞吐量的对比图:
系统的资源消耗来看,Mina的load相对偏高。

文章转自庄周梦蝶  ,原文发布时间2009-10-09

转载地址:http://hcvul.baihongyu.com/

你可能感兴趣的文章
Visual Studio 2015 移动跨平台开发初体验
查看>>
经典算法题每日演练——第二十四题 梳排序
查看>>
解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译)
查看>>
java内存模型与线程(转) good
查看>>
Java程序员们最常犯的10个错误(转)
查看>>
Java对象序列化/反序列化的注意事项(转)
查看>>
第十九章——使用资源调控器管理资源(1)——使用SQLServer Management Studio 配置资源调控器...
查看>>
定制婴儿,伦理不容?
查看>>
SqlServer调用外部程序实现数据同步
查看>>
【算法思想】位图排序算法
查看>>
Xcode 7.1.1 下载失败的兄弟看过来
查看>>
缩短新站被百度收录时间的独孤九剑
查看>>
常见3D物理引擎概述
查看>>
SAP彭桑亚:M2M融合大数据和移动化优势
查看>>
2017 年北京 QCon 参会总结
查看>>
一哄而起云计算(透视)
查看>>
如果调用ASP.NET Web API不能发送PUT/DELETE请求怎么办?
查看>>
从软件到平台
查看>>
《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.17. GCC-4.9.2...
查看>>
Linux_LAMP 最强大的动态网站解决方案
查看>>