318 lines
7.0 KiB
Markdown
318 lines
7.0 KiB
Markdown
# 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
|
||
**问题级别**:🔴 严重(影响所有公网用户)
|