如何统计每个PG进程的真实内存消耗?
如何统计每个PG进程的真实内存消耗?
PG是进程模型的数据库, 如何统计每个进程的内存开销? 例如你想进行精确的内存控制?
可以看看这个插件
https://github.com/bonesmoses/pg_meminfo
pg_meminfo插件可以统计PostgreSQL每个进程的内存消耗, 数据来源为Linux操作系统对每个PID的smaps的统计信息, 所以目前这个插件仅支持Linux下的PostgreSQL, 如果是其他操作系统恐怕要先阅读一下相关的系统文档, 看看有没有类似的统计信息可获取.
pg_meminfo 介绍
该开源项目 pg_meminfo 是一个 Postgres 扩展,专门用于解决“如何获取每个 Postgres 后端进程(backend)当前实际占用的物理内存”这一问题。传统上,这类需求只能通过诸如 cat /proc/4242/smaps | grep Pss | awk '{total += $2} END {print total}' 这样的命令行组合来实现,使用起来既繁琐又不便于与数据库数据联动。pg_meminfo 让你可以直接在 SQL 层面获取同样的信息,大大提升了易用性和集成性。
它的核心方法是:遍历当前 Postgres 实例下的每个后端进程,解析其 /proc/[pid]/smaps 文件,提取和聚合各内存区段的详细指标(如 PSS, RSS, Swap 等),并将这些数据通过扩展函数暴露为 SQL 视图和函数。底层解析和聚合逻辑使用了 C 语言实现,并充分利用 Postgres 的扩展 API 以及高效的内存分配机制。
主要特性与用法如下:
安装与初始化
git clone [email protected]:bonesmoses/pg_meminfo.git
cd pg_meminfo
make
sudo make install
然后在数据库中执行:
CREATE EXTENSION pg_meminfo;
核心能力
提供 get_all_smaps() 函数:返回每个后台进程每个内存区域的详细指标(仅超级用户或 pg_read_all_stats 角色可用)。 提供 smap_summary 视图:以 PID 为单位,聚合各内存区域的指标,更适合诊断和监控。
使用举例
假设你想查询 pid 为 4242 的 Postgres 后端进程的 PSS 内存占用,直接在 SQL 层操作:
SELECT pss FROM smap_summary WHERE pid = 4242;
这样,你无需再通过操作系统命令行、awk、grep 等工具链,就能高效获得数据库各后台进程的物理内存使用详情,非常适合数据库运维人员进行性能诊断与资源监控。
总结:pg_meminfo 极大简化了 Postgres 各进程内存占用的获取与分析流程,并为进一步的自动化诊断与监控提供了便利的数据接口。
注意,pg_meminfo 扩展仅适用于 Linux 操作系统。
原因如下:
该扩展通过读取 /proc/[pid]/smaps 文件来获取内存信息,而 /proc 文件系统和 smaps 文件是 Linux 系统特有的功能。 在源码和文档中明确说明:“This function ONLY works on Linux systems!”(详见 meminfo.h 和 README.md)。 如果在非 Linux 系统上使用,会直接报错,拒绝运行。
也就是说,pg_meminfo 不能在 Windows、macOS 或其他类 Unix 系统(如 FreeBSD)上使用,只能在 Linux 上部署和使用。