诊断 CPU 和内存使用情况
当网关工作进程的 CPU 占用过高或内存持续增长时,可以使用 Diagnostic Agents。控制台会生成代理的部署命令和凭据,列出已连接的代理,并提供用于采集和下载诊断报告的终端。
代理运行在网关所在的宿主机上,通过 mTLS 连接到 DP Manager。控制台通过该连接转发诊断请求,因此代理无需发布端口或接受入站连接。每个代理都能看到其所在宿主机上的进程,包括所选网关组之外的进程。
Diagnostic Agents 在 API7 Enterprise 3.10.7 中引入。请将控制台和 DP Manager 都升级到支持此功能的版本。ngxdig 镜像独立发布,可用的采集选项取决于已安装的镜像。本指南使用支持 cpu-on 和 memsnap 命令的终端。
如需查看单个请求的追踪和插件执行耗时,请参阅调试会话。
前置条件
- 已运行并获得许可证的 API7 网关部署,以及正在运行的网关实例。参阅使用 Docker Compose 部署或在 Kubernetes 上部署 API7 企业版。按照这些指南操作时,请为控制面选择 3.10.7 或更高版本的镜像标签;较早的示例标签不包含 Diagnostic Agents。
- 管理员账号,或拥有
gateway:ListDiagnosticAgents、gateway:GetDiagnosticAgent、gateway:DeployDiagnosticAgent和gateway:UseDiagnosticAgentConsole权限的角色。 - 能够在网关宿主机上运行 Docker 命令,或在网关所在节点上创建生成的 Kubernetes Secret 和 Pod。
- ngxdig 镜像支持的 Linux 宿主机。CPU 性能分析要求内核版本至少为 5.10、
/sys/kernel/btf下存在内核 BTF 数据,并具有使用 eBPF 和性能事件的权限。以下流程已在 Linux amd64 上验证。 - 代理可访问的 DP Manager TLS 地址,通常使用
7943端口。请使用部署中配置的地址,并确保主机名包含在证书中。控制台的浏览器访问地址不一定是 DP Manager 地址。 - 在高可用部署中,每个 DP Manager 都必须能够通过其他 DP Manager 公布的地址访问它们。除非对等实例能够访问从已接受连接推导出的容器地址,否则请配置
server.advertise。参阅控制面高可用。
内存快照读取进程内存和 /proc,不需要 eBPF,但仍需能够访问目标进程及其 PID 命名空间。
生成的部署会共享宿主机的 PID 命名空间,并授予包括 BPF、PERFMON、SYS_PTRACE 和 SYS_ADMIN 在内的 Linux capabilities(权能)。仅在需要诊断的宿主机上部署。生成的命令或清单包含私钥;请妥善保管,不要将其附加到支持工单中。
部署诊断代理
在控制台中打开 Diagnostic Agents,选择 Add Diagnostic Agent,然后选择与网关宿主机匹配的部署方式。
Docker
-
选择 Docker。
-
将 Control Plane Address 设置为代理容器能够访问的 DP Manager TLS URL,包含
https://协议和端口。 -
将 Name 设置为便于识别宿主机的名称。将下文所有 Docker 命令中的
<agent-container>替换为此名称。可以按需将 Image 设置为已批准的 ngxdig 镜像,并选择 Certificate Validity Period。 -
选择 Generate,将完整命令保存到私有文件中,例如
diagnostic-agent.sh。 -
在网关所在的同一 Docker 宿主机上运行生成的命令:
chmod 700 diagnostic-agent.shbash diagnostic-agent.sh
命令包含 --pid host、Linux capabilities 和 mTLS 凭据。请保留这些设置。该命令不会发布代理端口。
如果 DP Manager 地址使用 Docker Compose 服务名,请在生成的 docker run 选项中、镜像名称之前添加 --network <control-plane-network>。例如,使用 https://dp-manager:7943 的代理必须加入能够解析 dp-manager 的网络。代理容器内的 localhost 指的是该容器,而不是 Docker 宿主机。
检查代理日志:
docker logs <agent-container> --tail=50
连接成功时会报告 session established。返回 Diagnostic Agents,等待状态变为 Online,然后选择 Open Console。
在诊断结果中记录已安装工具的版本和镜像标识:
docker exec <agent-container> ngxdig version
docker inspect <agent-container> --format '{{.Image}}'
Kubernetes
首先查找网关 Pod 所在的节点:
kubectl -n <gateway-namespace> get pod <gateway-pod> -o wide
在 Add Diagnostic Agent 中选择 Kubernetes,并设置:
- Control Plane Address:代理 Pod 能够访问的 DP Manager TLS URL。
- Node Name:上一步查询到的网关 Pod 所在节点。
- Namespace:已存在且准入策略允许生成的宿主机 PID 访问和 Linux capabilities 的命名空间。
- 按需设置 Name、Image 和 Certificate Validity Period。
选择 Generate,将完整清单保存为 diagnostic-agent.yaml。清单包含一个 Secret 和一个固定到所选节点的 Pod,不会在每个节点上部署代理。
应用清单并检查生成的 Pod,使用之前输入的命名空间和名称:
chmod 600 diagnostic-agent.yaml
kubectl apply -f diagnostic-agent.yaml
kubectl -n <agent-namespace> get pod <agent-pod> -o wide
kubectl -n <agent-namespace> logs <agent-pod> --tail=50
确认网关和代理位于同一节点。返回 Diagnostic Agents,在代理变为 Online 后选择 Open Console。如需检查其他节点,请为每个节点分别部署代理。如果网关迁移到另一个节点,请选择或部署该节点上的代理。
CPU 性能分析需要使用代理能够看到宿主机 PID 命名空间的宿主机或虚拟机。kind 或 k3d 等嵌套容器节点的 PID 命名空间与内核的初始命名空间不同,不适合此 CPU 性能分析流程。代理显示 Online 仅表示已连接控制面,不代表能够采集 CPU 样本。
每次执行 Generate 都会签发新证书并创建独立的代理身份。再次生成不会替换或停止先前的部署。请保留部署文件,以便管理实际安装的容器或 Pod。
选择网关工作进程
诊断终端会列出可见进程的 PID、角色、主进程 PID、CPU 使用率、RSS 和运行时长。请从待排查的网关中选择一个 worker。
对于 Docker,使用以下命令识别网关在宿主机上的进程 ID:
docker top <gateway-container> -eo pid,ppid,args
将这些进程 ID 与终端中的进程匹配。docker exec <gateway-container> ps 显示的 PID 位于容器命名空间中,可能不同于代理显示的宿主机 PID。具有相同主进程 PID 的工作进程属于同一个 NGINX 实例。不要仅因为某个进程是宿主机上最繁忙的进程,就选中另一个网关。
对于 CPU 问题,选择 CPU 使用率高的受影响工作进程。对于内存问题,先选择 RSS 较高或持续增长的工作进程。网关重启或重新加载后,工作进程 ID 可能变化,请刷新进程列表。
在进行 CPU 性能分析之前,检查采集环境:
# Docker
docker exec <agent-container> ngxdig doctor
# Kubernetes
kubectl -n <agent-namespace> exec <agent-pod> -- ngxdig doctor
解决 CPU 采集检查中失败的项目后再继续。BTF 或 eBPF 检查失败本身不会阻止采集内存快照。
采集 CPU 性能分析
在 CPU 问题发生时进行采集。在测试 部署中,采集期间应持续通过现有路由发送具有代表性的流量。几乎空闲的工作进程可能无法通过 CPU 预检,或产生的样本过少。
- 在诊断终端中选择目标工作进程。
- 在 Run Diagnostic 下,将 Command 设置为
cpu-on。 - 首次采集时,将 Duration seconds 设置为
30、Hz 设置为100、CPU profile level 设置为 C + Kernel。 - 将 Format 设置为
html,然后选择 Run。 - 等待运行状态变为 succeeded,然后打开其 HTML 产物或选择 Download all。
报告包含 CPU 火焰图和采集质量信息。较宽的栈帧表示在该次采集中占据更多样本;横轴不是时间轴。沿较宽的调用栈定位 CPU 时间的消耗位置,并在得出结论前检查未解析的栈帧和质量警告。
即使运行成功,报告仍可能显示 Degraded 状态或 Low 质量。例如,受限的内核符号或不完整的原生栈展开会导致部分性能分析无法解析。请保留这些警告,不要将未解析的样本归因于某个具体函数。
终端将 C + Kernel + Lua 和 Lua only 标记为实验性选项。调查 Lua 执行时可以使用这些选项,并保留报告中的覆盖率和质量信息。缺少 Lua 栈帧不能证明 Lua 未消耗 CPU。
需要结构化 CPU 证据 JSON 时,选择 evidence 而不是 html。这会生成 JSON 产物而不是 HTML 报告。请下载 JSON,以供离线分析或技术支持使用。
一个代理一次只能运行一项采集。请等待当前运行结束后,再启动下一项。