CPU使用率一般是希望越低越好,但混沌工程需要注入CPU耗尽的故障,我们今天研究下如何控制CPU使用率持续100%。
混沌工程中为什么注入CPU耗尽故障呢?系统中当然不期望CPU耗尽,但期望CPU耗尽后系统能否自动恢复,自动恢复的时长,不能自动恢复的话手工恢复后系统能否正常工作。
借用阿里混沌工程实践,CPU耗尽如下:系统层-系统异常-CPU耗尽。
脚本chaos-cpu.sh
#!/bin/bash
endless_loop()
{
echo -ne "i=0;
while true
do
i=i+100;
i=100
done" | /bin/bash &
}
if [ $# != 1 ]; then
echo "USAGE: $0 <cpus>"
exit 1;
fi
for i in `seq $1`
do
endless_loop
pid_array[$i]=$!;
done
for i in "${pid_array[@]}"; do
echo 'kill' $i ';';
done
脚本解释
脚本的大致思路,根据待测系统的CPU数,创建相应个数的死循环进程,并获取相应进程的PID,便于恢复测试。传入参数的个数必须等于1,不等于1有提示输入相应的CPU数。
根据CPU数,创建相应的进程数,根据时间片,操作系统会调度该进程到某个CPU上,死循环的话会一致占用着该CPU
1) echo -ne "command" | /bin/bash &
echo -n处理 "command" 输出字符串不换行,-e 处理 "command" 中某些特殊字符
2) $#:传入脚本的参数个数
3) seq $1,$1: 传入脚本的第一个参数,seq默认生成以1开头的以1为增幅的生成数字列表。
4) $!:Shell后台运行进程的PID,$$:Shell本身的PID
5) pid_array[$i] :shell中数组赋值时写法。
${pid_array[@]} :输出所有数组的值,2种表示形式${arr[@]} 或${arr[*]} 。
arr=(1 2 3 4 5)数值类型的数组:一对括号表示数组,数组中元素之间使用“空格”来隔开
arr=('a' 'b' 'c')字符串类型数组:数组中的元素使用双引号或者单引号包含,其它同数值类型数组
数组的任何元素可以用${arr[下标]}来引用,花括号是必须的,以避免和路径扩展冲突。
用法
1) 查看cpu内核数量 > lscpu,比如是4个核
2) ./chaos-cpu.sh 4 意味着将4个核全部占满,将CPU全部耗尽。
3) top可以看到整个系统的CPU满负荷。
4) 恢复环境:将第2步输出的进程kill -9 pid
参考
https://blog.csdn.net/cangencong/article/details/74328944?utm_medium=distribute.wap_relevant.none-task-blog-baidujs_title-10