9.压测
现在的 epoll HTTP 服务器完全可以用专业工具做压力测试,得到真实的:
- 最大并发连接数
- 最大 QPS
- 最大吞吐量
- 延迟分布(P50 / P90 / P99)
- CPU / 内存占用
以下是一个从简单到专业的完整测试方案,照着做就能得到真实数据。
🟩 方案 1:用 curl 做最简单的功能测试(不是压力测试)
1 | curl -v http://127.0.0.1:8080/ |
确认服务器能正常返回。
🟦 方案 2:用 ab(ApacheBench)做轻量压测
这是最常用的入门压测工具。
安装:
1 | sudo apt install apache2-utils |
测试 1000 次请求,50 并发:
1 | ab -n 1000 -c 50 http://127.0.0.1:8080/ |
你能看到:
- QPS
- 平均延迟
- 失败率
- 并发处理能力
🟧 方案 3:用 wrk(最专业的 HTTP 压测工具)
这是工业界最常用的压测工具,Nginx 官方推荐 wrk。
安装(Ubuntu):
1 | sudo apt install wrk |
压测 30 秒,100 并发:
1 | wrk -t4 -c100 -d30s http://127.0.0.1:8080/ |
参数解释:
-t4:4 个线程-c100:100 个并发连接-d30s:持续 30 秒
wrk 会有:
- Requests/sec(QPS)
- Latency(延迟)
- Transfer/sec(吞吐量)
这是最真实的性能指标。
🟥 方案 4:测试“1 万连接同时在线”
问“能不能承受 10000 台客户端同时连接”,要用 tcpcopy / hping3 / wrk2 / custom client 来模拟。
最简单的方法:
用 hping3 模拟大量 TCP 连接:
1 | hping3 -S -p 8080 --flood 127.0.0.1 |
但它不建立完整 HTTP 连接。
更专业的方法:用 wrk + ulimit + sysctl 调优
1. 提高文件描述符限制
1 | ulimit -n 200000 |
2. 调整内核参数
1 | sudo sysctl -w net.core.somaxconn=65535 |
3. 用 wrk 模拟 1 万连接
1 | wrk -t8 -c10000 -d30s http://127.0.0.1:8080/ |
如果你的服务器能撑住:
- 不崩
- 不拒绝连接
- 不出现大量超时
那就说明此 epoll 服务器确实能承受 1 万连接。
🟪 方案 5:用 Python 写一个 1 万连接的客户端(最真实)
1 | import socket |
这是真实的 TCP 连接 + HTTP 请求。
🎯 最终结论(非常清晰)
完全可以用这些工具测试此 epoll 服务器:
| 工具 | 用途 |
|---|---|
| curl | 功能测试 |
| ab | 入门压测 |
| wrk | 专业压测(推荐) |
| wrk2 | 更稳定的 QPS 控制 |
| Python 客户端 | 模拟真实 1 万连接 |
| sysctl + ulimit | 调优内核参数 |
🌟 结论先说:
单台客户端完全可以发出 1 万、5 万、甚至 10 万 TCP 连接。
但必须满足三个条件:
- 系统允许足够多的文件描述符(ulimit -n)
- 内核参数允许大量 TIME_WAIT、端口复用等
- 压测工具本身支持高并发(wrk、ab、Python、Go 客户端都可以)
这些都满足后,一台机器发 1 万连接是轻轻松松的。
🧩 为什么单台客户端能发这么多连接?
因为:
- 一个 TCP 连接 = 一个文件描述符
- Linux 默认限制是 1024
- 但你可以把它调到 100000 或更多
例如:
1 | ulimit -n 200000 |
这意味着:
你的客户端可以同时打开 20 万个 socket。
这不是理论,是实战。
🧩 关键点 1:端口数量够不够?
客户端发起连接时使用:
1 | 源IP:源端口 → 目标IP:目标端口 |
源端口范围默认是:
1 | 1024 ~ 65535 |
也就是 6 万多个端口。
如果你想发 10 万连接怎么办?
你可以:
✔ 使用多个源 IP(虚拟网卡)
✔ 使用端口复用(SO_REUSEPORT)
✔ 使用多个客户端进程
✔ 使用多个线程 + 多个 socket 组
所以端口不是瓶颈。
🧩 关键点 2:TIME_WAIT 会不会爆?
大量短连接会产生 TIME_WAIT。
解决方法:
1 | sudo sysctl -w net.ipv4.tcp_tw_reuse=1 |
这样 TIME_WAIT 就不会成为瓶颈。
🧩 关键点 3:压测工具本身能不能发这么多?
✔ wrk
可以发 1 万、2 万连接 (但 wrk 的连接数受线程数影响)
✔ wrk2
更稳定,支持更高连接数
✔ Python 自己写脚本
线程 + 协程(asyncio)可以轻松发 1 万连接
✔ Go 写客户端
Go 的 goroutine 可以轻松发 5 万连接
✔ hping3
可以发大量 TCP SYN(但不是完整连接)
🧪 实战例子:
一个真实的 Python 例子:
1 | import socket |
只要:
1 | ulimit -n 20000 |
这段代码就能发出 1 万个真实 TCP 连接。
🧠 那么,单台客户端的极限是多少?
取决于:
| 项目 | 典型值 |
|---|---|
| 文件描述符限制 | 100k~500k |
| 可用端口 | 6 万(单 IP) |
| CPU | 1 核也能发 1 万连接 |
| 内存 | 每个连接占 10~20KB |
所以:
⭐ 单台客户端发 1 万连接 → 轻松
⭐ 单台客户端发 5 万连接 → 需要调内核
⭐ 单台客户端发 10 万连接 → 需要多 IP 或端口复用
🎯 最终结论(非常清晰)
| 你问的问题 | 答案 |
|---|---|
| 单台客户端能发 1 万连接吗? | ✔ 绝对可以 |
| 工具能做到吗? | ✔ wrk、Python、Go 都可以 |
| 需要调系统吗? | ✔ 需要调 ulimit 和 sysctl |
| 真实压测你的 epoll 服务器可行吗? | ✔ 完全可行 |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
