Linux 通用压力测试脚本合集:磁盘 + 网络

一、磁盘压力测试

你附件中的 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/对象存储吞吐

五、执行注意事项

  1. 只压测授权环境,不要对生产核心库、系统盘直接写满。

  2. 磁盘写满测试建议加 -k 512M 或 -k 1G 预留。

  3. 网络压测建议先和网络、运维确认,避免影响业务带宽。

  4. iperf3 服务端测试结束后及时关闭。

  5. 建议配合监控:

    bash 复制代码
    iostat -x 1
    iotop
    sar -n DEV 1
    ss -s
  6. 压测结果受缓存、RAID、云盘类型、文件系统、网络抖动影响,建议多轮取平均值。


相关推荐
聚美智数2 小时前
网站HTTP状态查询-SEO优化
网络·网络协议·http
treesforest2 小时前
数据包是如何找到回家路的?
网络·智能路由器·nat·ip归属地查询
Soneswy3 小时前
Linux系统篇--重定向与文件操作命令
linux
有毒的教程3 小时前
Linux底层存储路由配
linux·运维·网络
是真的小外套3 小时前
第9章:网络层安全协议 IPSec 学习笔记
网络·网络协议·tcp/ip
Linux系统运维工程师_郭主任4 小时前
运维人还在被拒offer?现在能考的,只有 RHCE 10.0。
linux
自养Agent4 小时前
MCP Server Boundary Audit Report
linux·服务器·人工智能·windows·大模型·llm
中屹指纹浏览器svip5 小时前
静态 IP和动态 IP,搭配指纹浏览器该怎么选?
网络·网络协议·tcp/ip·中屹指纹浏览器
ITxiaobing20235 小时前
选型不踩坑:IPinfo 之外,IP 地址定位服务还有哪些可选项
网络·网络协议·tcp/ip