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

7.0 KiB
Raw Blame History

S3存储速度问题诊断报告

问题现象

用户反馈预览文件加载极慢,网络诊断显示:

  • 预览视频首字节时间:7.57秒
  • 音频文件首字节时间:21.65秒
  • 实际下载速度:仅20KB/s

诊断过程

1. 网络连通性测试

域名: s3.1080p.hk
IP地址: 156.233.232.106
Ping延迟: 36ms(正常)
丢包率: 0%

结论:网络连通性正常,延迟低。

2. 下载速度测试

# 测试小文件下载(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
    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. 数据迁移:

    # 使用rclone或官方工具迁移数据
    # 预计迁移时间:根据数据量而定
    
  3. 修改配置:

    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. 启用压缩:

    # 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. 修改上传逻辑:

    // 根据文件大小选择存储
    if (fileSize > 5MB) {
      // 上传到公网S3
      url = await uploadToPublicS3(file)
    } else {
      // 上传到现有S3
      url = await uploadToS3(file)
    }
    
  2. 配置双S3:

    # 现有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:

// 检测是否为内网用户
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. 本月:实施选定的解决方案

附录:测试命令

# 测试下载速度
$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 问题级别:🔴 严重(影响所有公网用户)