当前位置: 首页 > 知识库问答 >
问题:

Netty 4性能下降

郎和志
2023-03-14

当我从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/trunk/nfs-rpc网络4

共有1个答案

贺栋
2023-03-14

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

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

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

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

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

在Netty进行的每个ChannelHandler方法调用之间的关系之前总是会发生这种情况。

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

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

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

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

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

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

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

 类似资料:
  • dubbo 2.5.6版本新增了对netty4通信模块的支持,启用方式如下 provider端: <dubbo:protocol server="netty4" /> 或 <dubbo:provider server="netty4" /> consumer端: <dubbo:consumer client="netty4" /> 注意 provider端如需不同的协议使用不同的通信层框架,

  • 在可能的范围内,我减少了在这个周期中创建和销毁的对象的数量和大小。这基本上耗尽了我解决这类问题的工具包! 任何关于我如何理解和纠正性能逐渐下降的建议将非常感谢!

  • 我需要定期将数据从TMP数据库复制到远程PROD数据库,并在列中进行一些数据修改。当我使用PROD数据库中的postgres_fdw扩展(带有映射外部模式)时,复制一百万条记录的过程将持续6分钟。 但是,当我使用dblink从PROD数据库复制相同的表时(SQL运行在PROD数据库上,而不是TEMP上),该过程持续20秒。 如何优化和缩短从临时数据库复制数据的过程? 我必须在TMP数据库上运行SQ

  • 在代理切换到分页模式后,我看到性能出现了奇怪的下降。一些消息开始花很长时间: 1800 我还看到了大量磁盘使用情况: 我的: Linux Astra、4 CPU 24GB ram 50GB SSD、ActiveMQ Artemis 2.7.0 只有代理重启有帮助

  • 本文向大家介绍请比较下for、forEach、for of的性能的性能相关面试题,主要包含被问及请比较下for、forEach、for of的性能的性能时的应答技巧和注意事项,需要的朋友参考一下 1.for 最好 2.forEach与for of 相差无几 平均测试下来forEach略高for of 3.forEach 无法通过 break跳出 for of内存占用上有一定的优势

  • 使用thoses和JPA属性 Ehcache对于相同的查询不是有效的, 问题与QueryCache类的函数namedParameters.hashCode()有关,它为同一个查询生成不同的HashCode! 这与类有关 它为同一个数组对象[01,1]生成一个不同的(新的)hachCode! 此hashCode方法对于数组应该是递归的