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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM