CPU及内存压力测试

ubuntu下安装stress

sudo apt update
sudo apt install stress
stress --version

cron定时任务配置

每5分钟执行一次,仅在05-21点之间执行。

*/10 5-21 * * * CRON_RANDOM_DELAY=1 /root/stress/stress.sh >> /var/log/stress_test.log 2>&1

stress.sh脚本

#!/bin/bash

# 获取当前时间戳
START_TIME=$(date +"%Y-%m-%d %H:%M:%S")
START_SEC=$(date +%s)

echo "============================================="
echo "压力测试开始时间: $START_TIME"
echo "---------------------------------------------"

# 检查是否已有实例在运行
if [ -f "$LOCK_FILE" ]; then
echo "检测到已有实例正在运行,正在终止其他stress进程..."
rm -f "$LOCK_FILE"
pkill -9 stress &>/dev/null
# 等待确保进程完全终止
sleep 2
fi

# 锁文件路径
LOCK_FILE="/tmp/stress_test.lock"
# 创建锁文件
touch "$LOCK_FILE"
# 监听-程序异常退出,执行rm -r锁文件
trap 'rm -f "$LOCK_FILE"; exit' EXIT INT TERM

# 如果是通过cron调用,计算并显示随机延迟时间
if [[ -n "$CRON_RANDOM_DELAY" ]]; then
RANDOM_DELAY=$((RANDOM % 100))
echo "检测到通过cron调用,随机延迟: $RANDOM_DELAY 秒"
sleep $RANDOM_DELAY
echo "随机延迟等待完成,继续执行..."
echo "---------------------------------------------"
fi

# 动态获取系统资源
CPU_CORES=$(nproc)
TOTAL_MEM=$(free -m | awk '/Mem:/ {print $2}')

# 设置资源占用参数(可调整比例)
CPU_PERCENT=50 # CPU占用百分比
MEM_PERCENT=20 # 内存占用百分比

# 计算实际占用值
STRESS_CPU=$(( CPU_CORES * CPU_PERCENT / 100 ))
STRESS_CPU=$(( STRESS_CPU > 0 ? STRESS_CPU : 1 ))
STRESS_MEM=$(( TOTAL_MEM * MEM_PERCENT / 100 ))
STRESS_MEM="${STRESS_MEM}M"
#超时时间,5分钟
STRESS_TIMEOUT="300s"

echo "系统检测结果:"
echo " CPU核心数: $CPU_CORES"
echo " 总内存: ${TOTAL_MEM}MB"
echo "资源占用设置:"
echo " CPU占用: $CPU_PERCENT% (使用 $STRESS_CPU 个核心)"
echo " 内存占用: $MEM_PERCENT% (分配 $STRESS_MEM)"
echo "---------------------------------------------"

# 运行压力测试
echo "开始压力测试..."
stress \
--cpu $STRESS_CPU \
--vm 1 \
--vm-bytes $STRESS_MEM \
--timeout $STRESS_TIMEOUT

# 记录结束状态
END_TIME=$(date +"%Y-%m-%d %H:%M:%S")
END_SEC=$(date +%s)
DURATION=$(( END_SEC - START_SEC ))

echo "---------------------------------------------"
echo "压力测试完成!"
echo "结束时间: $END_TIME"
echo "总运行时长: $DURATION 秒"

echo "============================================="

打印stress进程

pgrep stress

磁盘空间压力测试

stress也可以临时创建磁盘空间,进程结束后释放。

stress --hdd 2 --hdd-bytes 1G  # 创建2个1GB的临时文件

dd if=/dev/zero of=testfile bs=1G count=20

if=/dev/zero:输入源(无限零字节流)

of=testfile:输出文件名

bs=1M:每次写入 1M (bs=1G:每次写入 1GB)

count=512:总共写入 512 次