Linux使用CPULimit限制進程對CPU的使用(支持動態監測)
作者:Oto_G
QQ:421739728
轉載請標明原作者
環境
我的運行環境是centos7.9,並且安裝sar和cpulimit
代碼
廢話不多說,上代碼
#!/bin/bash
# 動態限制進程對CPU的使用
# cpu總體使用率超過rate就開始檢測進程CPU使用率
rate=50
# 如果單進程CPU使用率超過180則將它限制到170(因為我的服務器是雙核CPU,所以最高占用顯示的是200,單核就是100以此類推)
cpul=180
cpus=170
# 如果單進程CPU使用率超過110則將它限制到90(有時候多個進程一起運行導致總的CPU使用率過高,這兩個門限就是控制這種情況)
cpuf=110
cput=90
# 存限制過的進程號,以防短時間內再次限制該進程
declare -A limitMap
while :
do
# 用sar來檢查總CPU使用率,請根據自己實際情況修改
sar -u 1 5 | awk '{if($1 == "平均時間:" && $3 > '${rate}')print ($3)}' > /root/cpuLimitBash/w1.tmp
while read cpuUse
do
echo 'cpuUse='$cpuUse
# 用top檢查單個進程的CPU使用率
top -bn1 | awk '{if(NR>=8 && $9>'${cpul}')print ($1,$2,$9)}' > /root/cpuLimitBash/w2_1.tmp
while read pid user cpu
do
# 如果該進程不在limitMap里面就用cpuLimit限制
if [ ! -n "${limitMap[$pid]}" ]
then
echo ' pid='$pid,'user='$user,'cpu='$cpu
# 記錄限制該進程的時間和PID
limitMap[$pid]=`date '+%s'`
echo " cpulimit -p "${pid}" -l "$cpus
# 開后台限制該進程,如果不用后台會導致循環卡在這,直到進程銷毀
nohup cpulimit -p ${pid} -l ${cpus} > /root/cpuLimitBash/cpuLimitLogging.log 2>&1 &
fi
done < /root/cpuLimitBash/w2_1.tmp
top -bn1 | awk '{if(NR>=8 && $9>'${cput}' && $9<'${cpuf}')print ($1,$2,$9)}' > /root/cpuLimitBash/w2_2.tmp
while read pid user cpu
do
if [ ! -n "${limitMap[$pid]}" ]
then
echo ' pid='$pid,'user='$user,'cpu='$cpu
limitMap[$pid]=`date '+%s'`
echo " cpulimit -p "${pid}" -l "$cput
nohup cpulimit -p ${pid} -l ${cput} > /root/cpuLimitBash/cpuLimitLogging2.log 2>&1 &
fi
done < /root/cpuLimitBash/w2_2.tmp
done < /root/cpuLimitBash/w1.tmp
# 循環每五秒檢測一次
sleep 5
dateNow=`date '+%s'`
# 如果limitMap里有待超過8分鍾的PID就將其從limitMap中刪除,這里的時長請根據自己實際需求來設置
for key in ${!limitMap[@]}
do
es=`expr $dateNow - ${limitMap[$key]}`
if [ $es -gt 480 ]
then
unset limitMap[$key]
fi
done
done