Files
xyzw_web_helper/MD说明文件夹/性能分析-并发数超过20导致WSS连接失败v3.12.8.md

578 lines
13 KiB
Markdown
Raw Normal View History

2025-10-17 20:56:50 +08:00
# 性能分析 - 并发数超过20导致WSS连接失败 v3.12.8
**版本**: v3.12.8
**日期**: 2025-10-08
**类型**: 性能分析 / 使用建议
## 问题描述
用户反馈:
> "我发现并发的数量超过20个就很容易导致WSS链接失败这是什么原因导致的"
**现象**
- 并发数设置为20以下稳定运行 ✅
- 并发数设置为20-30偶尔连接失败 ⚠️
- 并发数设置为30+:频繁连接失败 ❌
## 根本原因分析
### 1. 浏览器WebSocket连接数限制 ⭐ 主要原因
**浏览器限制**
- **Chrome/Edge**: 每个域名最多约 **255-256** 个WebSocket连接理论值
- **实际安全值**: 每个域名建议 **10-20** 个并发连接
- **Firefox**: 约 **200** 个连接
- **Safari**: 约 **100** 个连接
**为什么实际值远小于理论值?**
```
理论最大值: 256个
实际推荐值: 10-20个
原因:
1. 浏览器资源限制内存、CPU
2. 网络带宽限制
3. 操作系统的Socket限制
4. 浏览器的性能保护机制
```
### 2. 游戏服务器连接限制
**服务器端可能的限制**
```
1. 同一IP连接数限制
- 防止DDoS攻击
- 限制单个用户的连接数
- 通常限制10-50个/IP
2. 连接速率限制
- 限制连接建立速度
- 防止批量自动化
- 例如1秒内最多建立5个连接
3. 资源保护
- 服务器总连接数限制
- 单个用户资源配额
- 防止服务器过载
```
### 3. 连接建立速度过快
**当前的连接间隔**
```javascript
const delayMs = connectionIndex * 500 // 每个连接间隔500ms
```
**并发20个时的时间分布**
```
连接1: 0秒 ← 立即开始
连接2: 0.5秒
连接3: 1.0秒
连接4: 1.5秒
...
连接10: 4.5秒
...
连接20: 9.5秒 ← 最后一个连接在9.5秒后开始
```
**问题**
- 虽然有间隔但10秒内建立20个连接
- 可能触发服务器的反批量检测
- 服务器可能认为这是自动化攻击
### 4. 内存和资源占用
**单个WebSocket连接的资源消耗**
```
内存占用: 约 5-10MB / 连接
网络带宽: 约 100KB-1MB / 连接(活跃时)
CPU占用: 约 1-2% / 连接(活跃时)
20个并发连接
内存: 100-200MB
带宽: 2-20MB
CPU: 20-40%
```
**浏览器性能影响**
```
并发10个: 流畅 ✅
并发20个: 可接受 ⚠️
并发50个: 卡顿明显 ❌
并发100个: 浏览器可能崩溃 💥
```
### 5. 网络质量影响
**网络因素**
```
1. 家庭宽带上行带宽限制
- 下载速度: 100Mbps
- 上传速度: 10-20Mbps ← 瓶颈
- 20个连接可能超过上行带宽
2. 路由器NAT表限制
- 家用路由器通常支持 1000-5000 个并发连接
- 但实际稳定值更低
- 过多连接可能导致路由器不稳定
3. ISP限制
- 运营商可能限制同时连接数
- 防止P2P等高并发应用
```
## 技术限制详解
### 浏览器WebSocket实现
```javascript
// Chrome的WebSocket实现简化
class WebSocket {
constructor(url) {
// 1. 检查连接数
if (activeConnections >= MAX_CONNECTIONS_PER_DOMAIN) {
throw new Error('Too many connections')
}
// 2. 建立TCP连接
// 3. WebSocket握手
// 4. 维护心跳
}
}
// 限制机制
const MAX_CONNECTIONS_PER_DOMAIN = 256 // 理论值
const RECOMMENDED_LIMIT = 10-20 // 实际安全值
```
### 操作系统限制
**Windows**
```
默认最大Socket数: 65535理论
实际推荐值: 5000-10000
单个进程限制: 2000-5000
```
**macOS/Linux**
```
默认限制: 1024ulimit -n
可调整为: 65535
但实际使用建议: 5000以下
```
## 当前实现分析
### 连接建立流程
```javascript
// src/stores/batchTaskStore.js
const executeBatchWithConcurrency = async (tokenIds, tasks) => {
const queue = [...tokenIds]
const executing = []
let connectionIndex = 0
while (queue.length > 0 || executing.length > 0) {
// 填充执行队列最多maxConcurrency个
while (executing.length < maxConcurrency.value && queue.length > 0) {
const tokenId = queue.shift()
// 错开连接时间
const delayMs = connectionIndex * 500 // 500ms间隔
connectionIndex++
const promise = (async () => {
if (delayMs > 0) {
await new Promise(resolve => setTimeout(resolve, delayMs))
}
// 建立连接并执行任务
return executeTokenTasks(tokenId, tasks)
})()
executing.push(promise)
}
// 等待至少一个完成
if (executing.length > 0) {
await Promise.race(executing)
}
}
}
```
### 问题分析
1. **累加的延迟时间**
```
第1个: 0ms
第2个: 500ms
第3个: 1000ms
...
第20个: 9500ms
问题:前面的连接可能已经完成,
但新连接仍在累加延迟
```
2. **并发控制不精确**
```
虽然限制了executing.length < maxConcurrency
但实际活跃的WebSocket连接数可能更多
因为连接建立和任务执行是异步的
```
3. **没有连接失败重试限制**
```
连接失败会重试,但可能加剧连接压力
```
## 解决方案和建议
### 方案1降低推荐并发数 ⭐ 推荐
**建议的安全值**
| 网络环境 | 推荐并发数 | 说明 |
|---------|----------|------|
| **家庭宽带** | **10-15** | 最稳定,适合大多数用户 |
| 高速宽带 | 15-20 | 网络条件好可以尝试 |
| 企业网络 | 20-30 | 专线网络,上行带宽足够 |
| 服务器环境 | 30-50 | 数据中心,网络质量极好 |
**实施**
```javascript
// src/stores/batchTaskStore.js
const maxConcurrency = ref(
parseInt(localStorage.getItem('maxConcurrency') || '10') // 默认改为10
)
// 添加警告提示
const setMaxConcurrency = (count) => {
if (count > 20) {
console.warn(`⚠️ 警告:并发数 ${count} 超过推荐值(20)`)
console.warn(`⚠️ 可能导致WebSocket连接失败、浏览器卡顿等问题`)
console.warn(`⚠️ 建议设置为10-20之间`)
}
maxConcurrency.value = count
localStorage.setItem('maxConcurrency', count.toString())
}
```
### 方案2优化连接间隔策略
**当前策略问题**
```javascript
const delayMs = connectionIndex * 500 // 累加延迟
// 第20个要等9.5秒,但前面的可能已经完成了
```
**优化策略**
```javascript
// 固定间隔,不累加
const CONNECTION_INTERVAL = 1000 // 每个连接间隔1秒
let lastConnectionTime = 0
while (executing.length < maxConcurrency.value && queue.length > 0) {
const tokenId = queue.shift()
// 计算需要等待的时间
const now = Date.now()
const timeSinceLastConnection = now - lastConnectionTime
const waitTime = Math.max(0, CONNECTION_INTERVAL - timeSinceLastConnection)
if (waitTime > 0) {
await new Promise(resolve => setTimeout(resolve, waitTime))
}
lastConnectionTime = Date.now()
// 建立连接...
}
```
### 方案3添加连接池管理
```javascript
// 连接池配置
const CONNECTION_POOL_CONFIG = {
maxConnections: 20, // 最大连接数
maxActiveConnections: 10, // 最大活跃连接数
connectionTimeout: 30000, // 连接超时30秒
idleTimeout: 60000, // 空闲超时60秒
connectionInterval: 1000 // 连接间隔1秒
}
// 连接池管理
class WebSocketPool {
constructor(config) {
this.config = config
this.activeConnections = new Map()
this.pendingQueue = []
}
async acquire(tokenId) {
// 等待直到可以建立新连接
while (this.activeConnections.size >= this.config.maxActiveConnections) {
await new Promise(resolve => setTimeout(resolve, 100))
}
// 建立连接
const connection = await this.createConnection(tokenId)
this.activeConnections.set(tokenId, connection)
return connection
}
release(tokenId) {
this.activeConnections.delete(tokenId)
}
}
```
### 方案4分批执行
```javascript
// 将Token分批执行每批不超过10个
const BATCH_SIZE = 10
const BATCH_INTERVAL = 5000 // 批次间隔5秒
for (let i = 0; i < tokenIds.length; i += BATCH_SIZE) {
const batch = tokenIds.slice(i, i + BATCH_SIZE)
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
console.log(`🔄 执行第 ${Math.floor(i / BATCH_SIZE) + 1} 批`)
console.log(`📊 本批数量: ${batch.length}`)
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
// 执行这一批
await executeBatch(batch, tasks)
// 批次间隔
if (i + BATCH_SIZE < tokenIds.length) {
console.log(`⏸️ 等待${BATCH_INTERVAL/1000}秒后执行下一批...`)
await new Promise(resolve => setTimeout(resolve, BATCH_INTERVAL))
}
}
```
## 用户使用建议
### 1. 根据Token数量选择并发数
```
Token总数 推荐并发数 预计时间
--------------------------------------
1-10个 5-7 2-3分钟
10-50个 7-10 5-8分钟
50-100个 10-15 8-12分钟
100-500个 10-15 20-60分钟
500-1000个 10-15 60-120分钟
```
### 2. 网络环境优化
**家庭网络**
```
1. 使用有线连接比WiFi更稳定
2. 关闭其他占用带宽的应用
3. 避免高峰时段晚上8-10点
4. 重启路由器清理NAT表
5. 并发数设置为10-12
```
**移动热点**
```
1. 4G/5G热点通常上行带宽较低
2. 建议并发数: 5-8
3. 避免流量不足时执行
4. 注意流量消耗
```
**企业/学校网络**
```
1. 可能有防火墙限制
2. 可能禁止WebSocket
3. 建议先小规模测试
4. 并发数: 10-15
```
### 3. 分时段执行
```javascript
// 方案A深夜执行服务器压力小
定时时间: 凌晨2:00-5:00
并发数: 可以设置高一些 (15-20)
稳定性: ⭐⭐⭐⭐⭐
// 方案B白天执行
定时时间: 上午10:00-下午4:00
并发数: 中等 (10-12)
稳定性: ⭐⭐⭐⭐
// 方案C高峰时段不推荐
定时时间: 晚上8:00-10:00
并发数: 低 (5-8)
稳定性: ⭐⭐
```
### 4. 监控和调整
**观察指标**
```
1. WebSocket连接成功率
- >95%: 并发数合适 ✅
- 90-95%: 可以接受 ⚠️
- <90%: 降低并发数
2. 任务执行失败率
- <5%: 正常
- 5-10%: 注意观察 ⚠️
- >10%: 需要优化 ❌
3. 浏览器响应速度
- 流畅: 合适 ✅
- 偶尔卡顿: 可接受 ⚠️
- 频繁卡顿: 降低并发 ❌
```
**调整策略**
```
步骤1: 从10开始测试
步骤2: 观察连接成功率和失败率
步骤3: 如果稳定可以逐步增加到12、15
步骤4: 如果出现问题,立即降低
步骤5: 找到最佳值后固定使用
```
## 错误排查
### 常见错误和解决方法
#### 错误1连接超时
```
错误信息: WebSocket connection timeout
原因: 服务器响应慢或网络不稳定
解决:
1. 降低并发数到10
2. 增加连接间隔到1000ms
3. 检查网络连接
```
#### 错误2连接被拒绝
```
错误信息: WebSocket connection refused
原因: 服务器限制连接数或IP被封
解决:
1. 立即停止批量任务
2. 等待5-10分钟
3. 降低并发数到5-8
4. 增加连接间隔到2000ms
```
#### 错误3浏览器卡死
```
现象: 浏览器无响应CPU 100%
原因: 并发数过高,资源耗尽
解决:
1. 强制刷新页面 (Ctrl+F5)
2. 清除浏览器缓存
3. 下次使用时降低并发数到5-10
```
#### 错误4部分Token连接失败
```
现象: 100个Token中20-30个连接失败
原因: 超过服务器或浏览器限制
解决:
1. 降低并发数
2. 使用"重试失败"功能
3. 分批执行
```
## 最佳实践总结
### 稳定运行配置
```javascript
// 推荐配置
{
maxConcurrency: 10, // 并发数
connectionInterval: 1000, // 连接间隔1秒
requestTimeout: 5000, // 请求超时5秒
maxRetries: 3, // 最大重试3次
retryDelay: 3000 // 重试延迟3秒
}
```
### 性能vs稳定性权衡
```
高性能模式(不推荐):
- 并发数: 30-50
- 连接间隔: 500ms
- 风险: 高
- 稳定性: ⭐⭐
- 速度: ⭐⭐⭐⭐⭐
平衡模式(推荐):
- 并发数: 10-15
- 连接间隔: 1000ms
- 风险: 低
- 稳定性: ⭐⭐⭐⭐
- 速度: ⭐⭐⭐⭐
稳定模式:
- 并发数: 5-8
- 连接间隔: 2000ms
- 风险: 极低
- 稳定性: ⭐⭐⭐⭐⭐
- 速度: ⭐⭐⭐
```
## 技术限制对照表
| 限制类型 | 限制值 | 影响 | 建议 |
|---------|--------|------|------|
| 浏览器连接数 | 10-20/域名 | 超过会连接失败 | 并发≤15 |
| 服务器限制 | 10-50/IP | 超过可能被封 | 并发≤20 |
| 上行带宽 | 10-20Mbps | 影响连接速度 | 并发≤15 |
| 浏览器内存 | 100-200MB | 影响性能 | 并发≤20 |
| 路由器NAT | 1000-5000 | 连接不稳定 | 并发≤15 |
## 总结
**问题根源**
- 🔍 浏览器WebSocket连接数限制10-20个
- 🔍 游戏服务器连接数限制
- 🔍 网络带宽限制(特别是上行)
- 🔍 系统资源限制内存、CPU
**推荐配置**
-**并发数**: 10-15最佳平衡点
-**连接间隔**: 1000ms
-**网络环境**: 有线连接优先
-**执行时段**: 避开高峰期
**关键建议**
- 💡 **不要盲目追求高并发**,稳定性更重要
- 💡 **从10开始测试**,逐步找到最佳值
- 💡 **关注连接成功率**<95%就降低并发
- 💡 **使用进度保存**,连接失败可以继续
- 💡 **分时段执行**,深夜/凌晨最稳定
---
**状态**: ✅ 已分析
**版本**: v3.12.8
**推荐并发数**: 10-15