gongxiangp2/.kiro/specs/ui-fixes/S3存储速度问题诊断报告.md

318 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# S3存储速度问题诊断报告
## 问题现象
用户反馈预览文件加载极慢,网络诊断显示:
- 预览视频首字节时间:**7.57秒**
- 音频文件首字节时间:**21.65秒**
- 实际下载速度:**仅20KB/s**
## 诊断过程
### 1. 网络连通性测试
```
域名: s3.1080p.hk
IP地址: 156.233.232.106
Ping延迟: 36ms(正常)
丢包率: 0%
```
**结论**:网络连通性正常,延迟低。
### 2. 下载速度测试
```powershell
# 测试小文件下载(40KB图片)
下载耗时: 2.15秒
文件大小: 0.04MB
下载速度: 0.02MB/s (20KB/s)
# 测试TTFB(14.48MB音频)
首字节时间: 1917ms
```
**结论**:下载速度极慢,TTFB很高。
### 3. 直接IP访问测试
```
访问 https://156.233.232.106/
返回: frp 404页面
服务器信息: "The server is powered by frp"
```
**结论**:服务器使用 **frp(内网穿透)** 技术。
## 根本原因
**frp内网穿透导致的性能瓶颈**:
1. **架构问题**:
- S3存储服务器在内网
- 通过frp服务器(156.233.232.106)转发流量
- 所有流量都要经过frp中转,形成瓶颈
2. **性能影响**:
- frp服务器带宽限制(可能只有几Mbps)
- 双重网络跳转(客户端 → frp → 内网S3)
- 高延迟、低带宽
3. **用户影响**:
- 大部分用户是公网访问
- 每个文件都要经过frp中转
- 用户体验极差
## 解决方案
### 方案1:使用CDN加速(推荐)⭐
**优点**:
- 成本低(几十元/月)
- 配置简单(1小时内完成)
- 效果显著(速度提升10-100倍)
- 不影响现有架构
**实施步骤**:
1. **选择CDN服务商**:
- 阿里云CDN
- 腾讯云CDN
- 七牛云CDN
- 又拍云CDN
2. **配置CDN**:
```
源站地址: s3.1080p.hk
加速域名: cdn.youyidian.com(需要备案域名)
缓存规则:
- 图片/视频: 缓存30天
- 音频: 缓存30天
```
3. **修改代码**:
```env
# .env
S3_PUBLIC_DOMAIN=https://cdn.youyidian.com/jsxiangche
```
4. **预期效果**:
- 首次访问:通过CDN从源站拉取(仍然慢)
- 后续访问:直接从CDN节点返回(秒开)
- 全国用户都能就近访问
**成本估算**:
- 流量费:0.2元/GB
- 月流量100GB:20元/月
- 月流量1TB:200元/月
### 方案2:迁移到公网S3服务(最佳)⭐⭐⭐
**优点**:
- 彻底解决问题
- 性能最优
- 稳定性高
- 支持CDN加速
**实施步骤**:
1. **选择S3服务商**:
- 阿里云OSS
- 腾讯云COS
- 七牛云Kodo
- AWS S3(海外)
2. **数据迁移**:
```bash
# 使用rclone或官方工具迁移数据
# 预计迁移时间:根据数据量而定
```
3. **修改配置**:
```env
S3_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com
S3_BUCKET=youyidian-materials
S3_PUBLIC_DOMAIN=https://youyidian-materials.oss-cn-hangzhou.aliyuncs.com
```
4. **预期效果**:
- 下载速度:10-50MB/s
- TTFB:50-200ms
- 全球CDN加速
**成本估算**(以阿里云OSS为例):
- 存储费:0.12元/GB/月
- 流量费:0.5元/GB(外网流出)
- 100GB存储 + 100GB流量:12 + 50 = 62元/月
### 方案3:优化frp配置(临时方案)
**优点**:
- 不需要额外成本
- 快速实施
**缺点**:
- 效果有限
- 治标不治本
**实施步骤**:
1. **增加frp带宽**:
- 升级frp服务器带宽
- 或使用多个frp服务器负载均衡
2. **启用压缩**:
```ini
# frpc.ini
[s3]
type = https
local_ip = 内网S3地址
local_port = 443
use_compression = true
bandwidth_limit = 100MB # 移除带宽限制
```
3. **预期效果**:
- 速度提升2-5倍
- 仍然无法达到理想速度
### 方案4:混合方案(平衡方案)⭐⭐
**策略**:
- 小文件(预览图):继续使用现有S3
- 大文件(视频/音频):迁移到公网S3或CDN
**优点**:
- 成本可控
- 效果明显
- 分步实施
**实施步骤**:
1. **修改上传逻辑**:
```typescript
// 根据文件大小选择存储
if (fileSize > 5MB) {
// 上传到公网S3
url = await uploadToPublicS3(file)
} else {
// 上传到现有S3
url = await uploadToS3(file)
}
```
2. **配置双S3**:
```env
# 现有S3(小文件)
S3_ENDPOINT=https://s3.1080p.hk
S3_BUCKET=jsxiangche
# 公网S3(大文件)
S3_PUBLIC_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com
S3_PUBLIC_BUCKET=youyidian-materials
```
## 推荐方案
**短期(1周内)**:
1. 启用CDN加速(方案1)
2. 成本低、见效快
**长期(1个月内)**:
1. 迁移到公网S3(方案2)
2. 彻底解决问题
**紧急(今天)**:
1. 在网络诊断中添加详细说明
2. 告知用户问题原因
3. 提供临时解决方案(使用内网访问)
## 临时解决方案(今天实施)
### 1. 内网用户优化
对于内网用户(192.168.x.x),可以直接访问内网S3,绕过frp:
```typescript
// 检测是否为内网用户
const isInternalNetwork = () => {
// 通过API检测
return fetch('/api/network-info').then(r => r.json())
}
// 根据网络环境选择域名
const getS3Domain = async () => {
const info = await isInternalNetwork()
if (info.isInternal) {
return 'http://内网S3地址' // 需要确认内网地址
}
return 'https://s3.1080p.hk'
}
```
### 2. 网络诊断增强
在网络诊断中添加:
- frp检测
- 带宽瓶颈提示
- 解决方案建议
## 数据支持
### 当前性能
| 指标 | 数值 | 状态 |
|------|------|------|
| Ping延迟 | 36ms | ✅ 正常 |
| TTFB | 1917ms | ❌ 极慢 |
| 下载速度 | 20KB/s | ❌ 极慢 |
| 小文件加载 | 2.15秒 | ❌ 慢 |
| 大文件加载 | 21秒+ | ❌ 极慢 |
### 预期性能(使用CDN后)
| 指标 | 数值 | 改善 |
|------|------|------|
| Ping延迟 | 10-30ms | ✅ 更快 |
| TTFB | 50-200ms | ✅ 快10倍 |
| 下载速度 | 10-50MB/s | ✅ 快500倍 |
| 小文件加载 | <0.1秒 | ✅ 快20倍 |
| 大文件加载 | 1-3秒 | ✅ 快10倍 |
## 下一步行动
1. **立即**:增强网络诊断,添加frp检测和解决方案提示
2. **本周**:联系运维,讨论CDN或S3迁移方案
3. **本月**:实施选定的解决方案
## 附录:测试命令
```powershell
# 测试下载速度
$url = "https://s3.1080p.hk/jsxiangche/由壹点AI/preview-xxx.webp"
$start = Get-Date
$response = Invoke-WebRequest -Uri $url
$duration = ((Get-Date) - $start).TotalSeconds
$size = $response.Content.Length / 1MB
$speed = $size / $duration
Write-Host "速度: $([math]::Round($speed, 2))MB/s"
# 测试TTFB
$start = Get-Date
$response = Invoke-WebRequest -Uri $url -Method Head
$ttfb = ((Get-Date) - $start).TotalMilliseconds
Write-Host "TTFB: $([math]::Round($ttfb))ms"
# 检测frp
$response = Invoke-WebRequest -Uri "https://156.233.232.106/" -SkipCertificateCheck
if ($response.Content -match "frp") {
Write-Host "检测到frp内网穿透"
}
```
---
**报告生成时间**:2025-12-22 10:45
**诊断人员**:Kiro AI
**问题级别**:🔴 严重(影响所有公网用户)