现在的 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
2
3
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"
sudo sysctl -w net.ipv4.tcp_tw_reuse=1

3. 用 wrk 模拟 1 万连接

1
wrk -t8 -c10000 -d30s http://127.0.0.1:8080/

如果你的服务器能撑住:

  • 不崩
  • 不拒绝连接
  • 不出现大量超时

那就说明此 epoll 服务器确实能承受 1 万连接。

🟪 方案 5:用 Python 写一个 1 万连接的客户端(最真实)

1
2
3
4
5
6
7
8
9
10
11
import socket
import threading

def connect():
s = socket.socket()
s.connect(("127.0.0.1", 8080))
s.send(b"GET / HTTP/1.1\r\nHost: localhost\r\n\r\n")
s.recv(1024)

for _ in range(10000):
threading.Thread(target=connect).start()

这是真实的 TCP 连接 + HTTP 请求。

🎯 最终结论(非常清晰)

完全可以用这些工具测试此 epoll 服务器:

工具 用途
curl 功能测试
ab 入门压测
wrk 专业压测(推荐)
wrk2 更稳定的 QPS 控制
Python 客户端 模拟真实 1 万连接
sysctl + ulimit 调优内核参数

🌟 结论先说:

单台客户端完全可以发出 1 万、5 万、甚至 10 万 TCP 连接。

但必须满足三个条件:

  1. 系统允许足够多的文件描述符(ulimit -n)
  2. 内核参数允许大量 TIME_WAIT、端口复用等
  3. 压测工具本身支持高并发(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
2
3
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w net.ipv4.tcp_tw_recycle=1
sudo sysctl -w net.ipv4.tcp_fin_timeout=10

这样 TIME_WAIT 就不会成为瓶颈。

🧩 关键点 3:压测工具本身能不能发这么多?

✔ wrk

可以发 1 万、2 万连接 (但 wrk 的连接数受线程数影响)

✔ wrk2

更稳定,支持更高连接数

✔ Python 自己写脚本

线程 + 协程(asyncio)可以轻松发 1 万连接

✔ Go 写客户端

Go 的 goroutine 可以轻松发 5 万连接

✔ hping3

可以发大量 TCP SYN(但不是完整连接)

🧪 实战例子:

一个真实的 Python 例子:

1
2
3
4
5
6
7
8
9
10
11
import socket
import threading

def connect():
s = socket.socket()
s.connect(("127.0.0.1", 8080))
s.send(b"GET / HTTP/1.1\r\nHost: localhost\r\n\r\n")
s.recv(1024)

for _ in range(10000):
threading.Thread(target=connect).start()

只要:

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 服务器可行吗? ✔ 完全可行