第 6 章 监控代理的问题
AMQ Broker 包括一个称为 Critical Analyzer 的内部工具,用于主动监控运行代理是否有问题,如死锁条件。在生产环境中,因为 IO 错误、存在缺陷磁盘、内存短缺或 CPU 使用量导致的 CPU 使用量等问题,如死锁条件。
Critical 分析程序定期测量队列交付等关键操作的响应时间(即,将消息添加到代理上的队列中)和日志操作。如果检查的操作响应时间超过可配置的超时值,则代理被视为不稳定。在这种情况下,您可以将 Critical Analyzer 配置为只记录信息或采取措施来保护代理,如关闭代理或停止运行代理的虚拟机(VM)。
6.1. 配置关键分析器
以下流程演示了如何配置 Critical Analyzer 以监控代理是否有问题。
步骤
打开
<broker-instance-dir>/etc/broker.xml
配置文件。Critical 分析器的默认配置如下所示。
<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 分析运行的检查超时(以毫秒为单位)。如果检查的操作之一的时间超过这个值,则代理被视为不稳定。
critical-analyzer-check-period
- 每次操作通过 Critical 分析器连续检查时间(以毫秒为单位)。
critical-analyzer-policy
-
如果代理失败并被视为不稳定,这个参数指定代理记录一条消息(
LOG
),停止托管代理(HALT
)的虚拟机(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-03-19 15:53:01 +1000