我的服务器有几个单独的 Apache Tomcat 实例,每个实例都需要大量时间和 CPU 才能启动。不可能同时启动所有这些。这会产生过多的 I/O,每个服务将需要更长的时间才能启动,并且服务甚至可能由于内部超时而无法启动。
这是一些描述我想要做的伪代码。我将如何使用 monitrc 文件完成此操作?
check process service01 with pidfile /var/run/service01.pid
start program = "/usr/sbin/service service01 start" with timeout 60 seconds
stop program = "/usr/sbin/service service01 stop"
if does not exist then
wait a random number of seconds (between 2 and 5 minutes)
if the cpu load is < 100% then
start program
else
do nothing (check again in the next cycle)
check process service02 with pidfile /var/run/service02.pid
....
将为 10 个服务中的每一个重复此代码块。
关键步骤是随机等待。否则,如果服务器空闲并且没有服务在运行(例如在 'killall -9 java' 之后),monit 将检查所有服务,发现 cpu 负载现在很低,并立即启动所有服务。
您没有过多介绍您的操作系统,我只能假设它是 Linux(
kill -9 ...
部分)。我也不太了解monit,但假设它是一个灵活的解决方案,允许您在服务失败时重试启动服务。我假设 Tomcat 实例是使用 shell 启动脚本启动的。在这些脚本的开头添加某处:
上面的代码实际上并不仅仅检查 CPU 负载,而是检查系统负载平均值,根据设计,它包括所有可能降低性能的因素。TIME_LIMIT以秒为单位。如果负载在给定时间内未低于给定阈值,脚本将最终尝试启动您的服务 - 最后
break 1
一部分可以更改为exit 1以中止启动并告诉monit守护程序重试。如果您尝试手动启动服务(而不是从monit),它也会等待,我认为这是一个优势。您可以使用非空值导出 env TOMCAT_NOWAIT以避免它。
编辑#1:添加简单的锁定机制作为同时实例启动问题的解决方法。非空环境 TOMCAT_NOLOCK禁用锁定。将LOCK_TIME 设置为实例的预热时间,以便正确检测到高负载。
我现在已经找到了可以完成这项工作的设置。重启或多个进程失败后,检查CPU负载,每个服务只有在CPU负载低于1或延迟较长时间后才会启动。下面的脚本在我的环境中工作得很好:
编辑 /etc/monit/monitrc:
对于每个服务,将其添加到 /etc/monit/conf.d:
创建脚本 /root/bin/service_with_delay: