【问题标题】:MQTT/MongoDB application performance loss after update更新后 MQTT/MongoDB 应用程序性能损失
【发布时间】:2020-05-30 01:59:42
【问题描述】:

我更新了一个订阅 MQTT 主题并将收到的消息保存在 MongoDB 数据库中的应用程序。
正在使用 paho Java MQTT 驱动程序Spring Data MongoDB

应用程序的工作方式如下:
当消息到达时,消息处理被移动到一个单独的线程(使用 ThreadPoolExecutor)。因此,到达的消息被确认得非常快,当系统处于临时重负​​载状态时,我不需要因为“飞行队列已满”错误而陷入消息丢失的麻烦。可能会发生但我通常不会观察到的情况是,ThreadPoolExecutor 队列增长迅速,因为它处理得不够快。

更新系统后,我观察到 - 特别是在启动之后,但不仅如此 - ThreadPoolExecutor 队列增长了。应用程序总是设法赶上处理,但有时队列会增长到几万个任务。并且这具有每秒大约 700 条消息的持续相同负载(由于测试)。

到目前为止我测试的是:

Java  8 and App build with Java 8  -> works great
Java 11 and App build with Java 8  -> works great (some Illegal reflective access warnings of course)
Java 11 and App build with Java 11 -> makes some problems

应用更新当然包含依赖更新,主要有以下几种

spring-boot-starter-data-mongodb         1.15.12.RELEASE -> 2.2.4.RELEASE
  spring-data-mongodb                    1.10.11.RELEASE -> 2.2.4.RELEASE
  mongodb-driver                                          3.4.3 -> 3.11.2

org.eclipse.paho.client.mqttv3                              1.2.0 -> 1.2.2

MongoDB Server Version is 3.4.24

我怀疑库中的某些东西会导致性能下降。类似于 here 中描述的 MongoDB Java 驱动程序中已更改的 WriteConcern (但这不是我的问题,因为我已经在我的 Java 8 构建应用程序中使用了 mongo 驱动程序 3.4.3)。我只是找不到它可以是什么。

如果您知道导致这种行为的原因,请告诉我。现在我很茫然。

【问题讨论】:

  • 澄清一下,您描述的问题不会出现在 Java 8 的更新依赖项中,对吧?
  • 您是否手动指定要使用的 GC 算法?在 Java 11 中,默认值已从 Parallel 更改为 G1。
  • 尝试将GC改为ParrallelGC - stackoverflow.com/questions/46582523/…
  • 我尝试更改 GC,但观察结果没有改变。更新后的应用程序出现了问题,我确实(或多或少)将每个依赖项更新为新的(〜当前)版本(因为主要的春季启动更新)。奇怪的是,Java 8 应用程序版本(具有旧依赖项)在 Java 11 上运行良好。 - 随着更新的框架和依赖项,我观察到 ThreadPoolExecutor 队列中的条目数量越来越多。那里的作业将消息保存在数据库中。我猜问题一定出在某个地方。

标签: java mongodb mqtt spring-data-mongodb paho


【解决方案1】:

原来 paho java MQTT 客户端从 1.2.0 版本更新到 1.2.1(或者也可以是 1.2.2)导致 CPU 使用率显着增加。

issue #754 是为此在 GitHub 问题跟踪器中创建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2019-04-25
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多