fix: fix the issue of During ultra-high concurrency (5000 req, 200 concurrent) URL Params testing, stability issues were encountered (success rate only 0.24%).

This commit is contained in:
meiseayoung
2025-12-30 18:29:03 +08:00
parent e22f612f24
commit e305abba2b
3 changed files with 102 additions and 83 deletions
+45 -23
View File
@@ -1,40 +1,62 @@
# 已知问题
## 1. HTTP Keep-Alive 连接复用不支持
## 1. HTTP Keep-Alive 连接复用优化
**状态**: 等待 V 语言官方修复
**状态**: 已优化 (2025-12-30)
**问题描述**:
每次 HTTP 请求响应时间约 300ms,其中大部分时间消耗在 TCP 连接建立上。即使响应头中包含 `Connection: keep-alive`,连接也无法复用。
**现象**:
- 快速连续发送请求:每次都慢(~300ms)
- 慢速发送请求:快慢交替(复用时快,超时后重建连接时慢)
在超高并发(5000 req, 200 concurrent)的 URL Params 测试中出现稳定性问题(成功率仅 0.24%)。
**根本原因**:
V 语言标准库 `net.http.Server` 的 `handle_conn` 函数在每次请求处理完成后都会立即关闭连接:
1. picoev 的 `max_fds = 1024` 限制了并发连接数
2. 虽然设置了 `Connection: keep-alive` 头,但连接管理不够优化
3. 高并发下客户端端口耗尽(TCP TIME_WAIT 状态累积)
4. 缺少 `Content-Length` 头导致客户端无法正确解析响应边界
**已实施的优化**:
### 1. 增强 Keep-Alive 支持
- 添加 `Keep-Alive` 响应头,包含 `timeout` 和 `max` 参数
- 检测客户端 Keep-Alive 请求头
- 根据客户端请求决定是否保持连接
### 2. 响应头优化
- 始终设置 `Content-Length` 头,帮助客户端正确解析响应边界
- 优化 `Content-Type` 默认值
### 3. 高并发配置
新增 `HighConcurrencyConfig` 和 `listen_high_concurrency()` 方法:
```v
// F:\v\vlib\net\http\server.v
fn (mut w HandlerWorker) handle_conn(mut conn net.TcpConn) {
defer {
conn.close() or { eprintln('close() failed: ${err}') } // 每次请求后关闭连接
}
// ... 处理单个请求 ...
// 使用高并发优化配置启动
app.listen_high_concurrency(8081)
// 或使用自定义配置
config := hono.HighConcurrencyConfig{
port: 8081
timeout_secs: 5 // 较短超时
keepalive_timeout: 3 // Keep-Alive 超时
max_keepalive_req: 500 // 单连接最大请求数
}
app.listen_high_concurrency_with_config(config)
```
**影响**:
- 无法实现 HTTP/1.1 Keep-Alive 连接复用
- 每次请求都需要重新建立 TCP 连接(三次握手)
- 高并发场景下性能受限
### 4. 服务器配置优化
- 降低默认超时时间(8秒 -> 5秒)以更快释放连接
- 增大写缓冲区(8KB -> 64KB)
- 添加 TCP_NODELAY 配置选项
**临时解决方案**:
- 在服务器前部署支持 Keep-Alive 的反向代理(如 nginx)
- 或等待 V 语言官方修复此问题
**使用建议**:
1. 高并发场景使用 `--high-concurrency` 或 `-hc` 参数启动服务器
2. 在服务器前部署支持 Keep-Alive 的反向代理(如 nginx)
3. 使用压力测试工具验证: `v run examples/stress_test.v`
**picoev 底层限制**:
- `max_fds = 1024` 是 picoev 的硬编码限制
- 真正的连接复用需要 picoev 底层支持
- 建议关注 V 语言官方对 picoev 的更新
**跟踪**:
- V 语言 GitHub: https://github.com/vlang/v
- 相关文件: `vlib/net/http/server.v`
- 相关文件: `vlib/picoev/picoev.v`
**发现日期**: 2025-12-26
**更新日期**: 2025-12-30