一、磁盘压力测试
你附件中的 3 个脚本可以分别保存为:
| 脚本 | 建议文件名 | 用途 |
|---|---|---|
| 脚本一 | disk_stress_big.sh |
大文件写入、读取、校验、删除循环 |
| 脚本二 | disk_stress_small.sh |
小文件高频读写,默认 128K × 2000 次 |
| 脚本三 | disk_fill_test.sh |
持续写入直到磁盘写满,支持预留空间 |
1. 大文件读写压测:disk_stress_big.sh
功能:
- 在指定目录创建大文件,默认
100M - 写入随机数据并计算
MD5/SHA256 - 读出文件并校验一致性
- 删除文件,循环执行,默认
10次 - 输出写入速度、读取速度、成功/失败次数
常用示例:
bash
chmod +x disk_stress_big.sh
# 默认:/tmp/disk_stress_test,100M,10 次
./disk_stress_big.sh
# 指定 /data/tmp,500M,5 次
./disk_stress_big.sh -d /data/tmp -s 500M -n 5
# 指定 1G,3 次
./disk_stress_big.sh -d /data/tmp -s 1G -n 3
适合观察:
- 顺序写带宽
- 顺序读带宽
- 大文件场景下磁盘稳定性
- 数据一致性是否出错
2. 小文件读写压测:disk_stress_small.sh
功能:
- 默认创建
128K小文件 - 写入随机数据并计算校验和
- 读取并校验
- 删除后循环,默认
2000次 - 支持
-v查看每次明细 - 输出总吞吐、平均耗时、成功失败数
常用示例:
bash
chmod +x disk_stress_small.sh
# 默认:128K,2000 次
./disk_stress_small.sh
# 指定目录、128K、5000 次
./disk_stress_small.sh -d /data/tmp -s 128K -n 5000
# 查看每次循环明细
./disk_stress_small.sh -d /data/tmp -s 128K -n 1000 -v
适合观察:
- 小文件高频创建/删除性能
- 文件系统元数据压力
- IOPS 表现
- 目录下大量小文件时的稳定性
3. 磁盘写满压测:disk_fill_test.sh
功能:
- 向一个或多个目录持续写入,直到磁盘写满
ENOSPC - 支持
-k预留空间,避免真正写爆系统盘 - 支持多目录并行
- 记录写入总量、文件数、用时、平均速率
- 测试结束后自动删除测试文件
- 可用
-K保留测试文件
常用示例:
bash
chmod +x disk_fill_test.sh
# 默认写满 /tmp/disk_fill_test
./disk_fill_test.sh
# 写满 /data/tmp,但保留 512M 空闲空间
./disk_fill_test.sh -d /data/tmp -k 512M
# 多目录并行写满
./disk_fill_test.sh -d /data/a,/data/b -k 512M
# 写满后保留测试文件
./disk_fill_test.sh -d /data/tmp -K
强烈建议:
bash
# 不要对系统盘直接无预留执行
./disk_fill_test.sh -d /data/tmp -k 1G
适合观察:
- 磁盘接近满时的写入表现
- 文件系统满盘后的错误处理
- 应用在磁盘满时是否异常
- 删除大量测试文件后的空间恢复速度
二、网络性能压力测试脚本
下面补充一个通用网络压测脚本,建议保存为:
bash
net_stress_test.sh
支持:
ping:延迟、丢包iperf3:TCP/UDP 带宽curl:HTTP 下载速度、DNS、连接、首字节、总耗时- 支持启动
iperf3服务端 - 支持
all模式一次跑完
完整脚本如下:
bash
#!/usr/bin/env bash
# ============================================================
# 网络性能压力测试脚本 (Network Stress Test)
# ------------------------------------------------------------
# 功能:
# 1. ping 延迟/丢包
# 2. iperf3 TCP/UDP 带宽
# 3. curl HTTP 下载速度
# 4. 支持启动 iperf3 服务端
# ------------------------------------------------------------
# 用法: ./net_stress_test.sh [选项]
# ============================================================
set -u
DEF_PORT=5201
DEF_DURATION=10
DEF_MODE="all"
DEF_PING_COUNT=20
DEF_PARALLEL=1
DEF_BANDWIDTH="1000M"
HOST=""
PORT="$DEF_PORT"
DURATION="$DEF_DURATION"
MODE="$DEF_MODE"
PING_COUNT="$DEF_PING_COUNT"
PARALLEL="$DEF_PARALLEL"
BANDWIDTH="$DEF_BANDWIDTH"
URL=""
UDP=0
START_SERVER=0
usage() {
cat <<EOF
用法: $(basename "$0") [选项]
选项:
-H <host> 目标主机/IP,用于 ping/iperf3
-p <port> iperf3 端口,默认 $DEF_PORT
-t <秒> iperf3/curl 测试时长,默认 $DEF_DURATION
-m <模式> all|ping|iperf|curl,默认 $DEF_MODE
-c <次数> ping 次数,默认 $DEF_PING_COUNT
-P <并发> iperf3 并发流数,默认 $DEF_PARALLEL
-b <带宽> iperf3 UDP 目标带宽,默认 $DEF_BANDWIDTH
-d <URL> curl 下载测速 URL
-u iperf3 使用 UDP
-S 启动 iperf3 服务端并退出
-h 显示帮助
示例:
$(basename "$0") -S
$(basename "$0") -H 10.0.0.2 -m ping -c 20
$(basename "$0") -H 10.0.0.2 -m iperf -t 30 -P 4
$(basename "$0") -H 10.0.0.2 -m iperf -u -b 1000M -t 30
$(basename "$0") -m curl -d https://example.com/1GB.bin -t 20
$(basename "$0") -H 10.0.0.2 -m all -d https://example.com/1GB.bin
EOF
exit 0
}
while getopts "H:p:t:m:c:P:b:d:uSh" opt; do
case "$opt" in
H) HOST="$OPTARG" ;;
p) PORT="$OPTARG" ;;
t) DURATION="$OPTARG" ;;
m) MODE="$OPTARG" ;;
c) PING_COUNT="$OPTARG" ;;
P) PARALLEL="$OPTARG" ;;
b) BANDWIDTH="$OPTARG" ;;
d) URL="$OPTARG" ;;
u) UDP=1 ;;
S) START_SERVER=1 ;;
h) usage ;;
*) usage ;;
esac
done
case "$DURATION" in
''|*[!0-9]*) echo "错误: -t 必须为正整数"; exit 1 ;;
esac
case "$PING_COUNT" in
''|*[!0-9]*) echo "错误: -c 必须为正整数"; exit 1 ;;
esac
case "$PARALLEL" in
''|*[!0-9]*) echo "错误: -P 必须为正整数"; exit 1 ;;
esac
if [ "$START_SERVER" -eq 1 ]; then
command -v iperf3 >/dev/null 2>&1 || { echo "错误: 缺少 iperf3"; exit 1; }
echo "============================================================"
echo "启动 iperf3 服务端: 端口 $PORT"
echo "============================================================"
exec iperf3 -s -p "$PORT"
fi
print_header() {
echo "============================================================"
echo " 网络性能压力测试"
echo "============================================================"
printf " %-10s : %s\n" "测试模式" "$MODE"
[ -n "$HOST" ] && printf " %-10s : %s\n" "目标主机" "$HOST"
[ -n "$URL" ] && printf " %-10s : %s\n" "下载 URL" "$URL"
printf " %-10s : %s 秒\n" "测试时长" "$DURATION"
echo "------------------------------------------------------------"
}
run_ping() {
[ -n "$HOST" ] || { echo "[跳过] ping 需要 -H 指定目标主机"; return 0; }
command -v ping >/dev/null 2>&1 || { echo "[跳过] 未安装 ping"; return 0; }
echo "===== Ping 测试: $HOST ====="
local out
out=$(ping -c "$PING_COUNT" -W 2 "$HOST" 2>&1)
echo "$out"
local loss avg
loss=$(echo "$out" | awk -F', ' '/packet loss/{print $3}')
avg=$(echo "$out" | awk -F'/' '/rtt|round-trip/{print $5}')
echo "结果: 丢包=${loss:-未知} 平均延迟=${avg:-未知} ms"
echo
}
run_iperf() {
[ -n "$HOST" ] || { echo "[跳过] iperf3 需要 -H 指定目标主机"; return 0; }
command -v iperf3 >/dev/null 2>&1 || { echo "[跳过] 未安装 iperf3"; return 0; }
echo "===== iperf3 测试: $HOST:$PORT ====="
local args=(-c "$HOST" -p "$PORT" -t "$DURATION" -P "$PARALLEL")
if [ "$UDP" -eq 1 ]; then
args+=(-u -b "$BANDWIDTH")
echo "协议: UDP 目标带宽: $BANDWIDTH"
else
echo "协议: TCP 并发流: $PARALLEL"
fi
iperf3 "${args[@]}"
echo
}
run_curl() {
[ -n "$URL" ] || { echo "[跳过] curl 需要 -d 指定下载 URL"; return 0; }
command -v curl >/dev/null 2>&1 || { echo "[跳过] 未安装 curl"; return 0; }
echo "===== HTTP 下载测速: $URL ====="
curl -L --max-time "$DURATION" -o /dev/null -s -w \
"HTTP 状态码 : %{http_code}\nDNS 解析 : %{time_namelookup}s\nTCP 连接 : %{time_connect}s\nTLS 握手 : %{time_appconnect}s\n首字节 : %{time_starttransfer}s\n总耗时 : %{time_total}s\n下载大小 : %{size_download} bytes\n平均速度 : %{speed_download} B/s\n" \
"$URL"
echo
}
print_header
case "$MODE" in
ping)
run_ping
;;
iperf)
run_iperf
;;
curl)
run_curl
;;
all)
run_ping
run_iperf
run_curl
;;
*)
echo "错误: 未知模式 '$MODE',可选 all|ping|iperf|curl"
exit 1
;;
esac
echo "============================================================"
echo "测试完成"
echo "============================================================"
三、网络压测脚本使用示例
1. 启动 iperf3 服务端
在目标服务器执行:
bash
chmod +x net_stress_test.sh
./net_stress_test.sh -S
默认监听 5201 端口。也可以指定:
bash
./net_stress_test.sh -S -p 5201
如果服务器有防火墙,需要放行:
bash
# firewalld
firewall-cmd --add-port=5201/tcp --permanent
firewall-cmd --add-port=5201/udp --permanent
firewall-cmd --reload
# 或 ufw
ufw allow 5201/tcp
ufw allow 5201/udp
2. Ping 延迟与丢包测试
bash
./net_stress_test.sh -H 10.0.0.2 -m ping -c 20
输出包括:
- 丢包率
- 平均延迟
- min/avg/max/mdev
3. iperf3 TCP 带宽测试
bash
./net_stress_test.sh -H 10.0.0.2 -m iperf -t 30 -P 4
含义:
-H 10.0.0.2:服务端 IP-m iperf:使用 iperf3-t 30:测试 30 秒-P 4:4 个并发流
适合测试:
- 内网带宽
- 云主机之间吞吐
- 跨可用区网络质量
4. iperf3 UDP 带宽测试
bash
./net_stress_test.sh -H 10.0.0.2 -m iperf -u -b 1000M -t 30
含义:
-u:UDP 模式-b 1000M:目标带宽 1000 Mbps-t 30:持续 30 秒
UDP 模式重点关注:
- 丢包率
- 抖动
- 实际吞吐是否接近目标带宽
5. HTTP 下载测速
bash
./net_stress_test.sh -m curl -d https://example.com/1GB.bin -t 20
输出包括:
- HTTP 状态码
- DNS 解析耗时
- TCP 连接耗时
- TLS 握手耗时
- 首字节时间
- 总耗时
- 下载大小
- 平均速度
适合测试:
- CDN 下载速度
- 对象存储吞吐
- 公网 HTTP 服务响应
6. 一次跑完 ping + iperf + curl
bash
./net_stress_test.sh \
-H 10.0.0.2 \
-m all \
-t 30 \
-P 4 \
-d https://example.com/1GB.bin
四、结果解读建议
磁盘压测关注指标
| 指标 | 说明 |
|---|---|
| 写入速度 | 大文件顺序写能力 |
| 读取速度 | 大文件顺序读能力 |
| IOPS | 小文件高频读写能力 |
| 校验结果 | 数据一致性 |
| 失败次数 | 磁盘或文件系统稳定性 |
| 满盘表现 | 应用是否优雅处理 ENOSPC |
网络压测关注指标
| 指标 | 说明 |
|---|---|
| 丢包率 | 网络稳定性 |
| 平均延迟 | 链路质量 |
| TCP 带宽 | 内网/公网吞吐 |
| UDP 丢包/抖动 | 实时音视频、游戏、VoIP 场景 |
| HTTP 首字节 | 服务端处理能力 |
| HTTP 下载速度 | CDN/对象存储吞吐 |
五、执行注意事项
-
只压测授权环境,不要对生产核心库、系统盘直接写满。
-
磁盘写满测试建议加
-k 512M或-k 1G预留。 -
网络压测建议先和网络、运维确认,避免影响业务带宽。
-
iperf3 服务端测试结束后及时关闭。
-
建议配合监控:
bashiostat -x 1 iotop sar -n DEV 1 ss -s -
压测结果受缓存、RAID、云盘类型、文件系统、网络抖动影响,建议多轮取平均值。