性能压测基础:压测目标定义、关键性能指标与压测环境搭建

大家好,我是你们的老朋友。今天咱们聊聊压测的基础。说实话,我见过太多团队一上来就甩开膀子压,压完拿一堆数据,结果啥也分析不出来。为什么?因为目标没定清楚,指标没选对。

这一章,咱们就把地基打牢。你想想看,盖楼不打地基,后面全是空中楼阁。

压测目标定义:你到底想测什么?

很多同学问我:「我该压多少并发?」我的回答永远是:「先问业务,再定目标。」

压测不是炫技,是验证。验证你的系统能不能扛住预期的流量。

核心原则:压测目标必须可量化、可复现、可验证。

我个人习惯把压测目标分成三个层次:

  1. 容量目标:系统能支撑的最大并发用户数或 QPS。比如「双十一峰值 10 万 QPS」。
  2. 稳定性目标:在目标负载下持续运行 N 小时,无 OOM、无核心功能降级。
  3. 延迟目标:P99 延迟不超过 500ms,P999 不超过 2s。

我在项目中遇到过最典型的翻车案例:某团队压测目标写的是「支持 1000 并发」,结果压测工具配了 1000 个线程,服务端直接挂了。后来一查,业务场景是长连接推送,1000 并发意味着 1000 个 TCP 连接同时在线,跟短连接的 1000 QPS 完全是两码事。

避坑指南:我曾经因为没区分「并发用户数」和「并发请求数」,导致压测结果跟线上表现差了 10 倍。记住:并发用户数 ≠ QPS。一个用户可能发多个请求。

关键性能指标:看懂这些数字

指标选不对,压测白费。咱们一个一个说清楚。

QPS 与 TPS

这两个词经常被混用,但本质不同。

指标 全称 含义 适用场景
QPS Queries Per Second 每秒查询数 读多写少的 OLAP 查询
TPS Transactions Per Second 每秒事务数 包含读写的事务型操作

说白了,QPS 侧重「查」,TPS 侧重「做完一件事」。在 OLAP 场景里,我一般更关注 QPS,因为大部分操作是查询。但如果你做的是数据导入或 ETL 压测,TPS 才是你的菜。

P99 延迟

平均延迟是骗人的。你想想看,100 个请求里 99 个 10ms,1 个 10s,平均才 110ms,看着挺美,但那个倒霉的用户已经骂娘了。

P99 延迟的意思是:排在前 99% 的请求都小于这个值。换句话说,只有 1% 的请求比它慢。

我的经验:压测时同时关注 P50、P99、P999。P50 代表「大多数用户」的体验,P99 代表「最差的那 1%」,P999 代表「极端情况」。如果 P999 比 P99 高了一个数量级,说明系统有严重的长尾延迟问题。

吞吐量

吞吐量是系统在单位时间内处理的数据量。对于 OLAP 系统,常用 MB/s 或 GB/h 来衡量。比如「每小时导入 500GB 数据」。

吞吐量和 QPS 的关系就像高速公路:QPS 是车流量,吞吐量是总货运量。一辆大货车(高吞吐)可能只算 1 个 QPS,但拉了 10TB 数据。

记住这个公式:吞吐量 = QPS × 单次请求数据量。优化时,这两个变量都要考虑。

压测环境搭建:别在「假环境」上浪费时间

环境不对,压测结果就是废纸。我见过最离谱的事:压测环境用 4 核 8G 的虚拟机,线上是 64 核 512G 的物理机,然后拿着压测数据去评估线上容量。这不是扯淡吗?

环境搭建的黄金法则

  1. 硬件等比缩放:如果线上是 32 核,压测环境至少 8 核。CPU、内存、磁盘 IO 的比例要尽量一致。
  2. 网络隔离:压测机和目标服务尽量在同一机房或同 VPC,避免公网延迟干扰。
  3. 数据量级匹配:压测数据量至少是线上数据量的 1/10,否则索引效果、缓存命中率都会失真。

避坑指南:我曾经在压测环境里用了线上 1% 的数据量,结果查询全部走内存,P99 延迟 20ms。上线后数据量大了 100 倍,磁盘 IO 打满,P99 直接飙到 5s。教训:数据量不够,压测就是自欺欺人。

压测工具选型

工欲善其事,必先利其器。我常用的压测工具有这些:

工具 适用场景 优点 缺点
Apache JMeter HTTP 接口、JDBC 查询 图形化界面、插件丰富 分布式压测配置复杂
wrk HTTP 短连接压测 轻量、单机并发高 不支持复杂场景编排
sysbench 数据库 OLTP 压测 内置多种测试模型 OLAP 场景支持弱
自研脚本 定制化 OLAP 查询压测 完全可控 开发成本高

我个人习惯用 JMeter 做基础压测,再用自研脚本模拟复杂的 OLAP 查询模式。为什么?因为 OLAP 查询不是简单的 GET/POST,它涉及 SQL 解析、查询计划生成、数据扫描、聚合计算等多个阶段,标准工具很难模拟真实行为。

一个典型的压测环境架构

下面这张图是我常用的压测环境部署结构,你一看就明白:

OLAP 压测环境架构图 OLAP 压测环境典型架构 压测客户端 JMeter / wrk 负载均衡 Nginx / HAProxy OLAP 查询节点 ClickHouse / Doris OLAP 查询节点 ClickHouse / Doris OLAP 查询节点 ClickHouse / Doris 分布式存储 / 对象存储 HDFS / S3 / MinIO 说明:压测客户端通过负载均衡分发请求,OLAP 查询节点无状态水平扩展,数据统一存储在分布式存储层

这个架构的核心思路是:压测客户端无状态、查询节点可扩展、存储层共享。你想想看,如果压测客户端有状态,每次请求都绑定到同一个查询节点,那还测什么负载均衡?

环境搭建 Checklist

每次搭建压测环境,我都会过一遍这个清单:

  • 硬件确认:CPU 核数、内存大小、磁盘类型(SSD/HDD)、网络带宽
  • 软件版本:OLAP 引擎版本、JDK 版本、操作系统内核参数
  • 数据准备:数据量、数据分布、索引状态、分区策略
  • 监控部署:Prometheus + Grafana,至少监控 CPU、内存、磁盘 IO、网络、GC
  • 基线记录:压测前记录一次空载状态下的系统指标

小技巧:我习惯在压测脚本里加一个「预热阶段」,先跑 5 分钟低并发请求,让 JIT 编译、缓存、连接池都热起来。否则前几分钟的数据全是冷启动,没有参考价值。

本章小结

压测基础就这些。说白了,目标定清楚、指标选对、环境搭好,后面的事情才能顺。别急着上高并发,先把这三件事做扎实。