mirror of
https://github.com/GSManagerXZ/GameServerManager.git
synced 2025-11-28 08:30:32 +08:00
5.7 KiB
5.7 KiB
大文件上传优化指南
问题分析
用户反馈大文件上传时容易出现以下问题:
- 上传中途卡住
- 网络中断后重新上传
- 上传速度不稳定
- 偶尔出现连接错误
优化措施
1. 降低并发上传数
原因: 并发过多会导致:
- 服务器压力过大
- 网络连接数过多
- 容易触发限流
优化:
// 从 3 个并发降低到 2 个
CONCURRENT_UPLOADS = 2
2. 增加超时时间
原因:
- 大文件分片上传时间较长
- 网络波动可能导致临时变慢
优化:
// 从 60秒 增加到 120秒(2分钟)
CHUNK_UPLOAD_TIMEOUT = 120000
3. 优化重试策略
改进点:
- 增加重试次数:3次 → 5次
- 增加重试延迟:使用指数退避 + 随机抖动
- 添加详细的重试日志
重试时间表:
| 重试次数 | 延迟时间 | 说明 |
|---|---|---|
| 第1次 | 2-3秒 | 基础延迟 + 随机抖动 |
| 第2次 | 4-5秒 | 延迟翻倍 |
| 第3次 | 8-9秒 | 继续翻倍 |
| 第4次 | 16-17秒 | 继续增长 |
| 第5次 | 30秒 | 最大延迟 |
4. 添加批次间延迟
目的: 避免请求过快导致服务器压力
实现:
- 每个批次之间延迟 200ms
- 每上传10个分片休息 100ms
5. 提高分片上传阈值
原因: 小文件使用普通上传更快
优化:
// 从 5MB 提高到 10MB
shouldUseChunkUpload: fileSize > 10MB
6. 增强日志输出
新增日志:
- 批次进度提示
- 详细的重试信息
- 上传速度统计
- 错误详情
使用建议
网络较差环境
如果您的网络环境较差,建议:
-
调整并发数为 1
// client/src/utils/chunkUpload.ts private static readonly CONCURRENT_UPLOADS = 1 -
增加分片大小
private static readonly DEFAULT_CHUNK_SIZE = 5 * 1024 * 1024 // 5MB -
增加超时时间
private static readonly CHUNK_UPLOAD_TIMEOUT = 300000 // 5分钟
网络良好环境
如果您的网络环境很好,可以:
-
增加并发数
private static readonly CONCURRENT_UPLOADS = 4 -
减小分片大小
private static readonly DEFAULT_CHUNK_SIZE = 1 * 1024 * 1024 // 1MB -
降低重试次数
private static readonly MAX_RETRIES = 3
故障排查
问题1: 频繁出现 "ECONNREFUSED" 错误
原因:
- 服务器负载过高
- 并发数过多
- 防火墙限制
解决方法:
- 降低并发数到 1
- 检查服务器资源使用情况
- 检查防火墙/安全组设置
问题2: 上传速度很慢
原因:
- 网络带宽限制
- 服务器上行带宽不足
- 分片过小导致请求频繁
解决方法:
- 增加分片大小到 5MB 或更大
- 检查网络带宽
- 优化服务器配置
问题3: 上传中途卡住
原因:
- 超时时间不够
- 网络不稳定
- 浏览器内存不足
解决方法:
- 增加超时时间到 5分钟
- 使用稳定的网络环境
- 关闭不必要的浏览器标签
问题4: 断点续传不工作
原因:
- 上传会话过期(超过24小时)
- 服务器重启
解决方法:
- 在24小时内完成上传
- 服务器重启后需要重新上传
监控和调试
查看上传日志
浏览器控制台:
// 查看详细的上传进度
// 打开开发者工具 -> Console
// 会显示:
// - 分片计算信息
// - 批次上传进度
// - 重试详情
// - 上传速度
服务端日志:
# 查看上传相关日志
tail -f server/logs/app.log | grep -i upload
# 查看错误日志
tail -f server/logs/error.log
性能指标
建议的性能指标:
- 上传速度: > 1 MB/s
- 成功率: > 95%
- 重试率: < 10%
- 平均耗时: < 文件大小(MB) 秒
高级配置
自适应并发控制
可以根据网络质量动态调整并发数:
// 检测网络质量
async function detectNetworkQuality() {
// 测试上传小文件
const start = Date.now()
await uploadTestChunk()
const duration = Date.now() - start
// 根据速度调整并发
if (duration < 1000) return 4 // 网络很好
if (duration < 3000) return 2 // 网络一般
return 1 // 网络较差
}
智能重试
根据错误类型调整重试策略:
function getRetryDelay(error: Error, attempt: number) {
// 网络错误:快速重试
if (error.message.includes('network')) {
return 1000 * attempt
}
// 服务器错误:慢速重试
if (error.message.includes('500')) {
return 5000 * attempt
}
// 默认:指数退避
return 2000 * Math.pow(2, attempt)
}
最佳实践
-
文件大小限制
- 建议单个文件不超过 5GB
- 超大文件建议使用专业上传工具
-
网络要求
- 稳定的网络连接
- 建议使用有线网络
- 避免在弱网环境上传大文件
-
浏览器要求
- 使用最新版本的现代浏览器
- 保持浏览器标签页不被关闭
- 避免浏览器休眠
-
服务器配置
- 确保足够的磁盘空间
- 配置合理的并发限制
- 定期清理临时文件
更新日志
v1.1.0 (2025-01-04)
优化:
- 🔧 降低并发数:3 → 2
- ⏱️ 增加超时:60秒 → 120秒
- 🔄 优化重试:3次 → 5次
- 📊 增强日志输出
- 🎯 提高分片阈值:5MB → 10MB
- ⚡ 添加批次间延迟
- 🎲 添加重试随机抖动
修复:
- 🐛 修复频繁连接错误
- 🐛 修复上传卡顿问题
- 🐛 优化网络中断恢复
文档更新时间: 2025-01-04