[Bug] PostgreSQL 会话活动查询运行了几分钟,并饱和了带大事件 数据表的CPU
作者: bocheems82-cpu创建于 2026年9月9日更新于 2026年9月10日
描述臭虫
□ 总结
2026-09-09日,我们调查了一起生产PostgreSQL CPU事件,并将CPU持续消费追踪到Ummi的PostgreSQL的"Get Session Activity"查询. 打开会话配置文件可运行此查询几分钟 。 两次同时处决在一次有控制的复制中消耗了大约两个CPU核心.
问题在于每个事件的“hasData”旗与一个网站/全站“IN”(SELECT网站 event id from event data.)的“子克勒克勒克” 由于默认的 4 MB 工作 mem 和我们的数据分布, PostgreSQL 选择了相继扫描+物质化而不是散列子计划. 使用已存在的事件 data website event id idx的关联EXISTS回避了这个计划,并且速度明显快.
还有一个令人惊讶的UI扩展:事件页面被设定为最后24小时,但点击一个会话avatar请求使用会话的第一个At/LastAt进行大约**20天的会话活动。 列表的短日期范围因此无法保护此查询扫描范围要大得多.
□ 环境和数据尺度
- 运行时间确认的Umami版本:3.2.0,从运行的容器中的/app/package.json读取。 图片:ghcr.io/umami-software/umami:latest,已经运行了大约五个星期. 标记名称没有用来推断运行时的版本 。
- 自行托管的Docker,通过1个小组管理;PostgreSQL后端,本部署中没有ClickHouse/读取复制.
- PostgreSQL 16.14,pgvector/pgvector:pg16图像;Linux x86 64.
- 主机:4 vCPUs,约15个GiB RAM. PostgreSQL的cGroup没有配置CPU配额.
- 初始设置: work mem=4MB, hash mem multimplier=2, share buffers=128MB, max connections=100; 没有角色/数据库语句超时.
- 来自PostgreSQL统计的近似行数:事件-数据688万,网站-活动44.3万. 这些是估计数,而不是确切的COUNT(*)结果。
- 事件 数据总关系大小,包括索引:约1.7 GiB。
- 相关的索引已经存在:事件 data(website event id),事件 data(website id,创建 at)和网站 event(website id,会话 id,创建 at).
□ 事件序列和撞击
- 我们最初观察到一个仪表板CPU读取率100%,PostgreSQL资源使用率很高。
- 检查pg stat 活性发现两个同Umami会话-活性SQL的例子,已经执行约6m22s和5m18s。 它们活跃,没有报道等待事件,也没有阻塞PID. 与单独的主应用程序数据库的大多数连接都是闲置的。
- 在静悄悄的窗口中,我们用有限度的、只读的测试复制了询问:一次处决,然后是两次同时处决,并有15秒的陈述暂停。 所有原始处决都到了暂停时间。
- 每个过程CPU计数器显示,一个核心的约100.8%用于一次处决,**98.4%/98.5%用于两次同时处决。 CPU 迅速坠落 . . . . . . .
内容来源: umami-software/umami