<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢(mèng)蝶

    生活、程序、未來(lái)
       :: 首頁(yè) ::  ::  :: 聚合  :: 管理

    yanf4j 1.0-stable的一個(gè)壓測(cè)報(bào)告

    Posted on 2009-10-09 14:08 dennis 閱讀(3130) 評(píng)論(2)  編輯  收藏 所屬分類: java
        采用的是jboss netty的benchmark,環(huán)境是兩臺(tái)linux機(jī)器,都是4核16G內(nèi)存以及2.6內(nèi)核,網(wǎng)絡(luò)環(huán)境是公司內(nèi)網(wǎng),帶寬是1Gbps,JDK1.6.0_07。對(duì)比的是mina 2.0M6yanf4j 1.0-stable,兩者都在壓到16K,5000并發(fā)的時(shí)候客戶端退出,因此后面給出的圖有個(gè)16K的在5000并發(fā)為0,事實(shí)上只是幾個(gè)連接失敗,但是benchmark client就忽略了這個(gè)數(shù)據(jù)。實(shí)際過(guò)程還測(cè)試了1萬(wàn)并發(fā)連接的情況,但是由于測(cè)試客戶端很容易退出,因此最后還是選定最大并發(fā)5000。注意,并非mina和yanf4j無(wú)法支撐1萬(wàn)個(gè)連接,而是benchmark client本身的處理,再加上內(nèi)核tcp參數(shù)沒(méi)有調(diào)整造成的。

    首先看源碼,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,沒(méi)有多大區(qū)別:
    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個(gè)線程),開(kāi)啟TCP_NODELAY選項(xiàng),Client采用SYNC模式,壓測(cè)結(jié)果如下(僅供參考),分別是數(shù)據(jù)大小為128、1K、4K和16K情況下,隨著并發(fā)client上升吞吐量的對(duì)比圖:














    系統(tǒng)的資源消耗來(lái)看,Mina的load相對(duì)偏高。

    評(píng)論

    # re: yanf4j 1.0-stable的一個(gè)壓測(cè)報(bào)告  回復(fù)  更多評(píng)論   

    2009-10-10 10:05 by wzjin
    yanf4j 看來(lái)不錯(cuò)!

    # re: yanf4j 1.0-stable的一個(gè)壓測(cè)報(bào)告  回復(fù)  更多評(píng)論   

    2009-10-10 11:10 by dennis
    @wzjin
    這個(gè)測(cè)試可能對(duì)mina不公平吧,畢竟mina封裝的比較多,包括ByteBuffer的封裝上面。只的定位不同,yanf4j的目標(biāo)就是簡(jiǎn)單高效。
    主站蜘蛛池模板: 亚洲av乱码一区二区三区| 国产亚洲精品拍拍拍拍拍| 久久精品国产亚洲AV无码偷窥| 人成午夜免费大片在线观看| 国产免费小视频在线观看| 美女扒开尿口给男人爽免费视频| 在线观看免费成人| 亚洲av中文无码乱人伦在线观看| 免费特级黄毛片在线成人观看| 亚洲色无码国产精品网站可下载| 成年女人免费视频播放体验区| 亚洲精品自偷自拍无码| 四虎影视永久免费视频观看| 农村寡妇一级毛片免费看视频| 亚洲日本中文字幕天堂网| 99热在线日韩精品免费| 亚洲成av人影院| 亚洲一区免费视频| 精品亚洲456在线播放| 国产成人aaa在线视频免费观看 | 全黄A免费一级毛片| 亚洲精品国产日韩无码AV永久免费网| 一级毛片在播放免费| 亚洲91av视频| 中文字幕无码免费久久99| 国产精品亚洲专区无码牛牛| 亚洲色欲久久久久综合网| 久久综合九色综合97免费下载| 激情五月亚洲色图| 免费jlzzjlzz在线播放视频| a国产成人免费视频| 亚洲国产成人精品青青草原| 日本免费一本天堂在线| 久久久受www免费人成| 亚洲图片激情小说| 全黄a免费一级毛片人人爱| 国产一区二区三区免费| 中文字幕精品三区无码亚洲| 国产91精品一区二区麻豆亚洲| 91高清免费国产自产| 免费在线观看自拍性爱视频|