Netty 4性能下降

当我从Netty 3升级到Netty 4时,性能下降约为45%。

我在做性能测试时比较了Netty 3和Netty 4的线程转储。 Netty 4服务器似乎使用更多时间进行写入操作。 但是,如果我使用基于Netty 4的客户端与基于Netty 3的服务器,则性能下降仅为5%左右,所以我猜想原因在服务器端,但我找不到原因。

有人可以给我建议吗?

该代码可以在以下URL中看到:https://code.google.com/p/nfs-rpc/source/browse/#svn%2Ftrunk%2Fnfs-rpc-netty4


Netty4引入了一个新的线程模型,也许你应该调整你的代码以获得更好的性能。 以下是Netty Wiki的一些观点,netty4有更多的变化。

在3.x中没有定义好的线程模型,尽管有人试图在3.5中解决它的不一致问题。 4.0定义了一个严格的线程模型,可以帮助用户编写一个ChannelHandler,而不用担心线程安全问题。

Netty不会同时调用ChannelHandler的方法,除非ChannelHandler用@Sharable标注。 这与处理程序方法的类型无关 - 入站,出站或生命周期事件处理程序方法。

用户不再需要同步入站或出站事件处理程序方法。

4.0不允许多次添加一个ChannelHandler,除非它用@Sharable注释。

在Netty所做的每个ChannelHandler方法调用之间总是会发生关系。

用户不需要定义易失性字段来保持处理程序的状态。 用户可以在他或她向ChannelPipeline添加处理程序时指定EventExecutor。

如果指定,ChannelHandler的处理程序方法总是由指定的EventExecutor调用。

如果未指定,则处理器方法始终由其关联的Channel注册到的EventLoop调用。

分配给处理程序或通道的EventExecutor和EventLoop始终是单线程的。

处理程序方法将始终由同一个线程调用。

如果指定了多线程EventExecutor或EventLoop,则会先选择其中一个线程,然后使用所选线程,直到取消注册。

如果同一管道中的两个处理程序分配有不同的EventExecutors,则会同时调用它们。 如果多个处理程序访问共享数据,即使只有同一管道中的处理程序访问共享数据,用户也必须注意线程安全。 添加到ChannelFuture的ChannelFutureListeners总是由分配给将来关联频道的EventLoop线程调用。

链接地址: http://www.djcxy.com/p/17033.html

上一篇: Netty 4 performance decrease

下一篇: How to create a django User using DRF's ModelSerializer