PostgreSQL 占用内存“高”通常是正常现象,也可能是配置或 usage 问题。下面按原因 → 判断方法 → 解决办法来说明。
PostgreSQL 内存主要分为几部分:
共享内存(Shared Memory)
shared_buffers:缓存表和索引数据wal_buffers:WAL 日志缓冲每个连接私有内存
work_mem:排序、哈希、聚合maintenance_work_mem:VACUUM、建索引操作系统文件缓存(OS Cache)
连接数本身
shared_buffers = 8GB
✅ 建议:
shared_buffers = 25% 物理内存
比如:
work_mem = 64MB理论峰值:
1000 × 64MB = 64GB
✅ 解决:
work_memwork_mem = 256MB
✅ 建议:
work_mem = 4MB ~ 16MB
ORDER BYGROUP BYDISTINCT会大量使用 work_mem 和临时文件
✅ 优化:
SELECT * FROM pg_stat_activity
WHERE state = 'idle in transaction';
✅ 解决:
SELECT * FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
✅ 解决:
VACUUM ANALYZE;
free -h
buff/cache 高 ≠ 内存泄漏✅ 这是正常的
SELECT
pg_size_pretty(sum(backend_memory))
FROM pg_stat_activity;
或更实用:
ps aux --sort=-rss | head
shared_buffers = 25% RAM
work_mem = 4MB
max_connections = 100
maintenance_work_mem = 512MB
连接多 → 一定上 PgBouncer
PostgreSQL 内存高,大多不是 bug,而是: shared_buffers 大 + 连接多 + work_mem 高 + 没连接池
如果你愿意,可以贴:
postgresql.conf 内存相关配置free -h 输出我可以帮你精确算哪里吃内存。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。