8

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

4

1 回答 1

3

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

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

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

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

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

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

用户不需要定义 volatile 字段来保持处理程序的状态。用户可以在将处理程序添加到 ChannelPipeline 时指定 EventExecutor。

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

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

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

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

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

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

于 2015-09-11T05:36:59.503 回答