暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何查看每个数据库的内存使用情况

恩恩霸 2025-07-19
114

在 PostgreSQL 里没有一个现成的「数据库级内存表」;所有内存(shared_buffers、进程私有内存、临时文件)都是**进程级或实例级**管理的。
因此想「看每个数据库用了多少内存」必须**自己把进程级数据按数据库维度做聚合**。下面给出 3 条最实用的脚本/命令,一分钟就能落地。

------------------------------------------------
1. shared_buffers 中各数据库缓存了多少页
------------------------------------------------
```sql
CREATE EXTENSION IF NOT EXISTS pg_buffercache;

SELECT datname,
count(*) AS buffers,
pg_size_pretty(count(*) * 8192) AS buffered
FROM pg_buffercache b
JOIN pg_database d ON b.reldatabase = d.oid
GROUP BY datname
ORDER BY buffered DESC;
```
• 结果直接显示每个数据库在 shared_buffers 中占用的字节数。
• 8192 是默认 8 kB 页大小,如用 32 kB 页请相应修改。

------------------------------------------------
2. 当前活跃连接在各数据库上的**进程级内存**
(RSS、共享、私有)
------------------------------------------------
Linux 上一条命令即可:
```bash
# 需要 root 或 sudo
sudo smem -p -k -r | awk '
/^postgres:/ {sub("postgres: ","",$1); db=$1; rss=$3; priv=$5}
db && $0 ~ /^[0-9]/ {rss+=$5; priv+=$7}
END {
printf "%-15s %8s %8s\n","Database","RSS","Private";
for (d in rss) printf "%-15s %8s %8s\n",d,rss[d],priv[d]
}'
```
输出示例:
```
Database RSS Private
myapp 1.2G 890M
postgres 256M 60M
template0 12M 4M
```
说明:
- RSS = 物理占用;Private = 不共享的脏/匿名页,更能代表“真正吃掉”的内存。
- 也可以用 `ps_mem` 或 `pmap` 手动脚本,思路一样。

------------------------------------------------
3. 临时文件(排序 / hash spill)按数据库聚合
------------------------------------------------
```sql
-- 先确认已开启 log_temp_files
-- SHOW log_temp_files; -- 0 表示全部记录

-- 假设日志格式为 csvlog 或 stderr,用如下查询解析
SELECT datname,
count(*) AS temp_files,
pg_size_pretty(sum(size)) AS total_size
FROM (
SELECT datname,
(regexp_matches(message, 'temporary file: size (\d+)'))[1]::bigint AS size
FROM pg_log_dir
WHERE message LIKE '%temporary file%'
) t
GROUP BY datname
ORDER BY total_size DESC;
```
(如用标准日志目录 `log_directory`,可用 `file_fdw` 或 `pg_read_file()` 把日志映射为表再分析。)

------------------------------------------------
小结
- shared_buffers 缓存:用 `pg_buffercache` 直接查。
- 进程级 RSS / 私有内存:用 `smem` 或 `ps_mem` 按 `datname` 聚合。
- 临时文件:打开 `log_temp_files` 后解析日志。
把三块数据拼在一起,就能拿到「每个数据库真实占用的内存」全景图。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论