背景:
应急方案预演:在做分布式系统的时候,部分系统资源比较空闲(性能好)。在测试高可用场景中想摸底整个系统在全部在高负载的情况下:系统的容灾、主备切换、冗余服务器拉起等,需要将服务器短板资源全部达到预警值附近。
方案一:
根据测试情况,起停对应集群的节点
优缺点:该方案操作繁琐,且破坏了场景的完整性;在停止不当的情况下可能造成业务失败
方案二:
模拟消耗资源
程序:多线程模拟,需要根据服务器的配置动态能够调整
优缺点:不动程序,只消耗资源;当然操作也会造成司机,可能会全部占满计算资源,导致计算机无法工作(可以稍作修改:将入参做个判断使它最大保持90这样就不会因为误操作导致沾满计算资源)
shell实现
#!/bin/bash
#定义生成的c文件名称和可执行程序名称
fileName="cpu_use"
#定义使用方法说明
usage(){
echo "./`basename $0` <start|stop|adjust> <cpu_Rate> [sleeptime/worktime] [adjustRange]"
echo ""
echo "start:按照核的数量启动 $fileName"
echo "stop:停止所有 $fileName"
echo "adjust:自动调整占用cpu的使用率"
echo "cpu_Rate:占用cpu比率"
echo "sleeptime/worktime:cpu空闲和工作时间的占比 可以通过该参数调整"
echo "adjustRange:允许cpu的波动范围 即curentcpu-adjustRange cpu_Rate curentcpu+adjustRange就不再调整"
echo ""
exit
}
#判定参数的个数,参数不能少于1个,且必须为限定参数:start,stop,adjust
if [ $# -lt 1 ]
then
usage
fi
#设置需要占用的cpu比率,默认为50%
if [ "$2" == "" ]
then
cpu_Rate=50
else
cpu_Rate=$2
fi
#设置允许的波动范围,默认为5
if [ "$4" == "" ]
then
adjustRange=5
else
adjustRange=$4
fi
#停止
#没有参数
stop_thread(){
if [ `ps -ef|grep $fileName|grep -v grep|awk '{print $2}'|wc -l` -ne 0 ]
then
ps -ef|grep $fileName|grep -v grep|awk '{print $2}'|xargs kill -9
fi
}
#创建
#参数一个:cpu空闲时间和工作时间的比率,默认是1,对应脚本入参的第三个参数[sleeptime/worktime]
start_thread(){
if [ "$1" == "" ]
then
rate=1
else
rate=$1
fi
cat <<EOF > $fileName.c
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#include<stdlib.h>
#include<math.h>
#define DWORD unsigned long
#define UINT64 unsigned long long
const int INTERVAL = 300;
int main(int argc,char* argv[] )
{
struct timeval tms;
int half = INTERVAL/2,i;
clock_t startTime = 0;
while(1)
{
timerclear(&tms);
gettimeofday(&tms,NULL);
UINT64 startTime = tms.tv_usec;
while(1)
{
timerclear(&tms);
gettimeofday(&tms,NULL);
UINT64 nowTime = tms.tv_usec;
if((nowTime - startTime)/1000 > INTERVAL)
break;
}
if(usleep(INTERVAL*1000*$rate))
exit(-1);
}
return 0;
}
EOF
echo "编译 $fileName.c ... "
gcc $fileName.c -o $fileName
if [ $? -eq 0 ]; then
echo "执行$fileName 开始... "
echo
cpuNum=`cat /proc/cpuinfo |grep processor|wc -l`
for i in `seq 1 $cpuNum`
do
echo " ... 执行$fileName 第 "$i"次开始 ... "
./$fileName &
echo " ... 执行$fileName 第 "$i"次结束 ... "
echo
done
echo "执行$fileName 结束... "
echo ""
else
echo "编译 $fileName.c ERROR! "
fi
}
#自动调整cpu的使用率,使其满足cpu_Rate
# 第一个:sleep/work
times=1
adjustment(){
stop_thread
start_thread $1
cur_cpu=`mpstat 1 5|awk '{if(NR==8){print $4}}'`
if [ "$cur_cpu" \< "$(expr $cpu_Rate - $adjustRange)" -o "$cur_cpu" \> "$(expr $cpu_Rate + $adjustRange)" ]
then
echo "======期望cpu使用率:$cpu_Rate=====当前cpu使用率:$cur_cpu==========开始第【$((times++))】次调整==========="
echo ""
adjustment $(expr $cur_cpu/$cpu_Rate*$1)
else
echo "======期望cpu使用率:$cpu_Rate=====当前cpu使用率:$cur_cpu==========结束调整并退出========="
echo ""
fi
}
if [ $1 == 'start' ]
then
stop_thread
start_thread $3
fi
if [ $1 == 'adjust' ]
then
stop_thread
adjustment $3
fi
if [ $1 == 'stop' ]
then
stop_thread
fi
原文链接:https://www.f2er.com/bash/392096.html