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

高CPU使用率和负载与许多队列和会话在ActiveMQ Artemis

凌和颂
2023-03-14

我有一个Artemis代理(2.10.1)在一个Docker容器中运行,只有一个地址,但有许多(500)个队列。每个队列都有一个过滤器属性,它们不重叠,路由类型是多播的。

broker
- address: example
  - multicast
    - queue: dummy1 (filter: dummy=1)
    - queue: dummy2 (filter: dummy=2)
    - queue: dummy3 (filter: dummy=3)
    - ...

当客户端连接时,客户端和代理的cpu使用率从~5%上升到~40%,根据htop(~20%正常~20%内核)。JMX报告约10%的CPU使用率。将htop更改为树状视图时,我可以看到~10%的线程和许多0。x%的线程。队列是空的,我既不产生也不消耗消息。整个系统处于空闲状态。客户机只建立一个连接,但每个队列只建立一个会话,从而产生500个会话。

我的配置有什么问题?我看不出有这样的CPU使用和负载的原因。

更新:

我做了更多的测试,结果表明,只有当Docker参与进来时,CPU使用率/负载才会发生。

  • 代理在主机A上的Docker容器中运行,纯artemis核心客户端在主机B上运行(没有Docker):

我还在做更多的研究,只是想让你知道现在的状态,不再责怪阿尔特弥斯表现不佳。

顺便说一句,一个有趣的附带信息是:在空闲期间,两个应用程序都只使用artemis依赖项(core)

更新2:带starter artemis的Spring Boot非常健谈,因为默认情况下,它使用的是轮询的DefaultContainerFactory。如果在给定的超时时间内没有任何消息,它会发出强制拉取命令,这就是hornetq强制传递seq消息的原因。在我的core/jms测试中,我使用了异步消息处理程序,如果切换到SimpleContainerFactory,它将由Spring Boot starter artemis提供。

共有1个答案

欧阳杰
2023-03-14

经纪人最近有所改进https://issues.apache.org/jira/browse/ARTEMIS-2990)对于这样的场景:我强烈建议尝试更新的版本。

如果它不能解决你的问题,我建议你跑步https://github.com/jvm-profiling-tools/async-profiler/采样CPU使用情况(它还包括GC、编译和本机堆栈跟踪)。

考虑到最初的地址/队列管理使用的是同步操作,这将使Java线程在热路径上严重竞争:这可能会导致内核/系统CPU周期花费来管理它(记住:竞争的java锁由OS互斥锁支持)这样的CPU使用率不会出现在JMX上。

 类似资料:
  • 问题内容: 关闭。 这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 7年前关闭。 最近,我的服务器CPU性能一直很高。 CPU平均负载为13.91(1分钟)11.72(5分钟)8.01(15分钟),而我的站点的流量仅略有增加。 运行完最高命令后,我看到MySQL使用的CPU是160%! 最近,我一直在优化表,并切换到持久连接。这会

  • 我对wowza中的cpu使用有问题。 这是可疑的线程。这个线程被占用了高CPU。 这个线程占用了大量cpu。这是jdk bug还是其他? 这是我的环境。 CentOS 5.4版(最终版) WowzaMediaServer-3.1.2 java版本1.6.0_23 java(TM)SE Runtime Environment(构建1.6.0_23-b05)java HotSpot(TM)64位服务器

  • 在我的Kubernetes安装中,我可以看到cAdvisor为每个POD/容器报告一个称为“CONTAINER_CPU_LOAD_AVERAGE_10S”的度量值。我得到诸如232、6512等值。 那么,这里CPU负载的计量单位是什么呢?对我来说,“CPU负载”和“CPU使用”是可以互换使用的,所以我不明白为什么它不是一个介于[0-100]之间的值? 更新: 这里我放了cAdvisor日志中的相关

  • 我正在使用mod安全规则https://github.com/SpiderLabs/owasp-modsecurity-crs清理用户输入数据。在将用户输入与mod security rule正则表达式匹配时,我面临着cpu激增和延迟。总的来说,它包含500个正则表达式来检查不同类型的攻击(xss、badrobots、generic和sql)。对于每个请求,我检查所有参数并对照所有这500个正则表

  • 问题内容: 对于Java代码的特定部分,我想测量: 执行时间(最有可能的 线程执行时间 ) 内存使用情况 CPU负载(具体可归因于代码段) 我是Java的相对新手,并不熟悉如何实现。我已经提到过JMX,但是我不确定该如何使用,而JMX对于我想做的事情看起来有点“沉重”。 理想情况下,我想要一些可以告诉我要测量什么的测量类,可以选择在代码段之前调用方法,在代码段之后调用方法。相关指标将记录到我指定的

  • 我有: a)1台服务器(4vcpu,8GB)运行hazelcast节点, b)1台(4vcpu,8MB)运行tomcat 7上的hazelcash性能中心。 两台服务器都在同一个本地网络中。 我已经测试了2个场景:< br >场景1)我已经开始了a)和b)。没有传输数据。a)上的cpu使用率为0-10%。< br >情景2)我已经开始了a)和b)。我已经将大量数据转移到a)上进行处理,并一直等到它