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

效果展示

屏幕截图-2021-12-28-160821

posted @ 2021-12-28 16:14  Oto_G  阅读(869)  评论(0编辑  收藏  举报