Netty 4表现下降

blu*_*avy 7 netty

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

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

有人可以给我建议吗?

可以在以下网址查看代码:https: //code.google.com/p/nfs-rpc/source/browse/#svn%2Ftrunk%2Fnfs-rpc-netty4

小智 3

Netty4引入了新的线程模型,也许你应该调整你的代码以获得更好的性能。这里有一些来自Netty Wiki的要点,netty4中还有更多的变化。

尽管在 3.5 中尝试修复其不一致问题,但 3.x 中没有明确定义的线程模型。4.0定义了严格的线程模型,帮助用户编写ChannelHandler而不必过多担心线程安全。

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

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

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

Netty 进行的每个 ChannelHandler 方法调用之间始终存在happens-before关系。

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

如果指定,则 ChannelHandler 的处理程序方法始终由指定的 EventExecutor 调用。

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

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

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

如果指定了多线程EventExecutor或EventLoop,将首先选择其中一个线程,然后使用所选线程直到注销。

如果同一管道中的两个处理程序分配有不同的 EventExecutor,则它们会同时调用。如果多个处理程序访问共享数据,即使共享数据仅由同一管道中的处理程序访问,用户也必须注意线程安全。添加到 ChannelFuture 的 ChannelFutureListener 始终由分配给 future 关联 Channel 的 EventLoop 线程调用。