第二章 测试环境搭建:硬件环境规划、软件环境配置、网络拓扑设计、监控工具部署

环境搭建这事儿,说简单也简单,说复杂能让你折腾一整天。我见过太多团队,脚本写得漂亮,结果压测一跑,环境先崩了。说白了,压力测试测的不只是你的系统,也在测你的环境靠不靠谱。

这一章,咱们把硬件、软件、网络、监控这四个维度拆开揉碎了讲。嗯,跟着我的节奏来,保证你少踩几个坑。

2.1 硬件环境规划:别让机器拖后腿

硬件规划是地基。地基不稳,上面盖什么都白搭。我个人习惯,先问三个问题:

  • 被测系统需要多少资源? CPU、内存、磁盘IO,心里要有数。
  • 压测机需要多少资源? 别让压测机自己先成了瓶颈。
  • 网络带宽够不够? 千兆还是万兆?延迟多少?

我在项目中遇到过一件事:客户说服务器是32核64G,结果压测一跑,CPU直接飙到95%。后来一查,虚拟机超分严重,物理机上一共跑了8台虚拟机。你想想看,这能不出问题吗?

硬件规划核心原则:

  • 压测机与被测系统物理隔离,别共用同一台宿主机
  • 压测机资源至少是被测系统的2倍(我一般按3倍预留)
  • 磁盘建议用SSD,尤其是日志写入频繁的场景
  • 网络建议万兆内网,千兆在并发高时容易打满

我的小技巧: 压测前先跑一轮 topiostatvmstat,看看空闲资源到底有多少。别信云厂商给你的配置单,自己测了才算数。

2.2 软件环境配置:版本一致是铁律

软件环境配置,最怕什么?版本不一致。开发用JDK 11,测试环境用JDK 8,压测结果出来差异巨大,你都不知道该信谁。

我建议,压测环境的软件版本必须和生产环境完全一致。包括:

  • 操作系统版本(CentOS 7.9 vs Rocky Linux 8.6,差异不小)
  • JDK/Python/Node.js 等运行时版本
  • 中间件版本(Nginx、Tomcat、Redis、MySQL)
  • 内核参数配置(文件句柄数、网络参数、内存分配策略)

举个例子,我曾经因为Nginx的worker_connections没调大,压测到2000并发时直接报502。查了半天,不是代码问题,是Nginx默认配置只支持1024个连接。你说冤不冤?

避坑指南: 我曾经在压测前忘了检查 ulimit -n,结果压测脚本一跑,文件句柄耗尽,所有请求都挂了。从那以后,我每次压测前都会跑一遍环境检查脚本,把内核参数、文件句柄、端口范围全扫一遍。

下面是我常用的环境检查脚本片段,你可以直接拿去用:

#!/bin/bash
# 环境检查脚本 - 压测前必跑
echo "=== 系统信息 ==="
uname -a
cat /etc/os-release | grep PRETTY_NAME

echo "=== 文件句柄限制 ==="
ulimit -n

echo "=== 内核参数 ==="
sysctl net.ipv4.tcp_tw_reuse
sysctl net.core.somaxconn
sysctl vm.swappiness

echo "=== 端口范围 ==="
cat /proc/sys/net/ipv4/ip_local_port_range

echo "=== 磁盘IO ==="
iostat -x 1 3 | tail -5

2.3 网络拓扑设计:画清楚,别靠猜

网络拓扑设计,说白了就是搞清楚你的请求是怎么走的。从压测机出发,经过几层负载均衡?有没有防火墙?有没有CDN?这些都会影响延迟和吞吐量。

我习惯在压测前先画一张网络拓扑图。不用多精美,但必须把所有网络节点标清楚。下面是我用SVG画的一张典型压测环境拓扑图:

压测环境网络拓扑图 压测机集群 JMeter/Locust 负载均衡 Nginx/HAProxy 应用服务器 Tomcat/Spring Boot 数据库 MySQL/Redis 监控节点 Prometheus + Grafana 图例: 数据流 监控数据采集 注意:压测机与生产环境网络隔离,避免影响线上业务

画完拓扑图,你就能清楚地看到:

  • 请求路径上有几个节点?每个节点都可能成为瓶颈
  • 监控数据怎么采集?从哪个节点拉指标?
  • 网络延迟主要在哪一段?是不是需要优化?

我的经验: 压测时尽量走内网,别走公网。公网延迟抖动太大,压测结果不稳定。如果必须走公网,至少跑10分钟以上,取平均值。

2.4 监控工具部署:Prometheus + Grafana

监控是压测的眼睛。没有监控,你就像闭着眼睛开车,撞了都不知道怎么撞的。

我推荐 Prometheus + Grafana 这套组合。Prometheus 负责采集和存储指标,Grafana 负责可视化。两者配合,基本能覆盖99%的监控需求。

2.4.1 Prometheus 部署

Prometheus 部署很简单,下载二进制包,解压就能跑。但我建议用 Docker 部署,方便管理:

# docker-compose.yml
version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./data:/prometheus
    ports:
      - "9090:9090"
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=30d'
    restart: always

配置文件 prometheus.yml 长这样:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['192.168.1.10:9100', '192.168.1.11:9100']

  - job_name: 'spring_boot'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['192.168.1.20:8080']

注意: scrape_interval 别设太短。我见过有人设成1秒,结果Prometheus自己先扛不住了。一般15秒就够,高并发场景可以调到5秒。

2.4.2 Grafana 部署

Grafana 同样用 Docker 部署:

services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    volumes:
      - ./grafana-data:/var/lib/grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin123
    restart: always

部署完成后,访问 http://你的IP:3000,默认账号密码是 admin/admin。然后添加 Prometheus 数据源,URL 填 http://prometheus:9090(如果是在同一个 Docker 网络里)。

2.4.3 关键监控指标

我个人习惯,压测时至少盯着以下几类指标:

指标类别 具体指标 说明
系统资源 CPU 使用率 超过80%就要警惕
内存使用率 注意OOM Killer
磁盘IO iowait 超过20%说明磁盘是瓶颈
应用指标 请求延迟(P50/P95/P99) P99 超过1秒就要优化
错误率 超过1%立即停止压测
网络指标 网络吞吐量 别让带宽打满
TCP连接数 注意TIME_WAIT堆积

核心要点: 监控不是为了看数据,而是为了发现问题。我建议在 Grafana 上配置告警规则,比如 CPU 超过 85% 就发钉钉通知。这样你就不用一直盯着屏幕了。

2.5 环境验证:别急着跑压测

环境搭好了,别急着跑压测。先做一轮冒烟测试,确认所有组件都正常工作:

  1. 检查 Prometheus 的 Target 状态,确保所有 exporter 都是 UP
  2. 在 Grafana 上随便拉几个图表,看看数据有没有正常采集
  3. 用 curl 手动发几个请求,确认应用能正常响应
  4. 跑一个低并发(比如10个线程)的压测,看看基础延迟

我曾经有一次,Prometheus 配置写错了,targets 的 IP 少写了一个数字,结果监控面板上全是空白。跑完一轮压测才发现,数据全丢了。嗯,从那以后,我每次都会先验证监控数据是否正常。

我的习惯: 写一个环境验证脚本,一键检查所有组件。包括端口是否监听、服务是否健康、监控数据是否正常。压测前跑一遍,心里踏实。

好了,环境搭建这部分就到这里。硬件、软件、网络、监控,四个维度都讲清楚了。下一节咱们开始讲脚本编写,那才是真正有意思的部分。


专注资料整理