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