压测环境搭建: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 嘛...基本不用了。

四、本章知识体系

下面这张图把本章的核心逻辑串起来了,你可以对照着看:

压测环境搭建核心流程 Linux服务器配置 网络带宽评估 压测工具选型 内核参数优化 文件描述符限制 关闭不必要服务 iperf3 带宽测试 丢包率 & 重传率 带宽瓶颈判断 wrk - 轻量快速 JMeter - 企业级 Locust - 可编程 ab - 简单验证 三者缺一不可,否则压测结果不可信

我的建议:别急着上手压测。先把服务器调好,网络摸清,工具选对。这三步走完,后面的压测才有意义。我曾经见过一个团队,花了两周调优应用,结果发现是网卡驱动版本太旧导致的性能问题...你说这时间花得冤不冤?

好了,这一章的内容就到这儿。环境搭好了,下一章咱们就可以真正开始压测了。

可可精品资料库