环境准备:压测机器选型、被压服务部署、网络与防火墙配置、时间同步
大家好,我是你们的老朋友。今天咱们聊聊压测前的环境准备。说实话,很多新手一上来就急着跑压测脚本,结果数据一塌糊涂,最后发现是环境没搭对。我见过太多这样的案例了。
环境准备这件事,说白了就是给压测搭台子。台子不稳,戏就唱不好。咱们一个一个来看。
压测机器选型
压测机器选型,我个人的经验是:别省钱,但也别浪费。
核心原则:压测机器的性能必须远高于被压服务,至少高出一个数量级。否则你测的是压测机器的瓶颈,而不是被压服务的瓶颈。
具体怎么选?我一般看这几个维度:
- CPU:建议选高频多核的。我习惯用 8 核 16 线程以上的机器。为什么?因为压测工具(比如 wrk、locust)本身也是吃 CPU 的。CPU 不够,压测线程调度不过来,结果就不准。
- 内存:至少 16GB。压测过程中要记录大量连接状态和响应数据。内存太小,系统会频繁 swap,压测曲线就变得锯齿状。
- 网络:千兆网卡是底线。我建议用万兆网卡。你想想看,如果网络带宽成了瓶颈,你测出来的 TPS 其实是网卡的上限,不是服务的上限。
- 磁盘:SSD 是必须的。压测日志、结果数据写入很快,机械硬盘扛不住。
我曾经在一个项目里,用一台 4 核 8G 的虚拟机去压一个高并发服务。结果压到 2000 QPS 就上不去了,CPU 跑满。后来换了物理机,直接干到 2 万 QPS。嗯,这就是教训。
小技巧:如果条件有限,可以用多台压测机器做分布式压测。每台机器分担一部分压力,最后汇总结果。但要注意机器之间的时间同步(后面会讲)。
被压服务部署
被压服务的部署,我建议遵循一个原则:和生产环境保持一致。
为什么?因为部署方式不同,性能表现可能差很多。比如你用 Docker 部署,网络模式是 bridge 还是 host,性能差异能到 10%-20%。
具体来说,注意这几点:
- 硬件配置:尽量和生产环境一致。如果做不到,至少保证 CPU 架构、内存比例、磁盘类型一致。
- 软件版本:JDK 版本、中间件版本、操作系统版本,都要和生产环境对齐。我遇到过因为 JDK 版本不同,GC 行为完全不一样的情况。
- 部署拓扑:如果生产环境是集群部署,压测环境也应该是集群。单机压测的结果不能直接推导到集群。
- 资源配置:JVM 参数、连接池大小、线程池大小,这些都要和生产环境一致。
注意:被压服务不要和压测机器部署在同一台物理机上。否则资源争抢,数据失真。我曾经犯过这个错,压测结果忽高忽低,排查了半天才发现是 CPU 争抢。
网络与防火墙配置
网络配置这块,很多人容易忽略。其实网络是压测中最容易出问题的环节之一。
我一般会检查这几个地方:
- 防火墙:压测机器和被压服务之间的防火墙要放行。特别是高并发场景下,防火墙的连接跟踪表可能会满,导致丢包。
- 端口范围:Linux 默认的临时端口范围是 32768-60999。高并发压测时,客户端端口很快会被用完。我建议改大一些:
# 查看当前临时端口范围
cat /proc/sys/net/ipv4/ip_local_port_range
# 修改为更大的范围
echo "10240 65535" > /proc/sys/net/ipv4/ip_local_port_range
# 永久生效,写入 /etc/sysctl.conf
net.ipv4.ip_local_port_range = 10240 65535
- TIME_WAIT 优化:高并发下,TIME_WAIT 状态的连接会堆积。我习惯开启 tcp_tw_reuse 和 tcp_tw_recycle(注意:tcp_tw_recycle 在 NAT 环境下慎用)。
# 开启 TIME_WAIT 复用
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
# 开启快速回收(谨慎使用)
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
- 网卡调优:开启网卡多队列,让多个 CPU 核心分担网卡中断处理。
# 查看网卡队列数
ethtool -l eth0
# 设置队列数(需要驱动支持)
ethtool -L eth0 combined 8
避坑指南:我曾经在压测时发现 TPS 上不去,排查了半天,最后发现是防火墙的 conntrack 表满了。用 conntrack -S 查看,发现表里全是 ESTABLISHED 状态的连接。调大 conntrack 表后,问题解决。
时间同步
时间同步,听起来很简单,但真的很重要。特别是分布式压测场景下,多台压测机器的时间如果不一致,你汇总出来的响应时间分布图就是错的。
我建议这样做:
- 使用 NTP 服务:所有机器(压测机器和被压服务)都同步到同一个 NTP 服务器。
- 配置 NTP 客户端:
# 安装 ntpdate
yum install ntpdate -y
# 同步时间
ntpdate -u ntp.aliyun.com
# 写入硬件时钟
hwclock -w
- 定时同步:配置 crontab,每 5 分钟同步一次。
*/5 * * * * /usr/sbin/ntpdate -u ntp.aliyun.com > /dev/null 2>&1
- 验证时间差:压测前,用
date命令对比各机器的时间,确保误差在 100ms 以内。
注意:如果使用虚拟机,宿主机的时间漂移可能会影响虚拟机。我建议在宿主机上也配置 NTP 同步。
知识体系总览
下面这张图,是我画的环境准备知识体系。你可以对照着检查自己的环境。
好了,环境准备这块就聊这么多。记住一句话:环境准备花的时间,会在后续排错时十倍百倍地省回来。别嫌麻烦,一步步来。
总结一下:
- 压测机器:CPU 8核+、内存 16G+、万兆网卡、SSD
- 被压服务:和生产环境保持一致
- 网络:防火墙放行、端口范围调大、TIME_WAIT 优化、网卡多队列
- 时间同步:NTP 统一、定时同步、验证误差
想要更多资料,联系可可