运行诊断
运行诊断
功能简介
当 SamWaf 出现 CPU 或内存占用偏高时,「运行诊断」可以从 SamWaf 进程自身视角查看资源占用构成(区别于整机监控),并支持一键导出诊断包发给开发者协助定位问题。观测常驻部分(每 10 秒一次轻量采样)对性能无感知,深度采集均为手动触发。
前置条件
- 仅系统管理员角色可见和使用,且需通过后台登录(开放平台 API Key 无法访问该功能)。
操作步骤
进入 系统管理 → 运行诊断,页面包含五个标签页:
1. 整机监控
与原「系统监控」一致:整机 CPU、内存、磁盘使用情况。用于先判断"是整机资源紧张,还是 SamWaf 自身占用高"。
2. SamWaf 进程
点击「刷新」采集一次当前进程快照:
| 卡片 | 内容 |
|---|---|
| 进程资源 | PID、运行时长、进程CPU、常驻内存(RSS)、虚拟内存、线程数、文件句柄、C侧内存(估算) |
| Go运行时 | Goroutines、GOMAXPROCS/CPU、堆活对象、堆使用中、堆空闲、栈占用、Go申请总量、GC次数、GC累计暂停、上次GC |
| 数据库体量 | 核心/日志/统计数据库文件大小 |
C侧内存(估算)
即「常驻内存 − Go申请总量」的差值,主要来自 SQLite 缓存等 C 侧开销。此值偏大时通常与数据库体量、写入压力相关,而非 Go 程序泄漏。
3. 内部组件
展示 SamWaf 内部各组件的实时计量:数据库写队列长度、内部通道占用、缓存条目数、WebSocket 在线数、WAF 引擎对象数(主机/证书/端口等)。
数据库写队列出现堆积时,数值会以黄色(>500)/红色(>5000)高亮,并在顶部提示"内存可能随之上涨,请关注日志库写入是否缓慢"。
4. 趋势
每 10 秒采样一次,保留最近 1 小时(仅存内存,重启后清空)。折线图包含四条曲线:进程CPU%、内存RSS(MB)、Goroutines、日志队列,可回答"占用是什么时候、以什么方式涨上去的"。
5. 诊断包
- CPU采样(可选):持续 30 秒记录 CPU 耗时分布,可定位到具体代码行。点击后需二次确认;采样期间按钮显示进度,约 30 秒完成;5 分钟内只能发起一次。采样结果会自动纳入之后下载的诊断包。
- 生成并下载诊断包:一键下载 zip,内含版本信息、实时快照、1 小时趋势、goroutine 栈、内存分布(及已完成的 CPU 采样),发给开发者即可协助定位资源占用问题。
诊断包隐私说明
诊断包不包含密码、Token、证书私钥及任何业务请求数据,只有运行指标与程序调用栈信息,可放心发送。
字段说明
| 字段 | 说明 |
|---|---|
| 进程CPU | SamWaf 进程的 CPU 使用率(多核环境下可超过 100%) |
| 常驻内存(RSS) | 进程实际占用的物理内存 |
| Go申请总量 | Go 运行时向操作系统申请的内存总量 |
| C侧内存(估算) | RSS 与 Go 申请总量的差值,主要为 SQLite 等 C 侧占用 |
| 堆活对象 / 堆使用中 / 堆空闲 | Go 堆内存的构成明细 |
| Goroutines | 当前并发协程数,持续上涨通常代表泄漏或阻塞 |
| 数据库写队列 | 待写入数据库的排队条数,持续堆积说明写库速度跟不上 |
常见问题
Q:打开这个页面会影响生产环境性能吗?
不会。常驻的只有每 10 秒一次的轻量采样(微秒级);快照/趋势在点击时才采集且毫秒级返回;只有手动发起的 30 秒 CPU 采样会带来轻微开销,页面上有明确提示与二次确认。
Q:整机 CPU 高但"SamWaf进程"标签页里 CPU 不高?
说明占用来自服务器上的其它进程,与 SamWaf 无关,请从整机层面排查。
Q:什么时候下载诊断包最有价值?
问题正在发生时。趋势只保留最近 1 小时,重启后清空;CPU 类问题建议先点一次「发起CPU采样」,等 30 秒完成后再下载诊断包。
