第 7 章 监控代理以了解问题
AMQ Broker 包括一个名为 Critical 分析器 的内部工具,用于主动监控正在运行的代理,以解决死锁状况等问题。在生产环境中,死锁等问题可能是由 IO 错误、有缺陷的磁盘、内存不足或其他进程导致的 CPU 使用量过量造成的。
Critical 分析器定期测量关键操作的响应时间,如队列发送(即将消息添加到代理上的队列)和日志操作。如果已检查操作的响应时间超过可配置的超时值,则代理将被视为不稳定。在这种情况下,您可以将 Critical Analyzer 配置为只记录消息或采取措施保护代理,如关闭代理或停止运行代理的虚拟机(VM)。
7.1. 配置 Critical Analyzer
以下流程演示了如何配置 Critical 分析器以监控代理是否存在问题。
流程
打开
<broker_instance_dir>/etc/broker.xml
配置文件。Critical Analyzer 的默认配置如下所示。
<critical-analyzer>true</critical-analyzer> <critical-analyzer-timeout>120000</critical-analyzer-timeout> <critical-analyzer-check-period>60000</critical-analyzer-check-period> <critical-analyzer-policy>HALT</critical-analyzer-policy>
指定参数值,如下所述。
critical-analyzer
-
指定是否启用或禁用 Critical 分析器工具。默认值为
true
,这意味着启用了 工具。 critical-analyzer-timeout
- Critical Analyzer 运行的检查的超时时间,以毫秒为单位。如果其中一个检查的操作用时超过这个值,代理就会被视为不稳定。
critical-analyzer-check-period
- 每次操作的连续检查间隔,关键分析器之间的时间间隔为毫秒。
critical-analyzer-policy
-
如果代理失败并被视为不稳定,此参数指定代理是记录消息(
LOG
)、停止托管代理的虚拟机(VM)
还是关闭代理(SHUTDOWN
)。
根据您配置的策略选项,如果关键操作的响应时间超过配置的超时值,则输出类似于以下之一:
critical-analyzer-policy
=LOG
[Artemis Critical Analyzer] 18:11:52,145 WARN [org.apache.activemq.artemis.core.server] AMQ224081: The component org.apache.activemq.artemis.tests.integration.critical.CriticalSimpleTest$2@5af97850 is not responsive
critical-analyzer-policy
=HALT
[Artemis Critical Analyzer] 18:10:00,831 ERROR [org.apache.activemq.artemis.core.server] AMQ224079: The process for the virtual machine will be killed, as component org.apache.activemq.artemis.tests.integration.critical.CriticalSimpleTest$2@5af97850 is not responsive
critical-analyzer-policy
=SHUTDOWN
[Artemis Critical Analyzer] 18:07:53,475 ERROR [org.apache.activemq.artemis.core.server] AMQ224080: The server process will now be stopped, as component org.apache.activemq.artemis.tests.integration.critical.CriticalSimpleTest$2@5af97850 is not responsive
您还可以在类似以下内容的代理中看到线程转储:
[Artemis Critical Analyzer] 18:10:00,836 WARN [org.apache.activemq.artemis.core.server] AMQ222199: Thread dump: AMQ119001: Generating thread dump * =============================================================================== AMQ119002: Thread Thread[Thread-1 (ActiveMQ-scheduled-threads),5,main] name = Thread-1 (ActiveMQ-scheduled-threads) id = 19 group = java.lang.ThreadGroup[name=main,maxpri=10] sun.misc.Unsafe.park(Native Method) java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) java.lang.Thread.run(Thread.java:745) =============================================================================== ..... .......... =============================================================================== AMQ119003: End Thread dump *
修订于 2022-04-03 11:52:11 +1000