You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 10启动报could not map anonymous shared memory错误求助

PostgreSQL 10 共享内存启动故障排查方案

1 优先检查内核内存分配策略参数

首先验证Linux内核内存 overcommit 配置,这是EC2实例上最容易被忽略的隐性限制:

  • 执行 sysctl vm.overcommit_memory 查看当前配置值
    • 若值为2,内核会严格拒绝超过总物理内存+swap总和的内存分配请求,PostgreSQL启动时的预分配逻辑极易触发该限制,可临时调整为1测试:sysctl -w vm.overcommit_memory=1,确认可启动后写入/etc/sysctl.conf永久生效
    • 同步检查vm.swappiness参数,若值为0,也会导致内核在预分配大段连续内存时直接拒绝,可临时调整为10验证

2 检查大页(Huge Pages)配置

报错提示中明确提及大页相关可能性,EC2实例的虚拟化层会额外占用部分大页资源,需重点排查:

  • 执行 grep Huge /proc/meminfo 查看当前大页配置
    • 若HugePages_Total大于0,计算大页总内存:HugePages_Total * Hugepagesize,确认该值大于PostgreSQL请求的5.5GB共享内存
    • 若使用透明大页(THP),部分低版本内核会导致匿名共享内存分配失败,可临时关闭测试:echo never > /sys/kernel/mm/transparent_hugepage/enabled

3 检查PostgreSQL服务的cgroup内存限制

主流EC2系统镜像默认启用systemd cgroup资源限制,PostgreSQL服务可能被默认设置了内存上限:

  • 查看对应服务的内存限制:systemctl show postgresql@10-main.service | grep MemoryLimit
  • 若返回值小于6G,修改服务配置,新建/etc/systemd/system/postgresql@10-main.service.d/override.conf文件,添加如下内容:
[Service]
MemoryLimit=infinity
  • 重载systemd配置后再尝试启动:systemctl daemon-reload

4 排查数据目录迁移残留问题

你提到回滚默认配置仍无法启动,大概率和数据目录迁移后的异常状态有关:

  • 检查数据目录下是否残留postmaster.pid文件,若对应进程已不存在,手动删除该文件后重试
  • 确认数据目录权限属主为postgres:postgres、权限值为700:chown -R postgres:postgres 你的数据目录路径 && chmod 700 你的数据目录路径
  • 确认/etc/postgresql/10/main/postgresql.conf中的data_directory参数和实际迁移后的数据目录路径完全匹配

5 清理残留共享内存段

lsipc默认展示的是全局统计值,可能未显示postgres用户专属的残留共享内存段,切换到postgres用户执行清理:

su - postgres
ipcs -m | awk '/postgres/ {print $2}' | xargs -r ipcrm -m

内容的提问来源于stack exchange,提问作者Federico Loro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:45:03