stress_test() {
# 默认并发数为1,如果有参数则使用参数
local threads=${1:-1}
local file_size=64
echo "=== 准备启动 $threads 路并发压测 ==="
echo "=== 单路文件大小: ${file_size}MB ==="
# 创建临时目录防止文件乱窜
mkdir -p .stress_tmp
cd .stress_tmp
# 定义清理函数:杀掉后台进程并删库跑路
cleanup() {
echo -e "\n\n[停止] 正在终止 $threads 个并发任务..."
kill $(jobs -p) 2>/dev/null
cd ..
rm -rf .stress_tmp
echo "[完成] 已清理临时文件。"
return
}
trap cleanup SIGINT SIGTERM
# 启动 N 个后台任务
for i in $(seq 1 $threads); do
(
# 1. 先生成一个随机文件(只生成一次,避免 /dev/urandom 成为瓶颈)
dd if=/dev/urandom of=data_$i.bin bs=1M count=$file_size 2>/dev/null
# 2. 死循环:压缩 -> 删源文件 -> 解压(源文件被恢复) -> 删压缩包
while true; do
tar -czf data_$i.tar.gz data_$i.bin
rm -f data_$i.bin
tar -xzf data_$i.tar.gz
rm -f data_$i.tar.gz
done
) &
done
# 监控面板
echo "=== 压测进行中 (Ctrl+C 停止) ==="
echo "时间 | 线程 | CPU负载(1min) | 内存使用"
echo "-----------+------+--------------+---------"
while true; do
# 获取系统负载
load=$(cut -d " " -f 1 /proc/loadavg)
# 获取内存百分比
mem=$(free | grep Mem | awk '{printf "%.1f%%", $3/$2 * 100}')
# 打印状态
printf "%s | %-2d | %-12s | %s\r" "$(date +%H:%M:%S)" "$threads" "$load" "$mem"
sleep 1
done
}