上一篇 下一篇 分享链接 返回 返回顶部

如何用stress-ng和sysbench对香港服务器进行CPU/内存/磁盘/IO多维压测?

发布人:Minchunlin 发布时间:2025-07-31 10:47 阅读量:864

我是一名运维工程师,日常负责为公司部署和维护亚太地区的边缘计算节点。最近上线了几台位于香港的数据中心的新物理服务器,用于承载海外业务流量。在实际上线之前,我始终坚持一个原则:服务器必须经过真实场景的压力验证,才能承载线上业务。

香港节点的网络质量尚可,但我更关注的是机器的硬件性能稳定性,尤其在 CPU 计算、内存读写、磁盘 IO 和文件系统处理能力等方面。这时,stress-ng 和 sysbench 成为了我多维度压测的首选工具。以下是我从0到1执行的一整套实操流程。

一、环境准备

1.1 系统环境说明

  • 操作系统:Ubuntu Server 22.04 LTS
  • 内核版本:5.15+
  • 测试工具:stress-ng、sysbench
  • 机器配置:64核 AMD EPYC / 256GB 内存 / NVMe SSD * 2 / 10Gbps 网口
  • 节点位置:香港某Tier3机房

1.2 工具安装

# stress-ng 安装
sudo apt update
sudo apt install -y stress-ng

# sysbench 安装
sudo apt install -y sysbench

二、CPU 性能压测

2.1 使用 stress-ng 进行 CPU 压测

我优先使用 stress-ng 对 CPU 进行多线程指令集处理测试:

stress-ng --cpu 64 --cpu-method all --timeout 300s --metrics-brief

--cpu 64:启动 64 个工作线程(等同于物理核数)

--cpu-method all:尝试所有 CPU 算法,包括整数、浮点、矩阵等

--timeout:测试持续 5 分钟

--metrics-brief:输出简洁的性能摘要

✅ 预期输出重点关注:

  • 每核每秒执行的 Bogo ops(虚拟操作数)
  • 系统 load average 是否持续上升到极限
  • 有无 core dump 或 system stall

2.2 使用 sysbench 进行浮点运算压测

sysbench cpu --cpu-max-prime=200000 --threads=64 run

--cpu-max-prime=200000:计算到 20 万以内的质数

--threads=64:并发线程与物理核一致

✅ 关注指标:

  • 总执行时间
  • 每秒执行事件数(events per second)

三、内存性能压测

3.1 使用 stress-ng 进行内存负载测试

stress-ng --vm 16 --vm-bytes 16G --vm-method all --verify --timeout 180s --metrics-brief

--vm 16:16 个内存工作线程

--vm-bytes 16G:每线程分配 1GB 内存(总计 16G)

--vm-method all:混合使用 memset、memcpy 等方法

--verify:测试内存正确性

--timeout 180s:运行 3 分钟

📌 实测经验: 使用 vm-bytes 接近物理内存的 70~80% 会更贴近实际业务负载,但别超过 SWAP 空间。

3.2 使用 sysbench 测试内存读写吞吐量

sysbench memory --memory-block-size=1M --memory-total-size=100G --threads=16 run

--memory-block-size=1M:每次读写 1MB

--memory-total-size=100G:总读写数据量

--threads=16:模拟并发场景

✅ 关键指标:

  • MiB transferred per second(吞吐量)
  • 每线程平均延迟

四、磁盘 IO 压测

4.1 使用 sysbench 进行磁盘顺序和随机读写测试

顺序写:

sysbench fileio --file-total-size=100G --file-test-mode=seqwr \
--file-block-size=1M --threads=8 prepare

sysbench fileio --file-total-size=100G --file-test-mode=seqwr \
--file-block-size=1M --threads=8 run

随机读写:

sysbench fileio --file-total-size=100G --file-test-mode=rndrw \
--file-block-size=4K --threads=32 prepare

sysbench fileio --file-total-size=100G --file-test-mode=rndrw \
--file-block-size=4K --threads=32 run

--file-total-size=100G:磁盘压力覆盖整个磁盘缓存区

--file-block-size=4K~1M:模拟不同级别的业务负载

--file-test-mode:可选 seqrd, seqwr, rndrd, rndwr, rndrw

🧠 建议:

测试前 prepare 阶段必须运行一次,创建必要的测试文件

测试后需 cleanup 清理:

sysbench fileio cleanup

五、IO/系统混合负载模拟

使用 stress-ng 混合模拟 IO、fork、缓存抖动

stress-ng --hdd 4 --hdd-bytes 10G \
          --fork 32 \
          --cache 8 --cache-level 3 \
          --timeout 300s --metrics-brief

--hdd:模拟磁盘写操作

--fork:快速创建子进程,模拟高并发 fork bomb

--cache:让缓存层频繁抖动(模拟 L3 cache thrash)

✅ 分析要点:

  • swap 是否启用,若频繁交换,需关注内存瓶颈
  • fork 失败是否频繁出现
  • IO wait 时间是否显著上升

六、结果记录与分析建议

我使用 dstat 与 iostat 做实时性能观测:

sudo apt install dstat sysstat
dstat -cdnmgity --top-cpu --top-bio --output stress_test.csv
iostat -xz 1

✅ 关键观察项:

  • CPU idle 是否长期低于 5%
  • IOwait 是否高于 15%
  • 磁盘的 await 和 svctm 是否均衡

七、压测后的优化建议

经过这轮压测,我确认了以下问题点并做出优化:

  • 内核参数优化:调高了 vm.dirty_ratio 和 fs.aio-max-nr
  • 磁盘调度器替换:从 cfq 切换为 none(NVMe场景下更高效)
  • 多线程绑定 CPU core:部分性能测试中使用 taskset 限定 CPU affinity,更贴近生产业务调度

压测不仅是数据指标的收集,更是一种提前验证架构设计合理性的手段。特别是在边缘部署、海外节点等网络敏感场景下,通过 stress-ng 和 sysbench 的实测,我心里才真正踏实。

如果你也在部署海外服务器,建议你务必走一遍类似的压测流程——工具虽然简单,但能让你避免上线后的系统崩溃和 SLA 事故。

目录结构
全文