Google compute engine 如何根据CPU使用情况自动杀死空闲的GCE实例?

Google compute engine 如何根据CPU使用情况自动杀死空闲的GCE实例?,google-compute-engine,Google Compute Engine,我在实例组中的一些实例上运行一些稍微不可靠的软件。该软件是通过启动脚本安装和运行的,大多数情况下它都可以正常工作,但是大约10%的新实例内存不足,并且由于软件中某种内存泄漏而崩溃。我自己无法修复这个漏洞,所以在此期间,我每隔几个小时检查一次实例,并杀死任何显示空闲CPU的实例(该软件通常会消耗所有可用的CPU电源) 但是,我使用的是可抢占实例,它们可以随时被杀死并重新启动,只要我不主动监视它们,就会让死实例运行。在一天无人看管的情况下,我通常会在仪表板上看到80-85%的CPU使用率,其余的都浪

我在实例组中的一些实例上运行一些稍微不可靠的软件。该软件是通过启动脚本安装和运行的,大多数情况下它都可以正常工作,但是大约10%的新实例内存不足,并且由于软件中某种内存泄漏而崩溃。我自己无法修复这个漏洞,所以在此期间,我每隔几个小时检查一次实例,并杀死任何显示空闲CPU的实例(该软件通常会消耗所有可用的CPU电源)

但是,我使用的是可抢占实例,它们可以随时被杀死并重新启动,只要我不主动监视它们,就会让死实例运行。在一天无人看管的情况下,我通常会在仪表板上看到80-85%的CPU使用率,其余的都浪费掉了


有没有什么自动化的方法可以杀死这些死掉的实例?重新启动它们已经由实例组处理。

这个问题似乎有两个部分:

  • 识别死实例
  • 消灭那些例子
  • 在识别死实例方面,一种方法是使用一个单独的管理实例,该实例不运行此软件,并对其他实例进行跟踪。例如,它可以周期性地向各个实例发送运行状况请求,并将无响应的实例或报告过高CPU使用率的实例标记为不健康


    一旦您的管理实例识别出需要重置的不健康实例,您就应该能够使用API(我猜是命令)或使用gcloud命令行工具执行相同的操作重置这些其他实例。

    以下操作对我有效。这是一个bash脚本,它使用
    uptime
    UNIX命令检查CPU上15分钟的平均负载是否低于阈值,如果连续十次检查都是这样,它会自动关闭系统。您需要在VM实例中运行此操作

    信用证,以及更详细的解释:

    #/bin/bash
    阈值=0.4
    计数=0
    虽然是真的
    做
    负载=$(正常运行时间| sed-e's/*负载平均值://g'| awk'{print$3}')
    res=$(echo$load'使用viswajithiii的答案和以下帖子,在没有bc的情况下(不在GCP容器操作系统中)这是有效的:
    

    在关机之前,它还会将历史记录列表附加到文件中。我将阈值设置得很低,但即使在通过cli编辑文件时,负载也显示为0.00。如果实例负载较重,可能工作得更好

    #!/bin/bash
    threshold=10
    
    count=0
    while true
    do
    
      load=$(uptime | sed -e 's/.*load average: //g' | awk '{ print $3 }')
      load2=$(awk -v a="$load" 'BEGIN {print a*100}')
      echo $load2
      if [ $load2 -lt $threshold ]
      then
        echo "Idling.."
        ((count+=1))
      fi
      echo "Idle minutes count = $count"
    
      if (( count>10 ))
      then
        echo Shutting down
        # wait a little bit more before actually pulling the plug
        sleep 300
        history -a
        sudo poweroff
      fi
    
      sleep 60
    
    done
    
    这对我的低cpu不起作用,但这似乎太:

    #!/bin/bash
    threshold=1
    
    count=0
    while true
    do
    
      load=$(awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 1000 / (t-t1); }' <(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat))
      load2=$(printf "%.0f\n" $load)  
      echo $load
      echo $load2
      if [[ $load2 -lt $threshold ]]
      then
        echo "Idling.."
        ((count+=1))
      fi
      echo "Idle minutes count = $count"
    
      if (( count>10 ))
      then
        echo Shutting down
        # wait a little bit more before actually pulling the plug
        sleep 300
        history -a
        sudo poweroff
      fi
    
      sleep 60
    
    done
    

    实际上,它正在被删除。相反,我可以在编辑中为实例添加自定义元数据:
    启动脚本
    #!/bin/bash\n~./autooff.sh

    我希望我可以将此作为评论添加到viswajithiii中,但我只是害怕评论所需的声誉

    当我使用cpu数量可变的云虚拟机作为正常运行时间的输出时,我发现静态
    阈值
    变量不合适,如前所述

    我更新的脚本在
    阈值
    分配下添加了两行,以按cpu数量缩放
    阈值
    。这允许我设置cpu利用率百分比,该百分比将在具有不同cpu数量的VM之间工作

    否则,脚本与viswajithiii的脚本相同

    #!/bin/bash
    
    threshold=0.4
    n_cpu=$( grep 'model name' /proc/cpuinfo | wc -l )
    threshold=$( echo $n_cpu*$threshold | bc )
    
    count=0
    while true
    do
    
      load=$(uptime | sed -e 's/.*load average: //g' | awk '{ print $3 }')
      res=$(echo $load'<'$threshold | bc -l)
      if (( $res ))
      then
        echo "Idling.."
        ((count+=1))
      fi
      echo "Idle minutes count = $count"
    
      if (( count>10 ))
      then
        echo Shutting down
        # wait a little bit more before actually pulling the plug
        sleep 300
        sudo poweroff
      fi
    
      sleep 60
    
    done
    
    !/bin/bash
    阈值=0.4
    n_cpu=$(grep'model name'/proc/cpuinfo | wc-l)
    阈值=$(echo$n_cpu*$threshold | bc)
    计数=0
    虽然是真的
    做
    负载=$(正常运行时间| sed-e's/*负载平均值://g'| awk'{print$3}')
    
    res=$(echo$load’查看服务器上的这些问答故障:虽然这个答案比我希望的更模糊,但它确实引导我朝着正确的方向发展。我最终编写了一个小脚本,偶尔检查15分钟的平均负载,如果低于
    0.50
    ,就会导致它所运行的机器死机。这有点困难,但它是我不需要运行专用的监控实例。我会将您的答案标记为已接受,因为这是一个合理的解决方案,即使它不是我想要的。
    sudo mkdir /etc/my_init.d
    sudo mv autooff.sh /etc/my_init.d/autooff.sh
    sudo chmod 755 /etc/my_init.d/autooff.sh
    
    #!/bin/bash
    
    threshold=0.4
    n_cpu=$( grep 'model name' /proc/cpuinfo | wc -l )
    threshold=$( echo $n_cpu*$threshold | bc )
    
    count=0
    while true
    do
    
      load=$(uptime | sed -e 's/.*load average: //g' | awk '{ print $3 }')
      res=$(echo $load'<'$threshold | bc -l)
      if (( $res ))
      then
        echo "Idling.."
        ((count+=1))
      fi
      echo "Idle minutes count = $count"
    
      if (( count>10 ))
      then
        echo Shutting down
        # wait a little bit more before actually pulling the plug
        sleep 300
        sudo poweroff
      fi
    
      sleep 60
    
    done