在 Debian 上运行 PostgreSQL 时,“占用内存高”通常并不是内存泄漏,而是 PostgreSQL 的设计机制。下面按常见原因逐一说明,并给出判断与优化建议。
shared_buffersPostgreSQL 会用一块专用共享内存来缓存表和索引数据。
shared_buffers = 2GB
如果你有 8G 内存,PostgreSQL 会“常驻”约 2G 用于缓存。
✅ 这是正常现象
只要系统在用,内存不会被立刻释放,用于提高查询性能。
查看:
SHOW shared_buffers;
Debian 使用 Linux 的 page cache:
free -h 中显示“used”很高示例:
free -h
total used free shared buff/cache available
Mem: 16Gi 12Gi 1.5Gi 2.0Gi 2.5Gi 3Gi
✅ buff/cache 是可以被系统回收的
work_mem(每操作、每连接)work_mem = 4MB
以下操作会用到:
⚠️ 如果一个查询有 10 个排序操作 + 100 个连接:
100 × 10 × 4MB = 4GB
maintenance_work_mem用于:
可能临时占用很大内存。
PostgreSQL 是进程模型:
常见配置:
max_connections = 100
实际生产建议:
长事务会导致:
查看:
SELECT pid, state, age(clock_timestamp(), query_start), query
FROM pg_stat_activity
WHERE state <> 'idle'
ORDER BY 3 DESC;
以下情况说明可能有问题:
排查命令:
ps aux --sort=-rss | head
shared_buffers = 2GB
work_mem = 4MB
max_connections = 50
effective_cache_size = 6GB
PostgreSQL 在 Debian 上“内存高”大多是缓存和连接造成的,不是 Bug,而是设计使然。
如果你愿意,可以贴:
free -hpostgresql.conf 内存相关参数我可以帮你精确分析是不是“正常占用”还是“需要优化”。