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
相关产品推荐
相关产品推荐

