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