AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 710142
Accepted
nn4l
nn4l
Asked: 2015-08-02 02:31:54 +0800 CST2015-08-02 02:31:54 +0800 CST 2015-08-02 02:31:54 +0800 CST

monit:如何在不使服务器超载的情况下重新启动许多 Tomcat?

  • 772

我的服务器有几个单独的 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 负载现在很低,并立即启动所有服务。

monitoring
  • 2 2 个回答
  • 704 Views

2 个回答

  • Voted
  1. sam_pan_mariusz
    2015-08-02T11:46:13+08:002015-08-02T11:46:13+08:00

    您没有过多介绍您的操作系统,我只能假设它是 Linux(kill -9 ...部分)。我也不太了解monit,但假设它是一个灵活的解决方案,允许您在服务失败时重试启动服务。

    我假设 Tomcat 实例是使用 shell 启动脚本启动的。在这些脚本的开头添加某处:

    # edit the 3 lines to set your limits
    LOAD_THRESHOLD=0.75
    LOCK_TIME=30
    TIME_LIMIT=120
    
    LOCK_FILE='/var/lock/tomcat-delay.lock'
    
    if [ -z "${TOMCAT_NOLOCK}" ]; then
        # simple locking mechanism to avoid simultaneous start of instances
        if [ -f "${LOCK_FILE}" ] && [ $(cat "${LOCK_FILE}") -gt $(date '+%s') ]; then
            exit 1
        else
            expr $(date '+%s') + ${LOCK_TIME} 1>"${LOCK_FILE}"
        fi
    fi
    
    T_TIME=0
    while true; do
        # check for non-empty TOMCAT_NOWAIT
        if [ -n "${TOMCAT_NOWAIT}" ]; then
            break 1
        fi
        read T_LOAD60 T_REST </proc/loadavg
        # check current 60 sec. average value for system load
        if expr ${T_LOAD60} '<' ${LOAD_THRESHOLD} 1>/dev/null; then
            break 1
        fi
        # check for timeout
        if [ ${T_TIME} -ge ${TIME_LIMIT} ]; then
            # change to 'exit 1' to fail on timeout instead of proceeding
            break 1
        fi
        sleep 1s
        echo -n '.'
        T_TIME=$((${T_TIME} + 1))
    done
    

    上面的代码实际上并不仅仅检查 CPU 负载,而是检查系统负载平均值,根据设计,它包括所有可能降低性能的因素。TIME_LIMIT以秒为单位。如果负载在给定时间内未低于给定阈值,脚本将最终尝试启动您的服务 - 最后break 1一部分可以更改为exit 1以中止启动并告诉monit守护程序重试。

    如果您尝试手动启动服务(而不是从monit),它也会等待,我认为这是一个优势。您可以使用非空值导出 env TOMCAT_NOWAIT以避免它。

    编辑#1:添加简单的锁定机制作为同时实例启动问题的解决方法。非空环境 TOMCAT_NOLOCK禁用锁定。将LOCK_TIME 设置为实例的预热时间,以便正确检测到高负载。

    • 0
  2. Best Answer
    nn4l
    2015-09-18T00:56:23+08:002015-09-18T00:56:23+08:00

    我现在已经找到了可以完成这项工作的设置。重启或多个进程失败后,检查CPU负载,每个服务只有在CPU负载低于1或延迟较长时间后才会启动。下面的脚本在我的环境中工作得很好:

    编辑 /etc/monit/monitrc:

    ...
    ## Start Monit in the background (run as a daemon):
    #
    set daemon 120              # check services at 2-minute intervals
        with start delay 240    # optional: delay the first check by 4-minutes (by
    #                           # default Monit check immediately after Monit start)
    

    对于每个服务,将其添加到 /etc/monit/conf.d:

    check process myname with pidfile /var/run/app0000.pid
        start program = "/usr/sbin/service app0000 start" with timeout 60 seconds
        stop program  = "/usr/sbin/service app0000 stop"
        if does not exist then exec "/root/bin/service_with_delay app0000 start"
    

    创建脚本 /root/bin/service_with_delay:

    #!/bin/bash
    (
      # Wait for lock on /var/lock/service_with_delay.lock (fd 9)
      flock -n 9 || exit 1
    
      for i in `seq 1 10`; do
    
        # start the service if the cpu load is < 1.0 or after waiting for 300 seconds
    
        read load ignore </proc/loadavg
        flag=`expr ${load} '<' 1`
        if [ ${flag} -eq 1 ] || [ ${i} -eq 10 ]; then
    
            echo `date` service_with_delay $1: pid $$ load ${load} i ${i} - starting >> /var/log/service_with_delay.log
            /usr/sbin/service $1 start
    
            # make sure next script getting the lock sees some load
            sleep 60
            break
        fi
    
        # wait
        echo `date` service_with_delay $1: pid $$ load ${load} i ${i} >> /var/log/service_with_delay.log
        sleep 30
      done
    ) 9> /var/lock/service_with_delay.lock
    
    • 0

相关问题

  • 如何监控系统在哪里写/读磁盘?[关闭]

  • 如何监控 SAN 服务器(通过 iSCSI)?

  • 共享点管理?

  • 安全地授予对 SQL 2005 复制监视器的访问权限以创建快照

  • SNMP HOSTMIB.MIB 未加载?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve