文档章节

Netty与Voovan并发性能对比

愚民日记
 愚民日记
发布于 2017/03/07 18:14
字数 1966
阅读 2364
收藏 44

Netty: 大名鼎鼎, Javaer 人尽皆知的优秀框架,作为曾今的使用者对 netty 的作者也有无限的崇拜之情.对于 netty 的特点和优势这里不在多言,以免言多必失,大家可以问度娘.嘿嘿

Voovan:  Voovan奉行简约、优雅,其核心功能则是异步通信,同时还包含了动态编译、反射、ORM、Http 服务和客户端、websocket 服务和客户端、JSON 的序列化以及日志等一款综合性工具框架。

既然 Voovan 和 Netty 都是已 socket 通信作为核心的通信框架.这里我们对 Voovan 和 Netty 做一个性能对比的测试,同时我们对编码也进行对比,来看看两款框架有什么神奇的区别。

异同点:

     1.都支持 TLS、SSL 加密。

     2.都支持 TCP、UDP 通信模型。

     3.都使用异步事件驱动。

     4.都实现了 HTTP、WEBSOCKET 协议的支持。

     5.Voovan 比 Netty 多了一个消息分割类,具体看后面的介绍 。

     6.Voovan 框架额外实现了一个 Web 服务。    

     7.文档方面两个框架都有着较为丰富的文档,只是 Netty 文档多为英文,而 Voovan 由于是国人开发,多为中文文档.

     8.Netty 提供了较多的协议的默认实现.

     9.Voovan 提供了额外的更多的工具类的支持.

 

一、主机环境

     资源有限使用虚拟机进行性能测试

     OS              Ubuntu 16.04
     CPU            Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
     CPUCount   4核
     内存            512M
     JDK            OpenJDK  1.8.0_111-8u111-b14-2 @ ubuntu0.16.04.2-b14
     命令            ab -c 100 -n 10000 http://10.0.0.102:2808?/

二、测试说明

     测试目的: 对比 Voovan 和 Netty 在并发场景下能够支撑的并发连接数.

     测试工具: Apache bench

     原料:Netty 4.1.8 、 Voovan1.0-RC-1

     为避免自己编码的压测工具带来各种风险,同时也为了使测试结果更加公平、真实、可信。测试方法如下:

          1. 使用 ab 进行压力测试 

         2. Voovan 和 Netty 两个框架分别模拟 Http 服务,在接受到 HTTP 请求后不进行解析,直接返回相同的 Http 响应后关闭连接。

         3. 每次响应都关闭连接,保证不会因 HTTP 的 KeepAlive 头带来的长连接影响测试结果的准确性。

三、测试代码

Voovan主类: AioPerformTest

public static void main(String[] args) throws IOException {
		AioServerSocket serverSocket = new AioServerSocket("0.0.0.0",28081,5000);
		serverSocket.filterChain().add(new StringFilter()); //配置过滤器
                serverSocket.handler(new PerformTestHandler());     //配置业务类
		serverSocket.messageSplitter(new PerformTestSpliter()); // 配置消息截断器
		serverSocket.start();  //开启监听
	}
        ........      

 

Voovan业务类 PerformTestHandler:

public class PerformTestHandler implements IoHandler {

	private String responseStr ;
	
	public PerformTestHandler(){
		responseStr  =  "HTTP/1.1 200 OK\r\n" +
				  "Date: Wed, 10 Jun 2009 11:22:58 GMT\r\n" +
				  "Server: Microsoft-IIS/6.0\r\n" +
				  "X-Powered-By: ASP.NET\r\n" +
				  "Content-Length: 2\r\n" +
				  "Content-Type: text/html\r\n" +
				  "Cache-control: private\r\n\r\n"+
				  "OK\r\n\r\n";
	}

	@Override
	public Object onReceive(IoSession session, Object obj) {
		return responseStr;
	}

	@Override
	public void onSent(IoSession session, Object obj) {
		session.close(); //关闭连接
	}

    ........
}

 

Netty主类:

        netty 的业务累使用了内联类的方式写入到主类中了,以下代码的主体来自 netty 官网

package org.voovan.test.netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * 类文字命名
 *
 * @author helyho
 *         <p>
 *         Voovan Framework.
 *         WebSite: https://github.com/helyho/Voovan
 *         Licence: Apache v2 License
 */
public class NettyServer {

    public static void main(String[] args) throws InterruptedException {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new DiscardServerHandler());
                        }
                    })
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    .childOption(ChannelOption.SO_KEEPALIVE, true);

            ChannelFuture f = b.bind(28080).sync();

            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

    public static class DiscardServerHandler extends ChannelInboundHandlerAdapter {
        private String retVal;

        public DiscardServerHandler(){
            retVal = "HTTP/1.1 200 OK\r\n" +
                    "Server: Voovan-WebServer/V1.0-RC-1\r\n" +
                    "Connection: keep-alive\r\n" +
                    "Content-Length: 2\r\n" +
                    "Date: Thu, 05 Jan 2017 04:55:20 GMT\r\n" +
                    "Content-Type: text/html\r\n"+
                    "\r\n"+
                    "OK\r\n\r\n";
        }

        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            //byte[] buffer = new byte[((ByteBuf) msg).readableBytes()];
            //((ByteBuf) msg).readBytes(buffer);
            //System.out.println(new String(buffer));
            //((ByteBuf) msg).clear();
            ((ByteBuf) msg).release();

            ByteBuf bf = ctx.alloc().buffer(retVal.length());
            bf.writeBytes(retVal.getBytes());
            ctx.writeAndFlush(bf);
            ctx.close();
        }

        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // (4)
            // Close the connection when an exception is raised.
            cause.printStackTrace();
            ctx.close();
        }
    }
}

以上完整的测试代码均在https://git.oschina.net/helyho/Voovan可以找到。

2017-07-01: 有网友质疑采用 ctx.alloc()方式没有从 Bytebuf 池中获取.经过调试截图如下:    

        

PooledByteBufAllocator 对象是用来分配bytebuf池中非堆内存的,所以通ctx.alloc().buffer(retVal.length());的方式实际上是从bytebuf池中获取的 bytebuf。

四、代码比对

     首先请以初学者的角度来看待以上两段代码:

     1.Voovan 仅仅5行代码就可以完成对 Socket 的初始化工作,每行代码都有他独立的作用,结构清晰易懂.Netty 则最少需要8行代码来实现而且包含一个内联类,对于初学者来说可能理解有些难度多数初学者就是复制粘贴直接使用。

     2.Voovan 框架通过 PerformTestSpliter 消息分割类将消息转换成你期望的类型,这样在 IoHandler的实现类中的OnRecive 事件中可以直接使用.Netty 则需要在接收事件中进行处理.其实提供消息分割器的目的是为了优雅的解决粘包的问题。

     3.Voovan 和 Netty 都提供过滤链来对消息进行处理,但 Voovan 的过滤链是在消息分割类之后是可以有针对性的过滤一个有效且完成的报文。

     4.Voovan 和 Netty 都采用了自管理线程池能根据业务情况自动扩充线程池的大小。

    基于以上的代码做了一个简单的对比分析,两个框架在目的和功能上具有相通性,采用了不同的方法进行实现。

   

五、测试步骤

    1.首先进行5次预热,以保证框架的线程池管理达到最优状态

    2.接着,连续运行10次并记录结果。

    3.首先测试 Voovan 框架,测试完成后,等待3分钟后进行 Netty 框架的测试

    由于机器是虚拟机所以各项ab的参数设置的并不高,但好在两个测试程序运行在同样的环境中,并使用同样的参数进行测试,横向对比的结果还是可靠的

 

六、数据说话

下面我们来看看测试数据:

 

框架 第一次 第二次 第三次 第四次 第五次 第六次 第七次 第八次 第九次 第十次 平均
Voovan 18734.1 18573.97 18990.18 19394.95 18946.86 16115.36 14878.41 18410.92 21638.65 19569.17 18525.257
Netty 19382.62 18808.45 19255.73 12422.08 20086.29 20176.91 19604.92 19338.77 14812.84 16474.74 18036.335

 

通过上表可以看出:

Voovan 框架在10次测试后平均并发数据为: 18525

Netty 框架在10次测试后平均并发数据为: 18036

 

两个框架在并发性能上差异为:489,平均导10次每次的差异约为49,鉴于我们进行测试的总请求量是10000,这个差异可能是机器的各种不可控因素导致的差异,个人认为是可以忽略的.并不影响两个框架的整体性能。

 

性能曲线分析:

    橙色的线条是 Netty 的数据

    蓝色的线条是 Voovan 的数据

 

 

 

可以看到 Voovan 的出现了一次较大的向下波动,Netty 出现了两次较大的向下波动.具体波动原因不得而知,推测可能是虚拟机较弱,因 GC 导致,由于只有10次测试的样本并所以不能通过较大的波动次数来评判框架的好坏。

总的来说两个框架在并发性能上应该是处于相同级别的,或者说都具有优秀的并发性能。

 

最后各位童鞋,你们怎么看呢?

有兴趣了解 Voovan 的朋友可以移步【Voovan】

© 著作权归作者所有

共有 人打赏支持
愚民日记
粉丝 67
博文 9
码字总数 14581
作品 4
乌鲁木齐
后端工程师
加载中

评论(16)

光的笔记

引用来自“beykery”的评论

引用来自“光的笔记”的评论

开源项目受到质疑是常有的事情的,作者继续努力:+1:

我不太肯定你说的是什么意思。你鼓励作者继续努力没错,谁都需要努力。我的意思是,你没必要这样说,我只是在进行纯粹的技术讨论,不需要你说什么受到质疑请继续努力,这都是没有意义没有力量的屁话。
你可以申辩说你们是在进行讨论,但在我看来,你们其实不是在做讨论,因为讨论是会有核心议题的,很显然你们没有,所以说是质疑。当然质疑本身这并没有错。现在回到源头,在开源中国对开源作者进行留言鼓励,算是基本的礼貌,我不太明白鼓励作者为啥也会让你如此激动到喷脏话?凡是不同意你观点的,你都要这样?
beykery
beykery

引用来自“光的笔记”的评论

开源项目受到质疑是常有的事情的,作者继续努力:+1:

我不太肯定你说的是什么意思。你鼓励作者继续努力没错,谁都需要努力。我的意思是,你没必要这样说,我只是在进行纯粹的技术讨论,不需要你说什么受到质疑请继续努力,这都是没有意义没有力量的屁话。
光的笔记
开源项目受到质疑是常有的事情的,作者继续努力:+1:
beykery
beykery

引用来自“愚民日记”的评论

我们完全不在一个频道,socket出入都是流操作关于流的特性这些基本的东西我就不解释了,如果你其他地方需要就需要自己想办法存起来,和这个非堆内存的缓冲有什么关系呢?,非堆内存的管理风险很高,没有任何框架会以牺牲稳定性为代价将非堆内存暴露给用户的,如果用户自己想用就需要用户自己管理

那你看怎么解释你说的那种连接建立时候分配非堆内存而连接关闭的时候回收呢?另外,暴露非堆内存没什么不好,netty的bytebuf是一个使用频率很高的api,它要求用户使用完毕的时候主动调用release,当然如果不调用,一个泄露检查线程会发现它并帮你回收。当然最高效的方式是不启用这个检查线程,而自己保证会正确调用release。给玩家一个选择吧我建议这样做。
愚民日记
愚民日记
我们完全不在一个频道,socket出入都是流操作关于流的特性这些基本的东西我就不解释了,如果你其他地方需要就需要自己想办法存起来,和这个非堆内存的缓冲有什么关系呢?,非堆内存的管理风险很高,没有任何框架会以牺牲稳定性为代价将非堆内存暴露给用户的,如果用户自己想用就需要用户自己管理
beykery
beykery

引用来自“愚民日记”的评论

引用来自“beykery”的评论

引用来自“愚民日记”的评论

引用来自“beykery”的评论

引用来自“愚民日记”的评论

引用来自“BoXuan”的评论

既然是并发,就应该开启netty适合并发的模式,netty的线程池分为解包封包线程池和业务线程池,你这边涉及到数据发送就属于业务范畴,就应该开启业务线程池,你开启后再测试吧,只有了解全面才能发表博客评论,不然就是误导别人,发博客之前还是多丰富一下自己知识,慎重点好
创建ServerBootstrap时我这边用了两个线程池,创建了两个NioEventLoopGroup线程池,一个叫bossGroup,一个叫workGroup。《Netty权威指南》里提到bossGroup是用来处理TCP连接请求的 (也就是Accept),workGroup是来处理IO事件,也就是(connect\recive 等等事件),代码只是需要简单的发送数据并不解释处理请求报文,也就是说不需要解包和封包,不存在阻赛的情况,为何还要单独在开一个线程来处理业务呢?,另外不太清楚你说的业务线程是什么?
最后,你的说法和《Netty权威指南》里的解释也大相径庭。
如果是我理解有问题,还请指教。

考虑到netty的其他特性,异步,多协议支持,线程模型,零拷贝。我觉得你这个不知名框架还任重道远。
看的出来你是一名 Netty 的卫道者,应该也是 Netty 的深度使用者。有时间的话你也可以深度了解一下 Voovan。确实 Voovan 在多协议支持上是确实是没法儿和 Netty 进行比较, Voovan 在开发过程中和 netty 一样是采用了零拷贝和非堆内存的,并且同一个连接在连接的同时申请非对内存,在连接完成时非堆内存已经申请完成,这样不会带来效率上的影响,而且非堆内存是自动增长并且不断复用的,连接关闭时自动释放内存不会等待 GC 来释放,也不需要开发者手工释放, 这一点和 Netty 在设计上是有明显差异的。这么做的目的是使 Voovan 在高并发存续过程中即保证了连接内部非堆内存申请最小化,也保证了在并发数量下降的同时JVM 对内存的消耗也同时随之下降,至于异步的问题, 毫无疑问用 AIO 必须是异步的形式,这个没有其他选择,除非手工写成同步的, 关于你说的线程模型目前在Voovan 中采用事件驱动形式来同时支持 AIO 和 NIO 两种异步模型的,事件是如何驱动线程的可以查看 EventTrigger 类。关于堆外内存的部分,可以运行测试用例然后使用 jvisualvm 进行观察对内存的消耗情况。

这个看来是伤了作者的心了,表示道歉。看了你说的使用非堆内存的使用,我觉得反而不妙啊,为什么连接建立和断开就决定这段bytebuffer的生命周期?看不懂。我觉得使用非堆内存的理由了不仅仅是对应于每个连接的,跟连接无关。
在做这个设计之前,我做过非对内存申请和释放的高并发测试,性能非常的好, 实际上就是 C 语言中的 malloc 和 free,他只是对内存占用的地址进行标记,所以我认为在所有连接内共享 bytebuffer 会对内存造成不必要的浪费,因为始终需要预留一段缓存,给未到达的连接使用, 而并发量巨大的时候按照缓存的原理也需要根据并发的量缓存不同量的内存,最终我采取了统一个连接的生命周期和 bytebuffer 关联,以极小的性能损耗,换取极小的内存占用,这其实就是一个设计思路的选择,目前来看情况还不错,内存使用也比同类型的 t-io 低的多, 比 netty 内存消耗也低, 是一种尝试吧

我仍然觉得不妥。我的看法是bytebuffer跟连接毫无关系。或许你的意思是连接建立的时候开辟一段非堆内存用来接收输入流?连接关闭的时候就给它释放掉?那么其他我需要非堆内存的时候呢?
愚民日记
愚民日记

引用来自“beykery”的评论

引用来自“愚民日记”的评论

引用来自“beykery”的评论

引用来自“愚民日记”的评论

引用来自“BoXuan”的评论

既然是并发,就应该开启netty适合并发的模式,netty的线程池分为解包封包线程池和业务线程池,你这边涉及到数据发送就属于业务范畴,就应该开启业务线程池,你开启后再测试吧,只有了解全面才能发表博客评论,不然就是误导别人,发博客之前还是多丰富一下自己知识,慎重点好
创建ServerBootstrap时我这边用了两个线程池,创建了两个NioEventLoopGroup线程池,一个叫bossGroup,一个叫workGroup。《Netty权威指南》里提到bossGroup是用来处理TCP连接请求的 (也就是Accept),workGroup是来处理IO事件,也就是(connect\recive 等等事件),代码只是需要简单的发送数据并不解释处理请求报文,也就是说不需要解包和封包,不存在阻赛的情况,为何还要单独在开一个线程来处理业务呢?,另外不太清楚你说的业务线程是什么?
最后,你的说法和《Netty权威指南》里的解释也大相径庭。
如果是我理解有问题,还请指教。

考虑到netty的其他特性,异步,多协议支持,线程模型,零拷贝。我觉得你这个不知名框架还任重道远。
看的出来你是一名 Netty 的卫道者,应该也是 Netty 的深度使用者。有时间的话你也可以深度了解一下 Voovan。确实 Voovan 在多协议支持上是确实是没法儿和 Netty 进行比较, Voovan 在开发过程中和 netty 一样是采用了零拷贝和非堆内存的,并且同一个连接在连接的同时申请非对内存,在连接完成时非堆内存已经申请完成,这样不会带来效率上的影响,而且非堆内存是自动增长并且不断复用的,连接关闭时自动释放内存不会等待 GC 来释放,也不需要开发者手工释放, 这一点和 Netty 在设计上是有明显差异的。这么做的目的是使 Voovan 在高并发存续过程中即保证了连接内部非堆内存申请最小化,也保证了在并发数量下降的同时JVM 对内存的消耗也同时随之下降,至于异步的问题, 毫无疑问用 AIO 必须是异步的形式,这个没有其他选择,除非手工写成同步的, 关于你说的线程模型目前在Voovan 中采用事件驱动形式来同时支持 AIO 和 NIO 两种异步模型的,事件是如何驱动线程的可以查看 EventTrigger 类。关于堆外内存的部分,可以运行测试用例然后使用 jvisualvm 进行观察对内存的消耗情况。

这个看来是伤了作者的心了,表示道歉。看了你说的使用非堆内存的使用,我觉得反而不妙啊,为什么连接建立和断开就决定这段bytebuffer的生命周期?看不懂。我觉得使用非堆内存的理由了不仅仅是对应于每个连接的,跟连接无关。
在做这个设计之前,我做过非对内存申请和释放的高并发测试,性能非常的好, 实际上就是 C 语言中的 malloc 和 free,他只是对内存占用的地址进行标记,所以我认为在所有连接内共享 bytebuffer 会对内存造成不必要的浪费,因为始终需要预留一段缓存,给未到达的连接使用, 而并发量巨大的时候按照缓存的原理也需要根据并发的量缓存不同量的内存,最终我采取了统一个连接的生命周期和 bytebuffer 关联,以极小的性能损耗,换取极小的内存占用,这其实就是一个设计思路的选择,目前来看情况还不错,内存使用也比同类型的 t-io 低的多, 比 netty 内存消耗也低, 是一种尝试吧
beykery
beykery

引用来自“愚民日记”的评论

引用来自“beykery”的评论

引用来自“愚民日记”的评论

引用来自“BoXuan”的评论

既然是并发,就应该开启netty适合并发的模式,netty的线程池分为解包封包线程池和业务线程池,你这边涉及到数据发送就属于业务范畴,就应该开启业务线程池,你开启后再测试吧,只有了解全面才能发表博客评论,不然就是误导别人,发博客之前还是多丰富一下自己知识,慎重点好
创建ServerBootstrap时我这边用了两个线程池,创建了两个NioEventLoopGroup线程池,一个叫bossGroup,一个叫workGroup。《Netty权威指南》里提到bossGroup是用来处理TCP连接请求的 (也就是Accept),workGroup是来处理IO事件,也就是(connect\recive 等等事件),代码只是需要简单的发送数据并不解释处理请求报文,也就是说不需要解包和封包,不存在阻赛的情况,为何还要单独在开一个线程来处理业务呢?,另外不太清楚你说的业务线程是什么?
最后,你的说法和《Netty权威指南》里的解释也大相径庭。
如果是我理解有问题,还请指教。

考虑到netty的其他特性,异步,多协议支持,线程模型,零拷贝。我觉得你这个不知名框架还任重道远。
看的出来你是一名 Netty 的卫道者,应该也是 Netty 的深度使用者。有时间的话你也可以深度了解一下 Voovan。确实 Voovan 在多协议支持上是确实是没法儿和 Netty 进行比较, Voovan 在开发过程中和 netty 一样是采用了零拷贝和非堆内存的,并且同一个连接在连接的同时申请非对内存,在连接完成时非堆内存已经申请完成,这样不会带来效率上的影响,而且非堆内存是自动增长并且不断复用的,连接关闭时自动释放内存不会等待 GC 来释放,也不需要开发者手工释放, 这一点和 Netty 在设计上是有明显差异的。这么做的目的是使 Voovan 在高并发存续过程中即保证了连接内部非堆内存申请最小化,也保证了在并发数量下降的同时JVM 对内存的消耗也同时随之下降,至于异步的问题, 毫无疑问用 AIO 必须是异步的形式,这个没有其他选择,除非手工写成同步的, 关于你说的线程模型目前在Voovan 中采用事件驱动形式来同时支持 AIO 和 NIO 两种异步模型的,事件是如何驱动线程的可以查看 EventTrigger 类。关于堆外内存的部分,可以运行测试用例然后使用 jvisualvm 进行观察对内存的消耗情况。

这个看来是伤了作者的心了,表示道歉。看了你说的使用非堆内存的使用,我觉得反而不妙啊,为什么连接建立和断开就决定这段bytebuffer的生命周期?看不懂。我觉得使用非堆内存的理由了不仅仅是对应于每个连接的,跟连接无关。
愚民日记
愚民日记

引用来自“beykery”的评论

引用来自“愚民日记”的评论

引用来自“BoXuan”的评论

既然是并发,就应该开启netty适合并发的模式,netty的线程池分为解包封包线程池和业务线程池,你这边涉及到数据发送就属于业务范畴,就应该开启业务线程池,你开启后再测试吧,只有了解全面才能发表博客评论,不然就是误导别人,发博客之前还是多丰富一下自己知识,慎重点好
创建ServerBootstrap时我这边用了两个线程池,创建了两个NioEventLoopGroup线程池,一个叫bossGroup,一个叫workGroup。《Netty权威指南》里提到bossGroup是用来处理TCP连接请求的 (也就是Accept),workGroup是来处理IO事件,也就是(connect\recive 等等事件),代码只是需要简单的发送数据并不解释处理请求报文,也就是说不需要解包和封包,不存在阻赛的情况,为何还要单独在开一个线程来处理业务呢?,另外不太清楚你说的业务线程是什么?
最后,你的说法和《Netty权威指南》里的解释也大相径庭。
如果是我理解有问题,还请指教。

考虑到netty的其他特性,异步,多协议支持,线程模型,零拷贝。我觉得你这个不知名框架还任重道远。
看的出来你是一名 Netty 的卫道者,应该也是 Netty 的深度使用者。有时间的话你也可以深度了解一下 Voovan。确实 Voovan 在多协议支持上是确实是没法儿和 Netty 进行比较, Voovan 在开发过程中和 netty 一样是采用了零拷贝和非堆内存的,并且同一个连接在连接的同时申请非对内存,在连接完成时非堆内存已经申请完成,这样不会带来效率上的影响,而且非堆内存是自动增长并且不断复用的,连接关闭时自动释放内存不会等待 GC 来释放,也不需要开发者手工释放, 这一点和 Netty 在设计上是有明显差异的。这么做的目的是使 Voovan 在高并发存续过程中即保证了连接内部非堆内存申请最小化,也保证了在并发数量下降的同时JVM 对内存的消耗也同时随之下降,至于异步的问题, 毫无疑问用 AIO 必须是异步的形式,这个没有其他选择,除非手工写成同步的, 关于你说的线程模型目前在Voovan 中采用事件驱动形式来同时支持 AIO 和 NIO 两种异步模型的,事件是如何驱动线程的可以查看 EventTrigger 类。关于堆外内存的部分,可以运行测试用例然后使用 jvisualvm 进行观察对内存的消耗情况。
愚民日记
愚民日记

引用来自“jackygurui”的评论

为啥在你的框架里面的返回的值是以实例的字段responseStr来记录的,然而在netty的测试中是在请求代码里?这样不是每次请求里都要初始化一次?虽然java有string pool,但这样还是会对比较产生影响啊。

还有为什么要ctx.alloc()这种明显影响性能的用法而不是采用通常从bytebuf池里面获取?
关于第一个点确实是我的失误, 已修正, 经过重新测试确实如你所说在性能上并没有什么明显的变化. Netty 和 Voovan 的测试结果相互领先的情况均有发生.
关于第二点,你可以用 debug 查看一下, 通过 ctx.alloc() 方法获得的是一个 PooledByteBufAllocator 对象,而这个对象就是用来分配bytebuf池中非堆内存的,所以通过ctx.alloc().buffer(retVal.length());的方式实际上是从bytebuf池中获取的 bytebuf.我在 blog 中更新了,我 debug 时的截图.
Voovan v2.0.2,高性能异步通信框架和工具库

VOOVAN 开源项目介绍 Voovan 是一个高性能异步网络框架和 HTTP 服务器框架,同时支持 HTTP 采集、动态编译支持、数据库访问封装以及 DateTime、String、Log、反射、对象工具、流操作、文件操...

愚民日记
2017/06/30
1K
11
Voovan v1.0.beta.1 文档丰富/性能优异

Voovan 开源框架V1.0.beta.1发布 Voovan 框架和 Netty 以及 Mina 框架类似,同样是提供了异步通信的支持,但相比的不同是 Voovan 框架采用 Aio 和 Nio 模型,框架内部解决了日常开发一些常遇...

愚民日记
2016/09/07
776
0
Voovan 参照 Jetty 的性能测试,中国框架一样很优秀

Voovan是一个综合框架,当然也有他的主打内容,今天,对就是今天,在这里给各位看官汇报一下他的并发测试能力. 测试对象:Voovan WebServer / Jetty9 测试工具: Apache bench (ab) Voovan WebSer...

愚民日记
2017/01/04
1K
2
Voovan V1.0-alpah-2 发布,并发性能大幅度提升

Voovan V1.0-alpah-2 发布l了,本次版本以Socket 异步通信的性能优化为主,经过1个多月的分析优化调试等工作,目前基于 Voovan 异步通信框架的 HTTP 服务的并发能力已经达到了 Jetty 并发的水平...

愚民日记
2016/07/01
1K
4
tomcat、netty以及nodejs的helloworld性能对比

最近闲来无事,对tomcat、netty以及nodejs的性能对比比较有兴趣,于是自行测试了一下。 测试环境: 测试工具:Apache JMeter2.9 测试代码: tomcat下的jsp: <%@page language="java" conten...

longrmlife
2013/04/05
0
20

没有更多内容

加载失败,请刷新页面

加载更多

搬瓦工镜像站bwh1.net被DNS污染,国内打不开搬瓦工官网

今天下午(2018年10月17日),继搬瓦工主域名bandwagonhost.com被污染后,这个国内的镜像地址bwh1.net也被墙了。那么目前应该怎么访问搬瓦工官网呢? 消息来源:搬瓦工优惠网->搬瓦工镜像站b...

flyzy2005
10分钟前
0
0
SpringBoot自动配置

本篇介绍下,如何通过springboot的自动配置,将公司项目内的依赖jar,不需要扫描路径,依赖jar的情况下,就能将jar内配置了@configuration注解的类,创建到IOC里面 介绍下开发环境 JDK版本1.8 spr...

贺小五
今天
3
0
命令行新建Maven多项目

参考地址 # DgroupId 可以理解为包名# DartifactId 可以理解为项目名mvn archetype:generate -DgroupId=cn.modfun -DartifactId=scaffold -DarchetypeArtifactId=maven-archetype-quickst......

阿白
今天
1
0
OSChina 周四乱弹 —— 上帝对我单身年限的惩罚越来越长了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享张卫健的单曲《身体健康》 《身体健康》- 张卫健 手机党少年们想听歌,请使劲儿戳(这里) 昨天是重阳节咯, 可惜小小编辑总是晚...

小小编辑
今天
12
1
django rest framework 外键序列化方法与问题总结

django rest framework 外键序列化方法与问题总结 当借口中需要出现一对多关系的时候,我们可以用rest_framwork的序列化功能来处理,代码如下. # models.pyfrom django.db import modelscl...

_Change_
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部