Netty 4性能下降

7
当我从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

1
你尝试过对你的应用程序进行性能分析吗?如果是,瓶颈在哪里? - Scott Mitchell
你正在使用哪种线程池?在3->4迁移之间有更改吗? - Chris Mowforth
1个回答

3
Netty4引入了新的线程模型,也许您应该调整代码以获得更好的性能。以下是来自Netty Wiki的一些要点,Netty4中还有更多的变化。
在3.x中没有明确定义的线程模型,尽管在3.5中曾试图修复其不一致性。4.0定义了一个严格的线程模型,帮助用户编写ChannelHandler时不必过多担心线程安全问题。
除非ChannelHandler带有@Sharable注解,否则Netty永远不会同时调用ChannelHandler的方法。这与处理程序方法的类型(入站、出站或生命周期事件处理程序方法)无关。
用户不再需要同步入站或出站事件处理程序方法。
4.0禁止添加一个ChannelHandler超过一次,除非它带有@Sharable注解。
每个ChannelHandler方法调用之间都存在happens-before关系。
用户不需要定义易失性字段来保持处理程序的状态。用户可以在将处理程序添加到ChannelPipeline时指定EventExecutor。
如果指定了EventExecutor,则始终通过指定的EventExecutor调用ChannelHandler的处理程序方法。
如果未指定,则始终由其关联的Channel注册到的EventLoop调用处理程序方法。
分配给处理程序或通道的EventExecutor和EventLoop始终是单线程的。
处理程序方法将始终由同一线程调用。
如果指定了多线程EventExecutor或EventLoop,则首先选择其中一个线程,然后使用所选线程直到注销。
如果在同一管道中的两个处理程序分配了不同的EventExecutors,则它们同时被调用。即使仅由同一管道中的处理程序访问共享数据,用户也必须注意线程安全性。
添加到ChannelFuture的ChannelFutureListeners始终由分配给该future关联的Channel的EventLoop线程调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接