在系统调优、应用部署或硬件评估时,了解一个系统在极限负载下的表现至关重要。压力测试(Stress Testing)正是为此而生,它可以帮助我们发现性能瓶颈、验证系统稳定性、评估散热效率,并为容量规划提供数据支持。

本文将详细介绍如何在 Rocky Linux 8.x 系统上,使用功能强大的 stress-ng 工具对 CPU、内存和磁盘等核心组件进行压力测试。

核心警告:请勿在生产环境操作!

重要!重要!重要!
压力测试会极大地消耗系统资源,可能导致服务中断或系统意外重启。请务必在专门的测试环境、虚拟机或非关键业务的机器上执行以下所有操作。

第一步:整装待发 —— 安装必备工具

我们需要一个主力压测工具和几个得力的监控助手。stress-ng 是我们的不二之选,它能模拟几乎所有类型的系统负载。

打开您的终端,执行以下命令安装所有必要的软件包:

1
2
3
4
5
# 首先,启用 EPEL 仓库,因为 stress-ng 在其中
sudo yum install -y epel-release

# 接着,安装 stress-ng、sysstat 和 htop
sudo yum install -y stress-ng sysstat htop
  • stress-ng: 我们的主角,一个功能极其丰富的压力测试工具。
  • sysstat: 提供 iostatsar 等经典的系统性能监控工具。
  • htop: 一个比 top 更直观、更友好的实时进程查看器。

第二步:极限挑战 —— 逐项进行压力测试

现在,我们将对系统的核心组件施加压力,并使用命令行工具实时观察其性能表现。在每个测试开始后,建议您打开 另一个终端窗口 来运行监控命令。

场景一:CPU 核心全开 (目标: 压满 CPU 使用率)

目的: 将所有 CPU 核心推向极限,观察系统在高计算负载下的响应和稳定性。

  1. 执行压力测试命令:
    此命令会启动与您 CPU 核心数相等的“工人”进程,每个进程都在执行高强度的计算任务。我们设置一个 2 分钟的超时,以便测试自动结束。

    1
    2
    # 使用与 CPU 核心数相同的 worker 数量,持续 120 秒
    stress-ng --cpu $(nproc) --timeout 120s
    • --cpu $(nproc): 对 CPU 进行压测,$(nproc) 会自动获取系统的核心数。
    • --timeout 120s: 测试在 120 秒后自动结束,这是一个很好的安全措施。
  2. 实时监控 (在另一个终端中):

    • htop 视图:运行 htop,您会看到顶部的 CPU 状态条几乎被填满,每个核心的使用率都飙升到接近 100%。
    • sar 精确数据:运行 sar -u 1,关注 %user + %system 的总和,它应该会远超 90%。

观察点: 您可以观察到 CPU 使用率飙升,并藉此评估系统的散热能力和高负载下的稳定性。

场景二:榨干系统内存 (目标: 模拟高内存消耗)

目的: 模拟内存资源被大量占用的场景,测试系统在内存压力下的表现,例如是否会触发 OOM Killer(Out of Memory Killer)。

  1. 执行压力测试命令:
    此命令将尝试分配并使用系统总内存的 95%,同样在 2 分钟后自动释放。

    1
    2
    # 启动1个 worker,分配系统 95% 的内存,持续 120 秒
    stress-ng --vm 1 --vm-bytes 95% --timeout 120s
    • --vm 1: 进行内存 (Virtual Memory) 压测。
    • --vm-bytes 95%: 指定分配内存的大小为总内存的 95%,非常方便。
    • 注意:如果您的测试机内存较小(如<4GB),可以适当调低百分比,例如 90%,以防系统完全无响应。
  2. 实时监控 (在另一个终端中):

    • free 命令:运行 watch free -h,您会看到 used (已用) 列急剧上升,而 available (可用) 列急剧下降。
    • htop 视图htop 顶部的内存(Mem)和交换(Swp)状态条会清晰地显示内存被大量占用。

观察点: 您会看到可用内存急剧减少,系统可能会开始使用交换空间(Swap)。这是测试应用程序在低内存环境下行为的好方法。

场景三:让磁盘“跑起来” (目标: 测试磁盘 I/O 极限)

目的: 对存储设备进行高强度读写,测试其 I/O 吞吐量和响应能力。

  1. 执行压力测试命令:
    为了安全,我们通常在 /tmp 目录下进行 I/O 测试。

    1
    2
    3
    4
    5
    # 切换到临时目录
    cd /tmp

    # 启动 4 个 worker 进行高强度 I/O 操作,持续 120 秒
    stress-ng --io 4 --timeout 120s
    • --io 4: 进行 I/O 混合读写测试,4 个 worker 通常能产生足够大的压力。您可以增加此数值以提高负载。
  2. 实时监控 (在另一个终端中):

    • iostat 是最佳工具:运行 iostat -xz 1。在输出中找到您的主磁盘(如 sda, vda, nvme0n1),然后紧盯 %util 这一列。在测试期间,这个值会迅速接近 100%。

观察点: 通过 iostat,您可以看到磁盘的 %util 指标接近 100%,这表明磁盘正在全力工作。您可以藉此评估磁盘的 I/O 性能上限。

场景四:模拟磁盘空间耗尽

目的: 快速填充磁盘分区,用于测试依赖于磁盘空间的应用程序(如数据库、日志系统)在磁盘即将写满时的行为。

  1. 检查可用空间:
    使用 df -h 确定一个目标分区(例如根分区 /)及其可用空间。

  2. 创建“占位”大文件:
    假设 / 分区有 10GB 可用空间,我们想测试其被占满的情况。fallocate 命令可以瞬间创建一个指定大小的文件。

    1
    2
    3
    4
    5
    6
    # 在 /tmp 目录下创建一个 9GB 的文件
    # 警告:请根据你的实际可用空间调整大小!
    sudo fallocate -l 9G /large_test_file

    # 再次检查空间使用率
    df -h

    您会看到 / 分区的 Use% (使用率) 显著上升。

  3. 清理现场(非常重要!):
    测试完成后, 务必删除测试文件 以释放空间。

    1
    sudo rm /large_test_file

总结:压力测试速查表

测试目标 核心命令 监控命令 关键指标
压满 CPU stress-ng --cpu $(nproc) --timeout 120s htopsar -u 1 sar 中的 %user + %system
消耗内存 stress-ng --vm 1 --vm-bytes 95% --timeout 120s watch free -hhtop free 中的 used/total
高磁盘I/O stress-ng --io 4 --timeout 120s (在/tmp下) iostat -xz 1 iostat 中的 %util
填充磁盘空间 sudo fallocate -l <size> /<mount>/file df -h df 中的 Use%

通过这套简单而有效的流程,您可以主动地了解您 Linux 系统的性能边界,为后续的优化和维护工作打下坚实的基础。