waits:等待事件
此刻在干活的会话在等什么,扎堆最多的在前。
采集于 2026-09-27(UTC+08),本地 KingbaseES V008R006C009B0014 主节点和备节点,数据库 test。工具是 Go 版源码提交 93bf65d 编译的 ~/kbdiag(linux/amd64 静态二进制)。这是测试环境实测,不代表生产环境验收。示例里的会话是故障注入脚本造出来的:两个 idle in transaction 的会话、两个在等表锁的会话、一个 pg_sleep(3600)。PID、计数与时间只属于本次采样。
用法
没有自己的参数。连接参数和 sessions 相同。
默认输出
not idle把在干活的会话按等待事件和状态分组,sessions是个数,pids列出是哪些。人数最多的组在前,因为要找的就是扎堆;人数相同时active在前。Lock:relation:两个会话在等表锁;谁挡的、等了多久看locks。Client:ClientRead加idle in transaction:会话开着事务,在等客户端发下一条语句。Timeout:PgSleep是注入的pg_sleep。active 却没有等待事件的会话写(running):在 CPU 上,或者这段代码没有埋点。pids最多列 10 个,其余写... (+N),--json里是全的。not shown给不列出来的计数:idle的会话不回答"卡在哪";后台进程在主循环里空闲(任何Activity类等待,比如没东西可发的 walsender、两次 checkpoint 之间的 checkpointer)也不回答。后台进程卡在真正的等待上(比如 checkpointer 等IO:DataFileSync)照样列出,状态写(background)。
没有阈值,也没有参数:同样是 10 个会话等 IO,对一个库是事故,对另一个库是常态,所以 waits 只报告不判定。等锁太久由 locks 判。
空闲的主库:
主库忙的时候,追赶中的 walsender 可能以 IO:WALRead 之类的等待出现,属正常。
在备库上
权限不足
用没有监控角色的 kbdiag_ro 连接:
- 别的用户的会话看不到等待事件和状态,不知道是不是 idle,所以计成
hidden (state unknown),不算作 idle。关了track_activities的会话出于同样原因计成untracked (state unknown)。 - 有看不到的会话,kbdiag 就不能说没人在等,所以结论是 UNKNOWN,退出码 3。授予
sys_monitor后可以看全。
JSON
--json 包含所有分组(包括 idle 和后台进程的),PID 列表是全的:wait_event_type、wait_event、state、sessions、pids。
退出码
| 退出码 | 含义 |
|---|---|
| 0 | OK |
| 3 | UNKNOWN:数据没采到或看不到 |
| 64 | 用法错误 |
| 69 | 连不上数据库 |