yanf4j 1.0-stable的一个压测报告

简介:
    采用的是 jboss netty的benchmark,环 境是两台linux机器,都是4核16G内存以及2.6内核,网络环境是公司内网,带宽是1Gbps ,JDK1.6.0_07。对比的是 mina 2.0M6yanf4j 1.0-stable,两者都在压到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

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
3月前
|
测试技术 UED
PTS压测问题之资源准备好慢如何解决
PTS(Performance Testing Service)是一项面向网站、应用等提供的压力测试服务,用于模拟不同场景下的用户访问,评估系统的性能表现;在进行PTS压测时,可能会出现一些异常或报错,本合集将PTS压测中频繁出现的问题及其解决办法进行汇编,旨在帮助用户更有效地进行性能测试和问题定位。
247 1
|
5月前
grafana如何算成功率
grafana如何算成功率
|
10月前
|
人工智能 监控 测试技术
如何基于 Knative 提供生产级别 Stable Diffusion 服务
背景随着生成型AI技术的能力提升,越来越多的注意力放在了通过AI模型提升研发效率上。作为 AIGC (AI Gererative Content)领域的知名项目 Stable Diffusion , 可以帮助用户快速、准确地生成想要的场景及图片。不过当前使用 Stable Diffusion 面临如下问题:单个Pod处理请求的吞吐率有限,如果多个请求转发到同一个Pod,会导致服务端过载异常,因此需
352 0
如何基于 Knative 提供生产级别 Stable Diffusion 服务
|
运维 网络协议 Java
MSE 诊断利器上线
因此 MSE 提供了一键诊断工具,发现 client -> server 链路上的问题并提供建议,使得问题排查更加快捷。
MSE 诊断利器上线
|
NoSQL 测试技术 Go
Golang周边 | Benchmark性能测试
Golang Benchmark性能测试
246 0
Golang周边 | Benchmark性能测试
|
SQL 存储 缓存
【笔记】用户指南—诊断与优化——性能趋势
本文介绍了PolarDB-X性能趋势的查看方式。 PolarDB-X集成DAS的性能趋势功能,提供计算节点(CN)、存储节点(DN)、GMS节点的监控指标查看能力。同时支持多种查看性能趋势方式,不仅支持性能趋势区间查看,也支持性能趋势对比查看和自定义性能趋势查看。
130 0
【笔记】用户指南—诊断与优化——性能趋势
|
存储 弹性计算 运维
阿里云Elasticsearch智能存储引擎能力再升级,索引存储大小降低超40%!
Elastic中国开发者大会2023上,阿里云首次对外公开Elasticsearch全面Serverless化背后的产品技术架构,阿里云Elasticsearch依靠云原生底座技术升级,持续进行内核优化,并在日志场景大幅提升使用性价比,向用户提供更简单、更稳定、更弹性的搜索云服务。
305 0
阿里云Elasticsearch智能存储引擎能力再升级,索引存储大小降低超40%!
|
SQL 存储 缓存
用户指南—诊断与优化——性能趋势
本文介绍了PolarDB-X性能趋势的查看方式。 PolarDB-X集成DAS的性能趋势功能,提供计算节点(CN)、存储节点(DN)、GMS节点的监控指标查看能力。同时支持多种查看性能趋势方式,不仅支持性能趋势区间查看,也支持性能趋势对比查看和自定义性能趋势查看。
109 0
用户指南—诊断与优化——性能趋势
|
运维 测试技术
性能测试系列三 压测方式简单总结 和压测指标的来源
性能测试系列三 压测方式简单总结 和压测指标的来源
|
SQL 消息中间件 监控
基于 PTS 压测轻松玩转问题诊断
性能测试 PTS(Performance Testing Service)是具备强大的分布式压测能力的 SaaS 压测平台,可模拟海量用户的真实业务场景,全方位验证业务站点的性能、容量和稳定性。
基于 PTS 压测轻松玩转问题诊断