基于Netty的应用程序性能问题

时间:2015-06-30 14:35:55

标签: java linux macos netty mqtt

我有一个基于生产者消费者的应用程序基于Netty。基本要求是构建面向消息的中间件(MOM)

MOM

因此,MOM基于排​​队的概念(排队使系统松散耦合,这是应用程序的基本要求)。 经纪人了解MQTT协议。我们在本地机器上对应用程序进行了压力测试。这些是本地机器的规格。

enter image description here

我们取得了很好的成绩。但是,我们的生产服务器是基于AWS Ubuntu的。因此,我们在AWS Ubuntu服务器上测试了相同的应用程序。性能比本地系统低10倍<差> 。这是AWS服务器的配置。

enter image description here

我们尝试了以下选项来确定问题所在。

  • 最初我们检查了业务逻辑中的错误。没找到任何。
  • 在mac和aws上使代理,客户端和所有其他依赖项相同。我的意思是相同的依赖关系是我们在aws上安装了与mac相同的版本。
  • 增加了AWS的ulimit。
  • 使用sysctl设置。
  • 我们使用的是Netty 4.1,我们怀疑它可能是一个Netty错误,因为我们还没有稳定版本的Netty 4.1。所以我们甚至使用Netty 3.9.8 Final(Stable)构建了整个应用程序,我们仍然遇到了同样的问题。
  • 大幅增加了AWS机器的硬件配置。

现在我们已经完全没有选择了。两个机器上的java版本是相同的。

enter image description here

因此,我们的最后一招是使用NodeJS构建整个应用程序,但这需要付出很多努力,而不是在Netty本身中调整一些东西。我们并不是在寻找基于Java的Netty替代品,因为我们认为这可能是JVM NIO在Mac和Ubuntu上的本机实现中的一个错误。

我们可以尝试哪些可能的选项来解决此错误。这是Netty固有的问题。或者这与Mac和Ubuntu上的一些内部实现有什么关系,这些实现是不同的,并且正如我们所看到的那样导致性能差异?

修改

压力测试参数如下。

  • 我们有1000个客户端每秒发送1000条消息(全球费率)。
  • 我们进行了大约10分钟的测试以记录延迟。
  • 在服务器端,我们有10个处理消息的消费者线程。
  • 我们为每个客户端提供了一个新的ChannelHandler实例。
  • 对于Netty所需的boss池和工作池,我们使用了Cached Thread池。
  • 我们尝试调整消费者线程,但无济于事。

修改2

这些是jvmtop为一个负载测试阶段提供的分析器结果。

enter image description here

0 个答案:

没有答案