跳转到内容
搜索文档

排查网站缓慢问题

最后更新 查看 MarkdownAgent 设置

本指南帮助你识别并解决影响网站的性能问题。内容从基础诊断开始,逐步深入到高级排查技巧。

开始之前:确认流量经过 Cloudflare

在排查性能问题之前,请确认你的流量确实经过 Cloudflare。如果请求绕过了 Cloudflare,问题与 Cloudflare 无关,本指南也无法提供帮助。

检查 cf-ray 请求头

经过 Cloudflare 提供的每个响应都包含 cf-ray 请求头。检查该请求头:

curl -s -D- -o /dev/null https://www.example.com | grep -i cf-ray
(Invoke-WebRequest -Uri "https://www.example.com" -Method Head).Headers["cf-ray"]

如果你看到 cf-ray 请求头(例如 cf-ray: 8a1b2c3d4e5f6g7h-SJC),说明流量正在经过 Cloudflare。如果没有,请检查 DNS 配置。

确认 DNS 指向 Cloudflare

域名必须解析到 Cloudflare IP 地址,流量才会被代理:

dig +short www.example.com
Resolve-DnsName -Name www.example.com | Select-Object -ExpandProperty IPAddress

返回的 IP 地址应为 Cloudflare IP。如果它们直接指向你的源站服务器,说明 DNS 记录未被代理。

修复方法:

  1. 前往 Cloudflare 仪表板
  2. 找到缓慢主机名的 DNS 记录。
  3. 确保 Proxy status(代理状态) 设为 Proxied(橙色云图标)

收集关于缓慢请求的信息

当能精确定位缓慢之处时,性能问题更容易解决。先收集以下信息:

  1. 识别具体的缓慢请求 — 确定哪些 URL、资源或 API 端点缓慢。
  2. 衡量缓慢程度 — 量化延迟(例如“此图片加载需要 5 秒”)。
  3. 复现问题 — 确认缓慢是持续现象,而非一次性情况。

步骤 1:使用 Observatory 分析性能

Observatory 提供合成测试与真实用户监控 (RUM) 数据,用于评估网站性能。

RUM 尤其重要,因为这些指标来自实际访客的浏览器,客观反映他们体验网站的方式;而实验室数据通常更详细(便于调试),但并不总能与真实用户可用的设备或网络条件对应。

运行速度测试

  1. 前往 Cloudflare 仪表板。

    Go to Observatory ↗
  2. 选择 Observatory(观测站)

  3. 输入要测试的 URL,然后选择 Run test(运行测试)

理解结果

Observatory 会报告关键指标:

指标 衡量内容 目标
Largest Contentful Paint (LCP) 最大可见元素加载完成的时间 2.5 秒以内
First Contentful Paint (FCP) 首次内容出现的时间 1.8 秒以内
Cumulative Layout Shift (CLS) 页面加载期间的视觉稳定性 0.1 以内
Time to First Byte (TTFB) 收到响应首字节的时间 800 毫秒以内
Total Blocking Time (TBT) 主线程被阻塞的时间 200 毫秒以内

真实用户监控会报告类似指标,但你会看到 Interaction to Next Paint (INP),而不是 Total Blocking Time (TBT)。

TBT 仅在页面加载期间测量,而 INP 会测量真实访客与网站的每一次交互。

启用建议的优化

根据 Observatory 结果,启用相关的 Speed 优化

  • Brotli 压缩 — 压缩响应以加快传输
  • Early Hints — 预加载关键资源
  • HTTP/2 与 HTTP/3 — 使用支持多路复用的现代协议,允许多个请求共享单个连接,而不是为每个资源单独打开连接
  • 图像优化 — 自动优化并调整图像大小
  • Rocket Loader — 延迟加载 JavaScript,以改善绘制时间

步骤 2:识别缓慢资源

如果 Observatory 与 RUM 数据指向具体问题,请使用浏览器开发者工具调查各个资源。

使用浏览器开发者工具

  1. 打开浏览器的开发者工具。
  2. 前往 Network(网络) 选项卡。
  3. 重新加载页面,观察哪些请求耗时最长。
  4. Time(时间)Duration(持续时间) 排序,以识别最慢的资源。
  5. 记录缓慢资源的具体 URL。

关注:

  • 大型图像或视频
  • 缓慢的 API 调用
  • 第三方脚本
  • 渲染阻塞资源

步骤 3:分析源站性能

如果网站缓慢,问题可能出在源站服务器。使用 Origin Analytics 了解源站的表现。

检查源站响应时间

在 Cloudflare 仪表板中:

  1. 前往 Speed(速度) > Origin Analytics(源站分析)

    Go to Origin Analytics ↗
  2. 查看 Origin Response Time(源站响应时间) 指标。

  3. 寻找缓慢响应中的模式(特定路径、时段或地理区域)。

较高的源站响应时间表明源站服务器吃力。可考虑:

  • 升级托管计划
  • 优化数据库查询
  • 实施服务端缓存

有关可用指标、诊断流程以及如何解读源站状态码的完整指南,请参阅 Origin Analytics

检查缓慢的 Workers

如果你的 zone 部署了 Cloudflare Workers,它们会在每个匹配请求上执行,并增加总响应时间。缓慢的 Worker 是高 TTFB 的常见原因。

要检查 Workers 是否影响性能:

  1. 在 Cloudflare 仪表板中前往 Workers & Pages
  2. 查看部署在你 zone 上的 Workers。
  3. 检查每个 Worker 的 Analytics(分析),查看执行时间。
  4. 临时禁用 Workers,以隔离它们是否导致缓慢。

如果某个 Worker 缓慢,请检查其代码中是否存在:

  • 缓慢的外部 API 调用或 fetch() 请求
  • 低效的循环或数据处理
  • 缺失的 await 语句导致串行而非并行执行

步骤 4:从命令行测量性能

若需针对特定请求获取详细时序指标,可使用命令行工具测量性能。

基础性能测试

curl -w "\n\nDNS Lookup: %{time_namelookup}s\nTCP Connect: %{time_connect}s\nTLS Handshake: %{time_appconnect}s\nTime to First Byte: %{time_starttransfer}s\nTotal Time: %{time_total}s\n" -o /dev/null -s https://www.example.com/slow-asset.jpg
$url = "https://www.example.com/slow-asset.jpg"
try {
    $timing = Measure-Command { 
        $response = Invoke-WebRequest -Uri $url -ErrorAction Stop
    }
    Write-Host "Total Time: $($timing.TotalSeconds)s"
    Write-Host "Status: $($response.StatusCode)"
} catch {
    if ($_.Exception.Response) {
        $statusCode = $_.Exception.Response.StatusCode.value__
        Write-Host "Error Status: $statusCode"
    }
    Write-Host "Error: $($_.Exception.Message)"
}

示例输出 (bash):

DNS Lookup: 0.025s
TCP Connect: 0.045s
TLS Handshake: 0.120s
Time to First Byte: 0.350s
Total Time: 1.250s

理解这些指标

curl 时序分解显示如下内容:

指标 说明 高值可能表示
DNS Lookup 解析域名的时间 DNS 问题或解析器缓慢
TCP Connect 建立 TCP 连接的时间 网络延迟或服务器距离较远
TLS Handshake 完成 SSL/TLS 协商的时间 证书链问题或服务器缓慢
Time to First Byte (TTFB) 直到首个响应字节的时间 源站处理缓慢
Total Time 完整请求时长 文件较大或传输缓慢

从不同位置测试

要从不同地理位置测试,可使用在线工具,例如:


步骤 5:调查缓存

缓存是改善网站性能最有效的方法之一。内容被缓存后,Cloudflare 会直接从靠近访客的数据中心提供内容,从而省去往返源站服务器的过程。这可将响应时间从数百毫秒缩短到几毫秒。

未缓存的内容必须从访客到达 Cloudflare,再到你的源站服务器,然后返回。使用 Cache Analytics 了解缓存表现,并识别可缓存更多内容的机会。

检查资源是否已缓存

检查特定资源的缓存状态:

curl -s -D- -o /dev/null https://www.example.com/asset.jpg | grep -i "cf-cache-status"
(Invoke-WebRequest -Uri "https://www.example.com/asset.jpg" -Method Head).Headers["cf-cache-status"]

可能的值:

状态 含义 操作
HIT 从 Cloudflare 缓存提供 无需操作
MISS 不在缓存中,从源站获取 可能需要缓存规则
DYNAMIC 不符合缓存条件 若为静态内容,可创建缓存规则
BYPASS 有意绕过缓存 检查缓存规则
EXPIRED 缓存副本已过期 增加 Edge TTL
REVALIDATED Cloudflare 确认内容为最新 增加 Edge TTL

完整列表请参阅 Cloudflare 缓存响应

使用 Cache Analytics

  1. 前往 Cloudflare 仪表板。

    Go to Overview ↗
  2. 查看 Cache Performance(缓存性能) 部分。

  3. Cache status equals MISS(缓存状态等于 MISS)DYNAMIC 过滤,以识别未缓存内容。

调查静态内容未缓存的原因

如果静态资源(图像、CSS、JavaScript)显示缓存状态为 DYNAMICBYPASSMISS,请调查原因:

现象 可能原因 解决方案
DYNAMIC 状态 内容类型不在 默认文件扩展名 创建 Cache Rule 以缓存该内容
DYNAMIC 状态 源站发送 Cache-Control: privateno-store 创建 Cache Rule 以 覆盖源站缓存控制
BYPASS 状态 某条 Cache Rule 正在绕过缓存 检查你的 Cache Rules 配置
每次请求都是 MISS 响应包含 Set-Cookie 请求头 配置源站不为静态资源设置 cookie,或使用 Cache Rule 忽略 cookie
带查询字符串的 MISS 不同查询字符串会创建不同的缓存条目 使用 自定义缓存键 忽略或规范化查询字符串

缓存更多静态内容

默认情况下,Cloudflare 仅缓存某些 文件扩展名。要缓存更多静态内容:

  1. 前往 Caching(缓存) > Cache Rules(缓存规则)
  2. 创建规则以 缓存特定内容
  3. 设置合适的 Edge TTL

使用 Cloudflare Trace 调试缓存规则

如果缓存规则未按预期生效,请使用 Cloudflare Trace 模拟请求,并查看究竟哪些规则会匹配。Trace 会显示你的 Cloudflare 配置(包括缓存规则、页面规则及其他设置)将如何影响特定 URL。

在以下情况中尤其有用:

  • 缓存规则应缓存内容,但响应显示 DYNAMICBYPASS
  • 你不确定哪条规则优先
  • 你想在更改前测试“假设”场景

步骤 6:诊断网络问题

如果 curl 显示较高的 TCP Connect 或 TLS Handshake 时间,问题可能与网络相关,而非应用相关。

测试你的互联网连接

访问 speed.cloudflare.com 测试:

  • 下载与上传速度
  • 延迟(ping)
  • 抖动
  • 丢包

结果较差表明本地网络或 ISP 存在问题。

从你的位置到 Cloudflare 运行 MTR

MTR 结合 traceroute 与 ping,显示每个网络跃点的延迟与丢包。

mtr -rw www.example.com

下载 WinMTR,并以你的域名为目标运行。

关注:

  • 特定跃点的 高延迟(表示网络段缓慢)
  • 丢包(表示网络拥塞或故障)
  • 超时(可能表示防火墙或路由问题)

更多详情请参阅 如何阅读 MTR

从源站到 Cloudflare 运行 MTR

如果你能访问源站服务器,请从源站向某个 Cloudflare IP 地址 运行 MTR,以测试源站与 Cloudflare 之间的网络路径。

mtr -rw 104.16.132.229

此路径上的高延迟或丢包会影响所有未命中缓存的请求。


步骤 7:理解网络路由

请求如何路由到 Cloudflare 数据中心,会显著影响性能。

识别为你的请求提供服务的数据中心

在域名后添加 /cdn-cgi/trace,可查看哪个 Cloudflare 数据中心正在为你的请求提供服务:

curl https://www.example.com/cdn-cgi/trace
Invoke-RestMethod -Uri "https://www.example.com/cdn-cgi/trace"

colo 字段显示提供服务的数据中心的三字母机场代码(例如 colo=SJC 表示圣何塞)。可在 Cloudflare 状态页面 上查看 Cloudflare 数据中心及其代码的完整列表。

路由为何重要

当请求到达 Cloudflare 时:

  1. 请求会根据 anycast 路由 被路由到附近的 Cloudflare 数据中心。
  2. 若内容已缓存,会立即提供。
  3. 若未缓存,Cloudflare 会从你的源站服务器获取。

如果你的源站服务器在地理上距离为用户提供服务的 Cloudflare 数据中心较远,未缓存的请求会变慢。

排查意外路由

如果请求被路由到似乎远离用户的数据中心,这可能是由于 Cloudflare 的自动化流量工程,或用户 ISP 的流量路由。

虽然 Cloudflare 始终力求通过从最近的位置提供流量来实现最佳性能,但可靠性是首要目标。在性能与可靠性冲突时,Cloudflare 的系统会优先选择稳定连接,而不是本地连接。

更多详情请参阅 Cloudflare 流量未发送到地理上最近的数据中心

意外路由的常见原因:

现象 说明
请求路由到远处的数据中心 Cloudflare 为可靠性进行的流量工程,或 ISP 路由决策
请求之间路由发生变化 正常行为——路由会适应网络条件或 ISP 负载均衡
持续路由到较远区域 ISP 对等位置或 Cloudflare 容量管理
附近有数据中心但延迟仍高 路径上的网络拥塞

源站距离的解决方案

根据需求考虑这些方案:

方案 说明 最适合
提高缓存命中率 缓存更多内容以减少源站获取 所有站点
Tiered Cache 使用上层数据中心减少源站请求 有全球流量的站点
Argo Smart Routing 通过更快的网络路径路由流量 源站连接缓慢的站点
将源站移近 在多个区域部署源站服务器 大规模应用

启用 Argo Smart Routing

Argo Smart Routing 实时分析网络状况,并通过最快路径路由流量,平均可将延迟降低 30%。

Argo Smart Routing 是 Smart Shield 的一部分,后者捆绑了多种 Cloudflare 性能与可靠性功能。

要启用 Argo Smart Routing:

  1. 前往 Cloudflare 仪表板
  2. 按照 Smart Shield 设置指南 启用该功能。

Argo 在以下情况下尤其有效:

  • 源站远离用户
  • 网络拥塞影响某些路径
  • 你需要全球范围内的一致性能

有关 Argo Smart Routing 工作原理的详细信息,请参阅 Argo Smart Routing 文档


若问题仍存在,请联系支持

如果你已按上述步骤操作,但性能问题仍然存在,请 联系 Cloudflare 支持 寻求帮助。

联系支持时,请尽可能提供证据,以帮助诊断问题:

  • HAR 文件生成 HAR 文件,捕获缓慢请求。这会为每个请求提供详细的时序信息。
  • Observatory 结果 — 分享 Observatory 测试结果的截图或链接。
  • RUM 数据 — 若已启用 Web Analytics,请分享显示性能问题的相关指标。
  • curl 输出 — 包含对缓慢资源使用 curl --write-out 的时序分解。
  • MTR 结果 — 若怀疑网络问题,请包含从你的位置到受影响域名的 MTR 输出。
  • 具体 URL — 列出缓慢的确切 URL,以及预期与实际响应时间。

你提供的证明缓慢的证据越多,支持团队就能越快识别并解决问题。


相关资源

这篇文档对您有帮助吗?