PostgreSQL12 walwriter等进程占131GB内存 如何安全释放或强制完成任务
内存占用误解说明
你观测到的walwriter、background writer、checkpointer进程占用131GB内存属于共享内存重复统计,并非进程实际独占的内存资源:
- 你配置的
shared_buffers为128GB,这是PostgreSQL所有进程共用的共享内存段,htop、pg_top等工具统计进程内存时,会将每个进程关联的共享内存段大小计入进程内存,才会出现多个进程均显示占用131GB的情况,实际上这段共享内存全系统仅存储一份 - 从pg_top的监控数据可以看到,这几个后台进程的实际驻留内存仅4KB~11MB,完全没有占用过量内存,不存在需要清理的内存占用
释放内存用于Nominatim导入的方案
方案1:临时停掉PostgreSQL释放全部共享内存(无运行中业务时推荐)
如果当前没有其他任务需要使用PostgreSQL,直接停止服务即可释放全部128GB的shared_buffers内存,等Nominatim导入完成后再启动服务即可,操作命令:
# 停止PostgreSQL 12主服务 systemctl stop postgresql@12-main # Nominatim导入完成后执行启动命令 systemctl start postgresql@12-main
操作前可先执行一次手动检查点,将所有内存脏页落盘,避免停止服务时等待过久:
CHECKPOINT;
方案2:保持PostgreSQL运行,临时调小shared_buffers
如果需要持续提供PostgreSQL服务,可以修改PostgreSQL配置文件中的shared_buffers参数,下调到32GB或其他合适值,重启服务后即可释放多余的共享内存,等Nominatim导入完成后再改回128GB即可。
注意事项
- 绝对不要手动kill walwriter、background writer、checkpointer这几个PostgreSQL核心后台进程,操作会直接触发PostgreSQL实例崩溃,严重时会导致数据损坏
- 你当前系统有253GB的页缓存,这部分内存由操作系统自动调度,应用申请内存时会优先自动释放,实际可分配给Nominatim的内存远大于当前显示的16GB空闲值
- 你观测到几个进程处于睡眠状态属于正常情况,说明当前没有待处理的WAL写入、脏页刷盘任务,无需强制触发操作
内容的提问来源于stack exchange,提问作者Paul Toone
相关产品推荐
相关产品推荐

