From cda745b19c3596e890d11f80d2d2a861e8c6797a Mon Sep 17 00:00:00 2001 From: Davidze Date: Wed, 16 Aug 2017 14:16:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=AF=B9=E5=A4=9A=E6=A0=B8Li?= =?UTF-8?q?nux=20CPU%=20=E7=9A=84=E6=9C=9F=E6=9C=9B=E5=8D=A0=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cpu_scheduler.sh | 183 ++++++++++++++++++++++++++++++++++++++++ cpulimit | Bin 0 -> 47515 bytes cpulimit.zip | Bin 0 -> 24801 bytes dead_circle.sh | 14 +++ readme.txt | 32 +++++++ start_kg_cpu_control.sh | 75 ++++++++++++++++ stop_kg_cpu_control.sh | 15 ++++ test_cpu_release.sh | 44 ++++++++++ test_dead_circle.sh | 15 ++++ 9 files changed, 378 insertions(+) create mode 100755 cpu_scheduler.sh create mode 100755 cpulimit create mode 100644 cpulimit.zip create mode 100755 dead_circle.sh create mode 100644 readme.txt create mode 100755 start_kg_cpu_control.sh create mode 100755 stop_kg_cpu_control.sh create mode 100755 test_cpu_release.sh create mode 100755 test_dead_circle.sh diff --git a/cpu_scheduler.sh b/cpu_scheduler.sh new file mode 100755 index 0000000..9c1a361 --- /dev/null +++ b/cpu_scheduler.sh @@ -0,0 +1,183 @@ +#! /bin/bash +#! -*- coding=utf-8 -*- +# Author:zhouze03 +# Date: 2017-08-15 + +###### +# 期望当正经的CPU%使用率 < 期望值时 ; 可以启动额外的任务来提升CPU的使用率; +# 备注: +# 1. 当前程序作为附加程序,要做到”不得已而用之“; +# 2. 本程序会调用一个非常消耗CPU的脚本程序:这个进程暂且称之为”greedy(贪婪的)进程“(死循环脚本) +# 3. 服务器其它的进程都认为是online的进程; +###### + +# 1. 当前CPU总使用率(排除/kill贪婪进程);(CURR_CPU_RATE) +# 2. 某进程CPU总使用率:(greedy_process_cpu_rate)(舍弃) +# 3. 期望的CPU% 使用百分值;(EXPECT_CPU_RATE) +# 4. 逻辑CPU的个数 CPU_LOGI_NUM + +############ +# 算法: +# 无限循环语句: +# 0. 每5分钟检查一次; +# 1. 由于当前的进程CPU使用率不好获取,因此,使用直接kill贪婪进程的方式(如果有进程),然后获取此刻的CPU使用率(该使用率 = 正经CPU使用率) +# 2. 获取当前的CPU% 使用率; +# 3. 获取贪婪值:GREEDY_VALUE=(EXPECT_CPU_RATE - CURR_CPU_RATE) +# Case1: GREEDY_VALUE > 0; then +# 本次贪婪占用核数目 =(CPU核数目 * 贪婪值(0.0-1))向下取整 && 启动与贪婪核数目相同的进程数目;(通过cpulimit 限制贪婪进程最高占用95%CPU) +# 备注: +# 使用cpulimit 只运行单进程对单核的使用上限为95% 是为了避免超过100%不可预期的异常。(不确定超过100% 是否会造成问题,因此保险起见进行了限制) +# 其次,线程可控,该程序脚本的线程上限为CPU的核数目,不会为了打满CPU而创建过的线程的情况,(Linux 用户线程有上限,避免影响线上(正经)的服务) +# 备注(重点): +# 单个贪婪进程所占用的CPU% : +# 1. 如果当前机器总CPU% < 50%; then: 可以使得单贪婪进程CPU% > 80%; (如果一半的CPU逻辑单元被占满不会影响其它服务可以这样设置,否则按下面的方式) +# 2. 如果当前服务器上正经的服务对CPU逻辑单元需求很大,则设置单个贪婪进程CPU% <= 50% , 同时贪婪进程个数增加, +# 这样虽在表面上看起来两个50% 的进程占用了100%,但是在CPU的并发度上是不同的,其它的进程有机会去获取CPU时间片去执行它们的程序; +# 简而言之: +# CPU_LIMIT_FOR_GREEDY_PROCESS 确定了贪婪进程的个数与进程所占的比例 +############ + + +# 设定期望值(改为main参数确定) +# EXPECT_CPU_RATE=50 +# 贪婪进程比例的设定 (改为main参数确定) +# CPU_LIMIT_FOR_GREEDY_PROCESS=50 + +# 当前CPU% +function get_curr_cpu_rate(){ + local curr_cpu_rate=`env LC_ALL=en_US.UTF8 sar 1 1 | grep ^Average | awk '{print $8}' ` + curr_cpu_rate=${curr_cpu_rate%.*} + CURR_CPU_RATE=`expr 100 - $curr_cpu_rate` + echo "CURRENT CPU USAGE RATE="$CURR_CPU_RATE +} + +# 当前机器 逻辑CPU数目 +function get_cpu_logi_num(){ + CPU_LOGI_NUM=`cat /proc/cpuinfo| grep "processor"| wc -l` + echo "CPU LOGI NUM="$CPU_LOGI_NUM +} + +# kill 贪婪进程 +function kill_greedy_pid(){ + ps -ef | grep ./dead_circle.sh | grep -v grep | awk '{print $2}' | xargs kill -9 > /dev/null +} + +# 贪婪start +function fire_greedy_process(){ + echo "GREEDY NUM= "$1 + for i in `seq 1 $1` + do + { + ./cpulimit -l $CPU_LIMIT_FOR_GREEDY_PROCESS bash ./dead_circle.sh > /dev/null & + } + done +} + +############################################################################################## +##################################### 贪婪引擎 ############################################## +############################################################################################## + +function greedy_machine(){ + # 确定CPU核数目: + get_cpu_logi_num + + # 贪婪调度器 + while true + do + # 1.kill 贪婪进程 + kill_greedy_pid + # 2.获取当前CPU% + get_curr_cpu_rate + # 3.获取贪婪值 + GREEDY_VALUE=`expr $EXPECT_CPU_RATE - $CURR_CPU_RATE` + echo "GREEDY_VALUE="$GREEDY_VALUE + # 4.是否执行贪婪计划 + if [ $GREEDY_VALUE -gt 0 ]; then + # 确定贪婪进程数 + # greedy_process_num=`expr $CPU_LOGI_NUM \* $GREEDY_VALUE / 100` + greedy_process_num=`expr $CPU_LOGI_NUM \* $GREEDY_VALUE / $CPU_LIMIT_FOR_GREEDY_PROCESS` + GREEDY_PROCESS_NUM=${greedy_process_num%.*} + echo "GREEDY_PROCESS_NUM= "$GREEDY_PROCESS_NUM + # 大于0则调度 + if [ $GREEDY_PROCESS_NUM -gt 0 ]; then + fire_greedy_process $GREEDY_PROCESS_NUM + fi + fi + # 休眠1min + sleep 60 + done +} + +############################################################################################## +############################################################################################## +############################################################################################## + + + + +############################################################################################## +########################################## main ############################################# +############################################################################################## + + +function check_parameters(){ + + if [ "x$EXPECT_CPU_RATE" == "x" ] + then + echo "PARAM ERROR: EXPECT_CPU_RATE IS NULL (-e)" >&2 + exit -1 + fi + + if [ $EXPECT_CPU_RATE -lt 0 -o $EXPECT_CPU_RATE -gt 100 ] + then + echo "PARAM ERROR: EXPECT_CPU_RATE value expect [1-100] (-e)" >&2 + exit -1 + fi + + if [ "x$CPU_LIMIT_FOR_GREEDY_PROCESS" == "x" ] + then + echo "PARAM ERROR: CPU_LIMIT_FOR_GREEDY_PROCESS IS NULL (-l)" + exit -1 + fi + + if [ $CPU_LIMIT_FOR_GREEDY_PROCESS -lt 0 -o $CPU_LIMIT_FOR_GREEDY_PROCESS -gt 100 ] + then + echo "PARAM ERROR: CPU_LIMIT_FOR_GREEDY_PROCESS value expect [1-100] (-e)" >&2 + exit -1 + fi + + +} + + + + +while getopts "e:l:h" opt +do + case $opt in + e) + EXPECT_CPU_RATE=$OPTARG + echo "EXPECT_CPU_RATE= "$EXPECT_CPU_RATE + ;; + l) + CPU_LIMIT_FOR_GREEDY_PROCESS=$OPTARG + echo "CPU_LIMIT_FOR_GREEDY_PROCESS= "$CPU_LIMIT_FOR_GREEDY_PROCESS + ;; + *) + echo "ERROR don't support this parameter" >&2 + usage + exit -1 + ;; + esac +done + +check_parameters +greedy_machine + + +############################################################################################## +############################################################################################## +############################################################################################## + + + diff --git a/cpulimit b/cpulimit new file mode 100755 index 0000000000000000000000000000000000000000..09cbc6011c93e1f18347aca006ded71878ddd379 GIT binary patch literal 47515 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 literal 0 HcmV?d00001 diff --git a/cpulimit.zip b/cpulimit.zip new file mode 100644 index 0000000000000000000000000000000000000000..196abc11fe0336c789f5d5d212fb1f84e13c8440 GIT binary patch literal 24801 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/dev/null & +} + + +function check_parameters(){ + + if [ "x$EXPECT_CPU_RATE" == "x" ] + then + echo "PARAM ERROR: EXPECT_CPU_RATE IS NULL (-e)" >&2 + exit -1 + fi + + if [ $EXPECT_CPU_RATE -lt 0 -o $EXPECT_CPU_RATE -gt 100 ] + then + echo "PARAM ERROR: EXPECT_CPU_RATE value expect [1-100] (-e)" >&2 + exit -1 + fi + + if [ "x$CPU_LIMIT_FOR_GREEDY_PROCESS" == "x" ] + then + # 用户没有输入,则提供默认值 + CPU_LIMIT_FOR_GREEDY_PROCESS=60 + fi + + if [ $CPU_LIMIT_FOR_GREEDY_PROCESS -lt 0 -o $CPU_LIMIT_FOR_GREEDY_PROCESS -gt 100 ] + then + echo "PARAM ERROR: CPU_LIMIT_FOR_GREEDY_PROCESS value expect [1-100] (-e)" >&2 + exit -1 + fi + + +} + + + + +while getopts "e:l:" opt +do + case $opt in + e) + EXPECT_CPU_RATE=$OPTARG + echo "EXPECT_CPU_RATE= "$EXPECT_CPU_RATE + ;; + l) + CPU_LIMIT_FOR_GREEDY_PROCESS=$OPTARG + echo "CPU_LIMIT_FOR_GREEDY_PROCESS= "$CPU_LIMIT_FOR_GREEDY_PROCESS + ;; + *) + echo "ERROR don't support this parameter" >&2 + usage + exit -1 + ;; + esac +done + +check_parameters +start + +############################################################################################## +############################################################################################## +############################################################################################## diff --git a/stop_kg_cpu_control.sh b/stop_kg_cpu_control.sh new file mode 100755 index 0000000..fc38454 --- /dev/null +++ b/stop_kg_cpu_control.sh @@ -0,0 +1,15 @@ +#! /bin/bash +#! -*- coding=utf-8 -*- +# Author:zhouze03 +# Date: 2017-08-16 + + +# kill 主线程 +ps -ef | grep ./cpu_scheduler.sh | grep -v grep | awk '{print $2}' | xargs kill -9 + +# 为了安全起见kill 贪婪进程(正常情况kill 主线程,子线程即退出) +ps -ef | grep ./dead_circle.sh | grep -v grep | awk '{print $2}' | xargs kill -9 + + +# 测试脚本相关 +# ps -ef | grep ./test_dead_circle.sh | grep -v grep | awk '{print $2}' | xargs kill -9 \ No newline at end of file diff --git a/test_cpu_release.sh b/test_cpu_release.sh new file mode 100755 index 0000000..f658162 --- /dev/null +++ b/test_cpu_release.sh @@ -0,0 +1,44 @@ +#! /bin/bash +#! -*- coding=utf-8 -*- +# Author:zhouze03 +# Date: 2017-08-15 + + +############# +# 该脚本用于测试的目的,测试当有CPU% 已经超过期望的值时(这里由自己决定,比如KG机器希望CPU超50%,那么此值即50) +# cpu_schedule.sh 的脚本逻辑是否会判断当前检测时刻CPU负载达标,从而不会去启动贪婪进程。 +# 操作&&简而言之: +# 确定该脚本需要启用多少个贪婪进程,这个需要使用者自己根据CPU的逻辑核数目去计算, +# 比如48核,在没有任何其它CPU消耗的情况下,需要启用大概 48 * 50% = 24 个贪婪进程(下面脚本固定控制为单CPU逻辑单元使用为 95%) +# 备注: +# 视当前测试机器CPU 现有占用百分值去计算。 +# 测试目标: +# 上述进程确定并启动后,使用htop进行观察,cpu_scheduler 应该判断出当前CPU已经达到指标值,从而它不会启动它要调用的贪婪进程。 +# 目标符合预期则: +# cpu_scheduler.sh 程序能根据机器CPU自适应的调节贪婪进程的启动数目。 +############ + + + +function fire_greedy_process(){ + for i in `seq 1 22` + do + { + echo "start greedy process "$i + # 贪婪进程 + ./cpulimit -l 95 bash ./test_dead_circle.sh >/dev/null & + } + done +} + +FLAG=0 + +while true +do + if [ $FLAG -eq 0 ]; then + echo "FLAG="$FLAG + fire_greedy_process + FLAG=1 + fi + +done \ No newline at end of file diff --git a/test_dead_circle.sh b/test_dead_circle.sh new file mode 100755 index 0000000..7417bc9 --- /dev/null +++ b/test_dead_circle.sh @@ -0,0 +1,15 @@ +#! /bin/bash +#! -*- coding=utf-8 -*- +# Author:zhouze03 +# Date: 2017-08-15 + + +####### +# 死循环脚本,贪婪程序即该脚本 +####### + + +while true +do + echo "-----do---" +done \ No newline at end of file