模拟使用内存(实际占用)
yum -y install gcc automake autoconf libtool make
# 下载 memtester
[root@jast01 ~]# wget http://pyropus.ca/software/memtester/old-versions/memtester-4.2.2.tar.gz
# 解压安装
[root@jast01 ~]# tar -zxvf memtester-4.2.2.tar.gz
[root@jast01 ~]# cd memtester-4.2.2/
[root@jast01 memtester-4.2.2]# make && make install
# 查看命令所在目录
[root@jast01 memtester-4.2.2]# whereis memtester
memtester: /usr/local/bin/memtester
# 将启动文件名修改为我们模拟的程序名
[root@jast01 memtester-4.2.2]# mv /usr/local/bin/memtester /usr/local/bin/gz-server
# 将我们现在完的安装包和目录可以删除了
[root@jast01 ~]# rm memtester-4.2.2* -rf
# 后台启动并查看内存使用
[root@jast01 ~]# free -g
total used free shared buff/cache available
Mem: 3 0 2 0 0 3
Swap: 0 0 0
[root@jast01 ~]# nohup gz-server 2G > 1.log &
[root@jast01 ~]# free -g
total used free shared buff/cache available
Mem: 3 2 0 0 0 1
Swap: 0 0 0
模拟占用内存(缓存占用)
#使用虚拟内存构造内存消耗
mkdir /tmp/memory
mount -t tmpfs -o size=1024M tmpfs /tmp/memory
dd if=/dev/zero of=/tmp/memory/block
#释放消耗的虚拟内存
rm /tmp/memory/block
umount /tmp/memory
rmdir /tmp/memory
模拟生成文件占用磁盘
命令
# 生成一个100G文件,文件目录、名为/opt/temp/data.zip
fallocate -l 100G /opt/temp/data.zip
通用脚本
#!/bin/bash
# 单位byte
dist_size=$((1024*1024*1024))
current_dist_size=0
# 每个文件的大小范围
file_min_size=$((1024*1024*500))
file_max_size=$((1024*1024*800))
# 文件名后缀
file_type=snappy.data
# 随机数
function rand(){
min=$1
max=$(($2-$min+1))
num=$(date +%s%N)
echo $(($num%$max+$min))
}
while [ 0 -le 1 ]
do
rnd=$(rand $file_min_size $file_max_size)
filename=md5sum
current=`date "+%Y%m%d%H%M%S"`$(rand 1 10000000)
key=`echo -n $current$hash_key|md5sum|cut -d" " -f1`
echo '生成文件大小:'$(($rnd/1024/1024))'M'
fallocate -l $rnd ./$key.$file_type
current_dist_size=$(($current_dist_size+$rnd))
echo '已生成文件大小:'$(($current_dist_size/1024/1024))'M,最大限制:'$(($dist_size/1024/1024))'M'
if [ $current_dist_size -ge $dist_size ]; then
echo '文件生成完成,退出生成'
break
fi
done
模拟使用CPU
sh cpu_run.sh adjust 80 1 5
模拟使用cpu80%,自动调整cpu使用率,波动范围5%
cur_cpu=
mpstat 1 5|awk '{if(NR==8){print $3}}'
print $3 这个位置,有的版本是 print $4mpstat 安装方法 yum install -y sysstat
具体使用说明见脚本内容
#!/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 $3}}'`
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