Postgres默认进程内存占用持续增长不释放问题咨询
结论
Postgres默认常驻后台进程内存持续上涨至1.5GB且无释放不属于正常现象,你已经排除了C#应用连接泄漏的可能性,该问题基本可以定位为Postgres配置或Docker运行环境适配问题。
常见问题诱因
- 共享内存参数配置不合理:
shared_buffers设置值过高,或者Docker宿主内核的共享内存相关参数(shmmax/shmall)适配错误,会导致Postgres常驻进程持续占用过量共享内存,且不会主动释放 - 自动清理(autovacuum)逻辑异常:如果库内存在大量频繁更新的表,autovacuum进程持续处理死元组时如果没有配置合理的内存上限,会出现内存占用持续攀升的情况
- 统计信息收集进程异常:Postgres内置的stats collector进程如果积累了过多未清理的历史统计快照,也会出现类似内存泄漏的表现
- Docker运行环境适配问题:如果启动容器时没有配置明确的内存上限,或者cgroup内存统计机制和Postgres的内存管理逻辑存在冲突,也会出现内存占用持续上涨的误报或实际泄漏
排查及优化建议
- 核对核心内存配置:登录数据库执行
show shared_buffers;查看共享缓冲区配置,常规建议该值设置为容器可用内存的25%即可,最高不要超过可用内存的50% - 限制自动清理资源占用:执行
show autovacuum_work_mem;查看自动清理的内存上限,可根据业务情况调整为64MB或更低,同时调整autovacuum_vacuum_cost_delay参数降低自动清理的执行频率 - 验证统计进程内存占用:业务低峰期执行
SELECT pg_stat_reset();清理历史统计信息,观察常驻进程内存是否出现明显下降,如果下降明显可定期执行该操作释放内存 - 给Docker容器增加明确内存限制:启动容器时增加
--memory=2G --memory-swap=2G参数,避免Postgres无限制占用系统内存 - 排查版本已知问题:如果你使用的是Postgres 12、13的早期小版本,存在官方确认的后台进程内存泄漏bug,建议升级到对应大版本的最新稳定小版本

内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

