Files
deerflow-code/DEERFLOW_LATENCY_DIAGNOSIS_GUIDE_ZH.md
T

25 KiB
Raw Blame History

DeerFlow 接口卡顿独立诊断脚本使用说明

配套脚本:diagnose_deerflow_latency.py

0. 最简单的用法(推荐)

把脚本复制到 DeerFlow 所在服务器,然后直接运行:

python3 diagnose_deerflow_latency.py

脚本会显示中文向导。你只需要:

  1. 粘贴卡顿接口 URL;
  2. 选择普通 GET、登录 POST 或 Agent SSE;
  3. 登录/Agent POST 时再提供请求 JSON 文件;
  4. 根据提示选择是否需要 Bearer Token 或 Cookie。
  5. 确认脚本是否运行在实际部署服务器上,避免把个人电脑的 CPU/内存误认为服务器指标。

脚本会显示 [1/5] 到 [5/5] 的进度,最后直接输出“一键判断”,告诉你当前证据更偏向:

  • Nginx/入口代理;
  • MySQL/数据库;
  • DeerFlow 并发或热点路径;
  • CPU、内存、磁盘等服务器资源;
  • DNS、TCP、TLS 等网络问题。

如果只是普通 GET,也可以一行执行:

python3 diagnose_deerflow_latency.py 'https://你的域名/卡顿接口'

一行模式只请求目标接口一次,不自动压测、不跟随重定向、不复制请求到本机直连地址。需要登录态时,可使用专门的诊断环境变量:

export DEERFLOW_DIAG_TOKEN='你的测试 Token'
export DEERFLOW_DIAG_ON_SERVER=1
python3 diagnose_deerflow_latency.py 'https://你的域名/api/skills?sort=time_desc'
unset DEERFLOW_DIAG_TOKEN DEERFLOW_DIAG_ON_SERVER

Token 值不会显示或写入报告。不要使用生产管理员的长期 Token。

1. 工具定位

这是一个可以单独复制、单独运行的诊断脚本,不是 DeerFlow 后端补丁。

  • 不需要重新发布或替换后端。
  • 不需要把脚本放进 DeerFlow 源码目录。
  • 不需要安装 Python 第三方包。
  • 不会修改 Nginx、MySQL、Docker 或 DeerFlow 配置。
  • 默认只进行 HTTP 测量和只读状态采集。
  • 支持 Python 3.9 及以上版本。

建议把脚本复制到发生卡顿的 Linux 服务器,在卡顿正在发生时运行。只有从服务器本机运行,才能同时采集 CPU、内存、磁盘、连接队列、Nginx、Docker 等现场信息。

登录接口和 Agent 接口通常是 POST,请求本身可能创建会话或任务。脚本默认只发送一次,不会自动压测。请使用测试账号和测试数据。

2. 能排查什么

脚本从以下层次收集证据:

  1. 网络和 HTTPS

    • DNS 解析时间
    • TCP 建连时间
    • HTTP 代理 CONNECT 时间
    • TLS 握手时间
    • 请求上传时间
    • 请求发完到首响应的等待时间
    • 响应体读取时间
  2. Nginx 和系统连接容量

    • 公网入口与 127.0.0.1:8001 直连的耗时差异
    • 监听队列与 TCP 状态
    • Nginx worker 数量、worker_connections 和文件句柄限制
    • 可选的 Nginx stub_status
    • 502、503、504、upstream timeout、too many open files 等日志模式
  3. MySQL

    • TCP 建连
    • 多次新连接执行 SELECT 1 的耗时
    • Threads_connected、max_connections 等状态
    • 活动时间较长的会话数量
    • 数据锁、元数据锁等待
    • performance schema 聚合信息

    MySQL 检查仅执行预置的只读查询,不保存 SQL 正文。

  4. DeerFlow 请求排队和热点路径

    • /api/health
    • /api/v1/auth/options
    • 登录态下的 auth/me、Agents、Skills 接口
    • 慢接口执行期间健康接口是否同时变慢
    • 可选的管理员活动运行数和模型并发限制
    • Agent SSE 首包时间
  5. 服务器和容器容量

    • CPU、load、iowait、steal
    • 内存、Swap、Linux PSI
    • 磁盘忙碌度和剩余空间
    • 进程 CPU、RSS、线程数、FD 使用率
    • cgroup/Docker CPU 和内存限制
    • Docker OOM、重启次数

3. 准备脚本

把单个 Python 文件复制到目标服务器:

scp diagnose_deerflow_latency.py user@server:/tmp/

登录服务器后检查 Python:

python3 --version
python3 /tmp/diagnose_deerflow_latency.py --help

脚本可以在任意目录执行。只有使用 --config 时才需要知道 DeerFlow 的 config.yaml 路径。

4. 第一次运行:只测一个接口

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/health' \
  --count 5 \
  --server-checks \
  --output /tmp/deerflow-latency.json

终端会显示中文摘要,完整脱敏结果写入 /tmp/deerflow-latency.json。

Linux 上默认会自动启用服务器检查;显式写上 --server-checks 更清楚。普通用户权限不足时,部分 Nginx、Docker 或进程信息会显示为“未完成检查”,但不会导致整个诊断失败。

默认还会对目标 origin 的 /health、/api/health 和 /api/langgraph/health 各进行一次安全 GET 探测。如果不希望产生这些额外请求,增加 --no-health-baselines。

5. 推荐排查顺序

第一步:测公网入口

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/skills?sort=time_desc' \
  --count 5 \
  --server-checks \
  --output /tmp/01-public.json

第二步:同时对比 Gateway 本机直连

确保两条 URL 的路径、查询参数和业务行为一致:

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/skills?sort=time_desc' \
  --compare-url 'http://127.0.0.1:8001/api/skills?sort=time_desc' \
  --count 5 \
  --server-checks \
  --output /tmp/02-public-vs-direct.json

如果请求带 Token、Cookie、任意自定义 header、--query-env、请求体,或使用 POST,向不同 origin 发送这些内容前必须明确增加:

--allow-cross-origin-compare

该参数意味着你已经确认比较地址可信。POST 登录和 Agent 请求不建议使用 --compare-url,应分两次各运行一次,避免重复创建状态。

第三步:增加 DeerFlow 基线接口

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/skills?sort=time_desc' \
  --count 5 \
  --deerflow-suite \
  --server-checks \
  --output /tmp/03-deerflow-suite.json

未提供登录凭据时,只检查公开的 health 和 auth/options。提供 Bearer Token 或 Cookie 后,才会增加 auth/me、Agents、Skills 等登录态基线。

第四步:安全 GET 接口使用干扰探针

下面的命令会在慢接口执行期间,每 0.25 秒探测一次 /api/health:

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/skills?sort=time_desc' \
  --count 5 \
  --deerflow-suite \
  --interference \
  --server-checks \
  --output /tmp/04-interference.json

如果慢接口执行时 health 也明显变慢,更偏向 Gateway worker、事件循环、CPU 或 IO 被阻塞。如果 health 始终很快,更偏向该请求自身的数据库、模型或下游服务等待。

--interference 会额外请求一次目标接口,仅建议用于 GET/HEAD/OPTIONS 等无副作用接口。

第五步:检查 MySQL

先做不带账号的 TCP 连通性检查:

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/health' \
  --server-checks \
  --mysql-host '10.0.0.20' \
  --mysql-port 3306 \
  --output /tmp/05-mysql-tcp.json

若需查询连接、锁和 performance schema,请参见“经过认证的 MySQL 只读检查”。

第六步:卡顿时再运行一次

间歇性问题恢复后再执行,只能反映恢复后的状态。最好在下面任一现象出现时立即运行:

  • 登录等待很久;
  • Skills/Agents 页面一直转圈;
  • Agent 长时间没有返回 SSE 响应实体字节;
  • 出现 429、502、503 或 504;
  • 所有页面同时变慢。

6. 鉴权接口

6.1 Bearer Token

不要把 Token 直接写进命令行。使用环境变量:

read -rsp 'Bearer Token: ' DF_TOKEN
export DF_TOKEN
echo

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/skills?sort=time_desc' \
  --bearer-env DF_TOKEN \
  --count 5 \
  --deerflow-suite \
  --server-checks \
  --output /tmp/skills-auth.json

unset DF_TOKEN

Token 值不会写入报告。

read -rsp 'Cookie header value: ' DF_COOKIE
export DF_COOKIE
echo

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/protected/path' \
  --cookie-env DF_COOKIE \
  --count 5 \
  --output /tmp/cookie-request.json

unset DF_COOKIE

环境变量值应为 Cookie header 的值,例如 session=...; other=...,不要包含 Cookie: 前缀,也不要把真实值发给其他人。

6.3 自定义请求头

普通非敏感头:

--header 'Accept: application/json'

敏感头使用环境变量:

read -rsp 'API key: ' DF_API_KEY
export DF_API_KEY
echo

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/path' \
  --header-env 'X-API-Key=DF_API_KEY'

unset DF_API_KEY

6.4 URL 查询参数中的敏感值

不要把 ticket、token、password 等直接写进 URL。使用:

read -rsp 'Ticket: ' DF_TICKET
export DF_TICKET
echo

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/login/callback' \
  --query-env 'ticket=DF_TICKET' \
  --count 1 \
  --output /tmp/ticket-request.json

unset DF_TICKET

报告中的 URL 查询参数值会统一脱敏。

7. 登录 POST 接口

登录请求可能创建登录会话,所以默认只发送一次。先准备请求体文件,并限制权限:

umask 077
vi /tmp/login-request.json
chmod 600 /tmp/login-request.json

例如请求体可能是:

{
  "username": "diagnosis-user",
  "password": "请填写测试账号密码"
}

实际字段应以你的登录接口为准。运行:

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/v1/auth/login' \
  --method POST \
  --header 'Content-Type: application/json' \
  --data-file /tmp/login-request.json \
  --count 1 \
  --read-mode full \
  --first-byte-timeout 60 \
  --total-timeout 90 \
  --server-checks \
  --output /tmp/login-diagnosis.json

完成后删除临时请求体:

rm -f /tmp/login-request.json

注意:

  • 请求体内容不会写入 JSON 报告。
  • 不要为登录 POST 增加 --interference。
  • 不要同时使用 --compare-url,公网和直连应分别执行一次。
  • 不要增加 --count 或 --concurrency,除非确认可以重复登录并明确加上 --allow-unsafe-replay。

如果 HTTP 状态很快返回 401/403,这仍然说明链路和服务响应很快;它不代表登录业务验证成功。请结合 status_counts 判断。

8. Agent SSE 首包诊断

Agent 请求通常是 POST,并返回 text/event-stream。使用 first-byte 模式,只等待首个响应实体字节,不等待整个 Agent 任务结束:

read -rsp 'Bearer Token: ' DF_TOKEN
export DF_TOKEN
echo

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/实际Agent流式接口' \
  --method POST \
  --header 'Content-Type: application/json' \
  --header 'Accept: text/event-stream' \
  --bearer-env DF_TOKEN \
  --data-file /tmp/agent-request.json \
  --count 1 \
  --read-mode first-byte \
  --first-byte-timeout 180 \
  --total-timeout 240 \
  --server-checks \
  --output /tmp/agent-first-byte.json

unset DF_TOKEN

请使用测试会话。客户端在收到首个响应实体字节后会关闭连接,但服务端任务是否继续运行取决于实际接口实现。

first-byte 不解析 SSE 协议边界,因此这个字节不等于一个完整 SSE 事件,也不一定代表模型已经开始生成。它可能来自 SSE 注释、心跳、代理填充,甚至 JSON/HTML 错误正文;必须同时检查 HTTP 状态码和响应 Content-Type。

重点看:

  • response_wait 很高:服务端迟迟没有返回响应头,可能在排队、鉴权、数据库、worker 或上游连接阶段等待;
  • 响应头很快,但首个响应实体字节很慢:可能在 Agent、模型并发或模型供应商阶段等待;
  • 返回 429:优先检查 DeerFlow 模型并发限制或上游配额;
  • 返回 502/503/504:结合 Nginx error log 和本机直连结果。

首个响应实体字节的精确耗时位于 JSON 单样本的 hops[].timings_ms.first_body_after_upload;response_wait 表示请求上传完成到收到首个响应字节,通常对应响应头开始返回。

9. Skills 接口专项诊断

read -rsp 'Bearer Token: ' DF_TOKEN
export DF_TOKEN
echo

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/skills?sort=time_desc' \
  --compare-url 'http://127.0.0.1:8001/api/skills?sort=time_desc' \
  --allow-cross-origin-compare \
  --bearer-env DF_TOKEN \
  --count 5 \
  --deerflow-suite \
  --interference \
  --server-checks \
  --config '/实际路径/config.yaml' \
  --output /tmp/skills-diagnosis.json

unset DF_TOKEN

该组合可以同时判断:

  • 公网/Nginx 是否比 Gateway 直连慢;
  • Skills 是否比 health、auth 和 Agents 更慢;
  • Skills 执行期间 health 是否也被拖慢;
  • 技能目录文件量和仅元数据遍历是否异常;
  • CPU、iowait、磁盘是否同时出现压力。

10. Nginx 连接数专项诊断

脚本在 Linux 上会尝试执行只读的 nginx -T、ss 和 /proc 检查。如果已经配置仅本机可访问的 stub_status,可增加:

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/health' \
  --server-checks \
  --nginx-status-url 'http://127.0.0.1/nginx_status' \
  --output /tmp/nginx-diagnosis.json

主要证据:

  • active_connections 接近 worker_processes × worker_connections;
  • Recv-Q 接近监听 backlog;
  • 大量 SYN-RECV;
  • Nginx 日志命中 worker_connections are not enough;
  • 进程 FD 使用率接近上限;
  • 公网明显慢于 127.0.0.1:8001 直连。

仅看到大量 ESTABLISHED 或 Waiting 连接,不能单独证明连接数耗尽。SSE 和 keepalive 本身就会保持连接,应结合理论槽位、FD、队列和错误日志判断。

11. 经过认证的 MySQL 只读检查

服务器需要安装 mysql 命令行客户端。建议为诊断创建权限受限的只读账号,并使用单独的 client 配置文件:

[client]
host=10.0.0.20
port=3306
user=diagnosis_ro
password=替换为诊断账号密码
database=deerflow
protocol=TCP
ssl-mode=REQUIRED

保存后限制权限:

chmod 600 /secure/path/diagnosis.cnf

运行:

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/health' \
  --server-checks \
  --mysql-defaults-file '/secure/path/diagnosis.cnf' \
  --mysql-probes 3 \
  --output /tmp/mysql-diagnosis.json

TCP 认证要求配置 ssl-mode=REQUIRED、VERIFY_CA 或 VERIFY_IDENTITY。如果 MySQL 只允许本机 Unix Socket,可使用:

[client]
user=diagnosis_ro
password=替换为诊断账号密码
database=deerflow
protocol=SOCKET
socket=/var/run/mysqld/mysqld.sock

普通业务库只读权限通常足以执行 SELECT 1,但查看完整 processlist、全局状态以及 performance_schema 的锁和 digest 聚合可能需要额外的只读可见权限。权限不足时脚本会保留已完成的检查,并把其余项目标记为部分不可用;请查看报告的 coverage.unavailable 和 server.mysql 错误字段。不要为了消除这些提示授予写权限或管理员权限,应由 DBA 按最小权限补充所需的监控可见性。

也可以把 MySQL URL 放入环境变量:

read -rsp 'MySQL URL: ' DF_MYSQL_URL
export DF_MYSQL_URL
echo

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/health' \
  --server-checks \
  --mysql \
  --mysql-url-env DF_MYSQL_URL \
  --output /tmp/mysql-diagnosis.json

unset DF_MYSQL_URL

TCP URL 必须带 ssl-mode=REQUIRED、VERIFY_CA 或 VERIFY_IDENTITY。不要把数据库密码直接写到命令行。 用户名、密码、数据库名中的特殊字符需要按 URL 规则进行 percent-encoding。

12. DeerFlow 活动运行数和并发限制

如果当前账号具有管理员权限,可以读取活动运行数和模型并发配置:

read -rsp 'Admin JWT: ' DF_ADMIN_TOKEN
export DF_ADMIN_TOKEN
echo

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/health' \
  --admin-token-env DF_ADMIN_TOKEN \
  --server-checks \
  --output /tmp/concurrency-diagnosis.json

unset DF_ADMIN_TOKEN

如果管理员 API 使用另一个可信 origin:

--admin-origin 'https://gateway.example.com' --allow-cross-origin-admin

报告只保存活动数量、最长运行时间、模型聚合及并发限制,不保存任务正文。

13. 小规模并发退化测试

--concurrency 是主动并发请求,会增加生产压力。应先使用单并发建立基线:

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/skills?sort=time_desc' \
  --count 10 \
  --concurrency 1 \
  --output /tmp/concurrency-1.json

在经过确认的低峰窗口,最多先升到 2:

python3 /tmp/diagnose_deerflow_latency.py \
  --url 'https://example.com/api/skills?sort=time_desc' \
  --count 10 \
  --concurrency 2 \
  --output /tmp/concurrency-2.json

不要对登录、创建任务、发送消息等 POST 接口进行并发测试。脚本会拒绝重复或并发执行有副作用的方法,除非显式增加 --allow-unsafe-replay。

14. 如何读报告

14.1 HTTP 时间字段

字段 含义 主要怀疑方向
dns DNS 解析 DNS 服务器、解析链路
tcp_connect TCP 建连 网络、防火墙、SYN/backlog、连接压力
proxy_connect HTTP 代理建立隧道 前向代理
tls_handshake TLS 握手 TLS 终止层、证书链、中间设备、CPU
request_upload 发送请求头和请求体 客户端到服务器上传链路
response_wait 请求发完到收到首个响应字节 Nginx 上游排队、Gateway、DB、文件扫描、下游服务
headers_complete_after_upload 请求发完到响应头完整 响应头返回阶段
body_read 读取响应体 大响应、SSE、网络吞吐、代理缓冲
total 单次总耗时 整体体验

脚本使用新的 HTTP/1.1 连接测量,不等同于浏览器复用 HTTP/2/keepalive 的真实行为。

14.2 四类怀疑的判断矩阵

观察结果 更可能的方向
公网慢,本机 127.0.0.1:8001 快 Nginx、负载均衡、TLS、入口网络
公网和直连都慢,health 也同时慢 Gateway worker/事件循环、CPU、内存、磁盘 IO、整机压力
health 快,但 auth/me、Agents 等多个 DB 路径慢 MySQL、连接池、锁、数据库磁盘
只有 Skills 慢,且执行时 health 也慢 同步技能目录扫描、慢盘/NFS、单 worker 阻塞
Agent 首包慢,但 health 快 模型并发、模型供应商、工具调用或该请求下游
429 DeerFlow 并发限制、上游配额或其他限流
502/503/504 Nginx 到上游失败、上游超时或服务不可用
TCP 慢且监听队列/SYN-RECV 高 连接洪峰、backlog 或处理能力不足
Nginx active 接近理论槽位,FD 也高 Nginx 连接/文件句柄容量风险
MySQL Threads_connected 接近 max_connections DB 连接容量或连接泄漏
MySQL 存在锁等待/长会话 锁、长事务或慢 SQL
CPU busy/load/PSI 高 服务器算力不足或进程热点
iowait/磁盘 util 高 MySQL、SQLite、技能目录或日志所在存储慢
MemAvailable 很低、Swap/OOM 明显 内存不足或容器限制过低

单个指标不能直接定根因。脚本的“优先结论”会把多项证据组合起来,并给出下一步建议。

successful_transport 只表示 HTTP 传输流程完成。HTTP 401、403、429、500、502 等仍可能计入传输成功,必须同时检查 status_counts 和报告中的优先结论。

15. 常用参数

参数 说明
--url URL 目标地址,可重复
--url-env ENV 从环境变量读取目标 URL
--compare-url URL 同一请求的另一路径,例如 Gateway 直连
--method GET/POST HTTP 方法
--bearer-env ENV 从环境变量读取 Bearer Token
--cookie-env ENV 从环境变量读取 Cookie
--header-env HEADER=ENV 从环境变量读取敏感请求头
--query-env KEY=ENV 从环境变量读取查询参数值
--data-file PATH 请求体文件,- 表示 stdin
--count N 请求次数;GET 默认 5,POST 默认 1
--concurrency N 并发数,默认 1
--read-mode MODE auto、headers、first-byte、full
--connect-timeout SEC DNS/TCP/TLS 相关连接超时
--first-byte-timeout SEC 等待响应头或首个响应实体字节的超时
--read-timeout SEC 正文空闲读取超时
--total-timeout SEC 单请求硬性总超时
--deerflow-suite 检查 DeerFlow 基线接口
--interference 慢 GET 执行期间持续测 health
--server-checks 收集 Linux/Nginx/Docker/日志/数据库状态
--config PATH DeerFlow config.yaml 路径
--log PATH 增加一个待扫描日志,可重复
--nginx-status-url URL Nginx stub_status 地址
--mysql-host HOST 只做 MySQL TCP 测量
--mysql-defaults-file PATH 进行 MySQL 认证只读检查
--admin-token-env ENV 管理员只读并发检查
--output PATH JSON 报告路径
--no-output 不生成 JSON 文件
--json-stdout 将完整 JSON 输出到终端

查看全部参数:

python3 /tmp/diagnose_deerflow_latency.py --help

16. TLS、代理和重定向

  • HTTPS 默认校验证书。
  • 内部 CA 使用 --ca-file /path/to/ca.pem。
  • --insecure 会关闭证书校验,仅用于明确了解风险的临时诊断,报告会记录安全警告。
  • 默认不使用系统 HTTP_PROXY/HTTPS_PROXY,需要时显式增加 --use-env-proxy。
  • 也可以使用 --proxy 或更安全的 --proxy-env。
  • 默认不跟随重定向;--follow-redirects 只允许同 origin 跳转,跨 origin 会被拒绝。
  • 带凭据、环境变量查询值或请求体时,非本机明文 HTTP 会被拒绝。优先使用 HTTPS,不建议使用 --allow-insecure-http。

--allow-unsafe-replay、--allow-cross-origin-compare、--allow-cross-origin-admin、--allow-insecure-http 和 --insecure 都是明确的风险开关,不应放进日常默认命令。

17. 日志和权限

脚本会尝试自动发现常见的 Nginx、Gateway 和运行日志,也可以显式提供:

--log /var/log/nginx/error.log --log /path/to/gateway.log

报告只保存错误模式的命中次数,不保存完整日志行,避免把业务内容带入报告。

建议先以普通部署用户运行。权限不足时,报告会明确列出缺失项。不要为了方便直接把数据库密码或 Token 写进 sudo 命令行;如确需更高权限读取 Nginx/进程信息,应在受控 shell 中重新设置所需环境变量。

18. 报告安全

脚本不会保存:

  • 请求体和响应体;
  • Token、Cookie、密码或敏感请求头值;
  • URL 查询参数值;
  • MySQL SQL 正文;
  • 原始日志行。

报告仍可能包含:

  • IP、端口和路径;
  • 容器名、模型名、数据库主机名;
  • Nginx 和系统容量信息;
  • 接口路径和状态码。

把报告发给其他人之前仍应人工检查和脱敏。不要公开上传到互联网。

19. 常见问题

报告显示“未完成检查”

通常是权限不足、命令不存在或功能未配置。例如:

  • 没有 ss;
  • 当前用户无法运行 nginx -T;
  • 没有 Docker socket 权限;
  • 没有安装 mysql client;
  • 没有配置 Nginx stub_status;
  • 管理员 Token 权限不足。

这不会使已经采集到的其他证据失效。

接口返回 401 或 403

检查 Bearer/Cookie 是否正确,以及接口是否需要特殊请求头。401/403 是 HTTP 响应,不属于 DNS/TCP/TLS 传输失败。

公网和直连业务不一致

某些 Nginx 配置依赖原始 Host。如果直接访问 127.0.0.1:8001 与公网执行的不是同一业务,则两者耗时不能直接比较。可根据实际配置增加非敏感 Host header:

--header 'Host: example.com' --allow-cross-origin-compare

仅在确认后端确实需要该 Host 时使用。自定义 Host 会同时应用到公网目标和直连目标;不同 origin 的比较存在任意自定义 header 时,脚本要求显式使用 --allow-cross-origin-compare。

脚本没有抓到问题

间歇性卡顿通常需要在问题发生时运行。可以保留同一套命令,在用户反馈卡顿时立即执行,并同时记录准确时间,之后与 Nginx、Gateway、MySQL 监控对齐。

20. 提交结果供分析

建议提供以下信息:

  1. 脱敏后的 JSON 报告;
  2. 卡顿发生的准确时间和时区;
  3. 目标 URL 路径,不需要 Token、Cookie 或密码;
  4. 请求方法 GET/POST;
  5. 是否经过 Nginx、负载均衡或网关;
  6. 后端是否为 Docker 部署;
  7. 公网和本机直连是否都慢;
  8. 当时大约同时在线或执行 Agent 的人数。

不要提供真实账号密码、Token、Cookie、数据库密码或未经检查的完整业务日志。