25 KiB
DeerFlow 接口卡顿独立诊断脚本使用说明
配套脚本:diagnose_deerflow_latency.py
0. 最简单的用法(推荐)
把脚本复制到 DeerFlow 所在服务器,然后直接运行:
python3 diagnose_deerflow_latency.py
脚本会显示中文向导。你只需要:
- 粘贴卡顿接口 URL;
- 选择普通 GET、登录 POST 或 Agent SSE;
- 登录/Agent POST 时再提供请求 JSON 文件;
- 根据提示选择是否需要 Bearer Token 或 Cookie。
- 确认脚本是否运行在实际部署服务器上,避免把个人电脑的 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. 能排查什么
脚本从以下层次收集证据:
-
网络和 HTTPS
- DNS 解析时间
- TCP 建连时间
- HTTP 代理 CONNECT 时间
- TLS 握手时间
- 请求上传时间
- 请求发完到首响应的等待时间
- 响应体读取时间
-
Nginx 和系统连接容量
- 公网入口与
127.0.0.1:8001直连的耗时差异 - 监听队列与 TCP 状态
- Nginx worker 数量、
worker_connections和文件句柄限制 - 可选的 Nginx
stub_status - 502、503、504、upstream timeout、too many open files 等日志模式
- 公网入口与
-
MySQL
- TCP 建连
- 多次新连接执行
SELECT 1的耗时 Threads_connected、max_connections等状态- 活动时间较长的会话数量
- 数据锁、元数据锁等待
- performance schema 聚合信息
MySQL 检查仅执行预置的只读查询,不保存 SQL 正文。
-
DeerFlow 请求排队和热点路径
/api/health/api/v1/auth/options- 登录态下的
auth/me、Agents、Skills 接口 - 慢接口执行期间健康接口是否同时变慢
- 可选的管理员活动运行数和模型并发限制
- Agent SSE 首包时间
-
服务器和容器容量
- 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 值不会写入报告。
6.2 Cookie
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. 提交结果供分析
建议提供以下信息:
- 脱敏后的 JSON 报告;
- 卡顿发生的准确时间和时区;
- 目标 URL 路径,不需要 Token、Cookie 或密码;
- 请求方法 GET/POST;
- 是否经过 Nginx、负载均衡或网关;
- 后端是否为 Docker 部署;
- 公网和本机直连是否都慢;
- 当时大约同时在线或执行 Agent 的人数。
不要提供真实账号密码、Token、Cookie、数据库密码或未经检查的完整业务日志。