Linux使用CPULimit限制进程对CPU的使用(支持动态监测)
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