核心逻辑
1. 读的文件:/sys/fs/cgroup/neon-postgres/memory.stat
2. 取的字段:active_anon + inactive_anon(cgroup.rs:168)
3. 不是瞬时值,而是最近 5 个样本(500ms)的平均值(cgroup.rs:113-117)
4. 阈值:总内存 ×(1 - 0.15) = 总内存的 85%(runner.rs:99-105)
5. 比较:当 avg_non_reclaimable >= threshold 时触发(runner.rs:416)
触发后的动作
向 agent 发送 UpscaleRequest 消息(runner.rs:446),不是直接扩容,而是请求。实际是否扩容由 agent 决定。
防抖机制
两次 UpscaleRequest 之间至少间隔 1 秒(runner.rs:423-432),否则会静默跳过。
一个关键区别
你说的 inactive_anon + active_anon 是对的,但注意 memory.stat 里的值是字节数,不是 MB。vm-monitor 读出来后不做转换,直接相加比较。
总结流程图
memory.stat →active_anon + inactive_anon
↓
每 100ms 采样一次,保留最近 5 个样本
↓
计算 5 个样本的平均值 avg_non_reclaimable
↓
avg_non_reclaimable >= 总内存 ×0.85 ?
↓是
发送 UpscaleRequest 给 agent(至少间隔 1 秒)