3. 环境搭建:压测机器配置、网络带宽评估、被压测服务部署、监控工具搭建

好,咱们进入第三章。环境搭建这块,说实话,是整场压测的基石。我见过太多团队,压测脚本写得花里胡哨,结果环境一跑就露馅——要么压测机自己先扛不住了,要么网络成了瓶颈,要么监控数据全是毛刺。说白了,地基没打牢,楼盖得再高也白搭。

这一章,我带你一步步把环境捋清楚。咱们从压测机器怎么配开始,到网络带宽怎么评估,再到被压测服务怎么部署,最后把 Prometheus + Grafana 这对黄金搭档搭起来。嗯,跟着我的节奏来,别急。

3.1 压测机器配置:别让工具拖后腿

压测机器,就是发压力的那台机器。很多人觉得随便找台服务器就行,其实不然。你想想看,如果压测机自己 CPU 都 100% 了,那发出去的请求还能准吗?

我个人习惯,压测机至少满足以下配置:

  • CPU:8 核以上,主频 3.0GHz 以上。高频比多核更重要,因为压测工具(比如 wrk、locust)很多是单线程模型。
  • 内存:16GB 起步。如果压测场景复杂,比如要记录每个请求的响应时间,内存消耗会很大。
  • 磁盘:SSD,至少 500GB。压测日志和结果文件写起来很快,机械盘扛不住。
  • 网络:千兆网卡起步,最好是万兆。这个后面细说。
我的经验:有一次我用一台 4 核的笔记本做压测机,结果压到 2000 QPS 时,压测机自己先卡死了。后来换了台 16 核的服务器,同样的脚本轻松跑到 2 万 QPS。所以,压测机的配置,别省。

3.2 网络带宽评估:别让网线成了瓶颈

网络带宽,是压测里最容易忽略的坑。你想想看,压测机发请求,被压服务回响应,数据都在网线上跑。如果带宽不够,那延迟和丢包就来了。

怎么评估? 我一般用这个公式:

所需带宽 = 预估 QPS × 平均请求包大小 × 8(bit 转换)

举个例子:

  • 预估 QPS = 10000
  • 平均请求包大小 = 1KB(1024 字节)
  • 所需带宽 = 10000 × 1024 × 8 = 81.92 Mbps

看起来千兆网卡(1000 Mbps)绰绰有余?别急,这只是请求方向。响应方向呢?如果响应包是 10KB,那带宽需求直接翻 10 倍,变成 819.2 Mbps。再加上网络开销、TCP 重传等因素,千兆网卡可能就吃紧了。

我曾经踩过的坑:有一次压测,QPS 死活上不去,查了半天发现是交换机端口被限速到了 100Mbps。嗯,从那以后我每次压测前都会先跑个 iperf 测一下实际带宽。

我的建议:

  • 压测机和被压服务之间,尽量走同一台交换机,减少跳数。
  • 如果条件允许,用万兆网卡 + 万兆交换机。
  • 压测前,用 iperf 或 netperf 跑一下,确认实际带宽。

3.3 被压测服务部署:稳定是第一要义

被压测的服务,部署方式直接影响结果。我见过有人直接在开发环境压测,结果服务时不时重启一下,数据全废了。

部署要点:

  • 独立环境:被压服务最好部署在独立的机器或容器里,不要跟其他服务混跑。
  • 资源隔离:如果用了 Docker,记得限制 CPU 和内存,避免资源争抢。
  • 日志级别:压测时把日志级别调到 WARN 或 ERROR,别让 INFO 日志刷爆磁盘。
  • JVM 参数:如果是 Java 服务,记得调好堆内存和 GC 参数。我一般用 -Xms4g -Xmx4g -XX:+UseG1GC 起步。
避坑指南:我曾经压测一个 Java 服务,发现 QPS 波动很大。查了半天,原来是 GC 日志没关,每秒钟写几百兆日志到磁盘。关了之后,QPS 稳定多了。

3.4 监控工具搭建:Prometheus + Grafana

没有监控的压测,就像闭着眼睛开车。你只知道车在跑,但不知道是快是慢、有没有跑偏。Prometheus 负责采集数据,Grafana 负责展示,这俩是绝配。

3.4.1 Prometheus 搭建

Prometheus 的安装很简单,我一般用 Docker 部署:

docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

配置文件 prometheus.yml 长这样:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'my-service'
    static_configs:
      - targets: ['192.168.1.100:8080']

这里 targets 就是被压服务的地址。如果服务暴露了 Prometheus 指标接口(比如 /metrics),Prometheus 就会定期去抓数据。

我的习惯:我会把 scrape_interval 设成 5s,这样数据更密集,压测时能看到更细的波动。但注意,太频繁会增加服务负担。

3.4.2 Grafana 搭建

Grafana 同样用 Docker 部署:

docker run -d \
  --name grafana \
  -p 3000:3000 \
  grafana/grafana

启动后,浏览器访问 http://localhost:3000,默认账号密码都是 admin。进去之后,先添加 Prometheus 数据源:

  • 点击左侧齿轮图标 → Data Sources → Add data source
  • 选择 Prometheus,URL 填 http://localhost:9090
  • 点击 Save & Test,看到绿色提示就成功了

然后就可以创建 Dashboard 了。我一般会加这几个面板:

  • QPS:rate(http_requests_total[1m])
  • 响应时间:histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[1m]))
  • 错误率:rate(http_requests_total{status=~"5.."}[1m]) / rate(http_requests_total[1m])
  • CPU/内存:从 node_exporter 或 cAdvisor 拿数据

3.4.3 整体架构图

下面这张图,是我压测环境的标准架构。你一看就明白了:

压测机 wrk / locust / JMeter HTTP 请求 被压服务 Java / Go / Python /metrics Prometheus 端口 9090 Grafana 端口 3000 用户 图例: 压测机 被压服务 Prometheus Grafana 用户

你看,压测机发请求到被压服务,被压服务暴露 /metrics 接口,Prometheus 定期去抓,Grafana 再从 Prometheus 拉数据展示。整个链路清晰明了。

3.5 验证环境:跑一次冒烟测试

环境搭好了,别急着上量。先跑一次冒烟测试,确认所有组件都正常:

  1. 启动被压服务,确认 /metrics 接口能返回数据。
  2. 启动 Prometheus,在浏览器访问 http://localhost:9090/targets,确认 target 状态是 UP。
  3. 启动 Grafana,添加数据源,创建一个简单的 QPS 面板,看看有没有数据。
  4. 用压测工具发几个请求,确认 Grafana 面板上的数字在跳动。
我的经验:这一步千万别省。有一次我搭完环境,Prometheus 一直显示 DOWN,查了半天发现是被压服务的防火墙没开 8080 端口。嗯,这种低级错误,冒烟测试就能发现。

好了,环境搭建就到这里。你按照这个步骤来,应该不会出大问题。记住,压测环境越接近生产,结果越有参考价值。别偷懒,该配的配,该测的测。

想要更多资料,联系可可