【问题标题】:Netty 4 performance decreaseNetty 4 性能下降
【发布时间】:2013-11-14 20:19:14
【问题描述】:

当我从 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->4 迁移之间是否发生了变化?

标签: netty


【解决方案1】:

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 线程调用。

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    相关资源
    最近更新 更多