压测环境搭建:Linux服务器基础配置、网络带宽评估、压测工具选型
说实话,很多做压测的朋友一上来就选工具、写脚本,结果压出来的数据根本没法看。为什么?因为环境没搭好。我见过太多人拿一台没调过的服务器直接开压,结果瓶颈到底在哪儿都说不清。今天咱们就把这块掰开揉碎了讲清楚。
核心思路:压测环境搭建 = 服务器调优 + 网络摸底 + 工具选对。这三步缺一不可。
一、Linux服务器基础配置
我个人习惯,拿到一台新服务器,先做三件事:改内核参数、调文件描述符、关掉不必要的服务。你想想看,如果系统本身就有瓶颈,压测结果能准吗?
1. 内核参数优化
这里有个文件你必须改——/etc/sysctl.conf。我直接贴一份我常用的配置:
# 网络优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_keepalive_time = 1200
# 文件句柄
fs.file-max = 1000000
# 端口范围
net.ipv4.ip_local_port_range = 1024 65535
改完之后记得执行 sysctl -p 让它生效。嗯,这里要注意:tcp_tw_recycle 在 NAT 环境下千万别开,我踩过这个坑,导致部分客户端连不上。
2. 文件描述符限制
压测时并发连接数一上来,系统默认的 1024 文件描述符根本不够用。我曾经遇到过压到 2000 并发时,服务端直接报 "too many open files",排查了半天才发现是这个问题。
修改方法:
# 临时生效
ulimit -n 1000000
# 永久生效 - 编辑 /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
3. 关闭不必要的服务
压测期间,关掉防火墙、SELinux、还有那些乱七八糟的定时任务。你想想看,压测时 CPU 被别的进程抢走了,数据还怎么信?
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
注意:生产环境别这么干!压测环境可以放开,但生产环境一定要评估风险。
二、网络带宽评估
很多人忽略这一步。你服务器性能再强,带宽只有 100Mbps,那吞吐量上限也就 12.5MB/s。说白了,网络就是压测的"水管",水管细了,水再多也流不出去。
1. 用 iperf3 测带宽
我习惯在压测机和目标服务器上都装 iperf3:
# 服务端(目标服务器)
iperf3 -s
# 客户端(压测机)
iperf3 -c 目标IP -t 30 -P 10
这个命令会开 10 个并发流,测 30 秒。结果会显示带宽、丢包率、重传率。如果丢包率超过 0.1%,那网络就有问题。
2. 评估结果怎么看?
| 指标 | 正常范围 | 需要关注 |
|---|---|---|
| 带宽利用率 | < 80% | > 90% 可能成为瓶颈 |
| 丢包率 | < 0.01% | > 0.1% 需要排查 |
| 重传率 | < 0.5% | > 1% 网络不稳定 |
我记得有一次帮客户做压测,服务器配置很高,但吞吐量死活上不去。一测网络,发现交换机端口被限速了,只有 100Mbps。你说冤不冤?
三、压测工具选型
工具选对了,事半功倍。我按自己的经验,把主流工具分了个类:
1. wrk - 轻量级 HTTP 压测
如果你只是想快速测一下接口的 QPS,wrk 是我的首选。它基于事件驱动,用 Lua 脚本可以做一些简单的参数化。
# 基本用法
wrk -t12 -c400 -d30s http://目标IP:端口/路径
# 参数说明
-t 线程数
-c 连接数
-d 持续时间
优点:轻量、性能高、结果清晰。缺点:不支持复杂的业务逻辑,比如登录态、事务控制。
2. ab (Apache Bench) - 简单粗暴
ab 是 Apache 自带的工具,安装简单,适合快速验证。但说实话,它的并发模型比较老,高并发下结果不太准。
ab -n 10000 -c 100 http://目标IP:端口/路径
我个人只在调试阶段用 ab,正式压测很少用它。为什么?因为它不支持 Keep-Alive 的精细控制,而且结果统计比较粗糙。
3. JMeter - 企业级压测
如果你需要做复杂的业务场景压测,比如登录 -> 浏览 -> 下单 -> 支付,那 JMeter 是首选。它支持参数化、断言、监听器,还能生成漂亮的报告。
我一般这样用:
- 用 GUI 模式编写脚本
- 用命令行模式执行压测
- 用插件生成 HTML 报告
# 命令行执行
jmeter -n -t test.jmx -l result.jtl -e -o report/
小技巧:JMeter 的 GUI 模式只用来调试脚本,正式压测一定要用命令行。GUI 模式本身就会消耗大量资源,影响结果。
4. Locust - 可编程压测
Locust 是用 Python 写的,最大的特点是你可以用代码定义用户行为。如果你团队里有 Python 开发,Locust 会很受欢迎。
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
wait_time = between(1, 5)
@task
def index(self):
self.client.get("/")
优点:灵活、可扩展、支持分布式。缺点:学习曲线比 wrk 高,性能不如 wrk 和 JMeter。
5. 选型建议
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 快速验证接口性能 | wrk | 轻量、结果直观 |
| 复杂业务流程 | JMeter | 功能全面、报告丰富 |
| 团队有 Python 背景 | Locust | 可编程、易扩展 |
| 简单测试、临时使用 | ab | 安装简单、上手快 |
我个人习惯:调试用 wrk,复杂场景用 JMeter,团队协作用 Locust。ab 嘛...基本不用了。
四、本章知识体系
下面这张图把本章的核心逻辑串起来了,你可以对照着看:
我的建议:别急着上手压测。先把服务器调好,网络摸清,工具选对。这三步走完,后面的压测才有意义。我曾经见过一个团队,花了两周调优应用,结果发现是网卡驱动版本太旧导致的性能问题...你说这时间花得冤不冤?
好了,这一章的内容就到这儿。环境搭好了,下一章咱们就可以真正开始压测了。