在 CentOS 上,PostgreSQL 占用内存高通常不是“内存泄漏”,而是其本身设计就是“能占多少占多少”,再加上 CentOS 环境常见的一些配置和使用习惯。下面按原因 → 解释 → 解决建议说明。
PostgreSQL 内存主要分为:
** shared_buffers(共享缓冲区)**
128MB25%–40% 内存** wal_buffers**
** work_mem(每个查询/排序/哈希)**
** maintenance_work_mem**
** 操作系统文件系统缓存(OS Cache)**
free -h 看到的“used”很高,很多是 OS Cache✅ 结论:
PostgreSQL 看起来吃内存,很多时候是“Linux 缓存 + 配置偏大”
shared_buffers = 4GB
如果服务器只有 8G 内存,这就已经很激进。
✅ 建议:
shared_buffers = 25% 内存
work_mem = 64MB
如果有:
那就是:
100 × 5 × 64MB = 32GB
✅ 建议:
work_mem = 4MB ~ 16MB
max_connections = 100~500✅ 建议:
max_connections 控制在 100 以内更稳PostgreSQL 在大内存下:
✅ CentOS 建议:
sysctl -w vm.nr_hugepages=XXXX
✅ 解决:
VACUUM ANALYZE;
或开启 autovacuum(默认开)
free -h
如果:
buff/cache 很高
available 还很多
✅ 这是正常的,不是 PostgreSQL 泄漏
SELECT
pg_size_pretty(sum(allocated_bytes))
FROM pg_stat_activity;
或:
ps aux --sort=-rss | head
SHOW shared_buffers;
SHOW work_mem;
SHOW max_connections;
shared_buffers = 2GB
work_mem = 8MB
maintenance_work_mem = 512MB
max_connections = 100
并配合:
CentOS 上 PostgreSQL 内存高,90% 是因为:shared_buffers + work_mem + 连接数 + Linux 缓存,而不是 bug。
如果你愿意,可以贴:
free -hpostgresql.conf 关键参数我可以帮你精准算一遍该调多少。