您的位置:首页 > 运维架构 > Linux

Linux使用CPULimit限制进程对CPU的使用(支持动态监测)

2021-12-28 16:14 423 查看

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

效果展示

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: