为什么麒麟信创系统需要开启overcommit_memory才能安装postgresql成功
sudo sysctl -w vm.overcommit_memory=1
sudo sysctl -w vm.max_map_count=262144
参数详解
1. vm.overcommit_memory=1
含义:
控制 Linux 内核如何处理内存分配请求。
三个可选值:
- 0(默认):启发式overcommit,内核会评估是否有足够内存,可能拒绝明显过大的请求
- 1:总是允许 overcommit,永远不拒绝内存分配请求
- 2:严格控制,不允许 overcommit,只能分配物理内存+swap的总量
为什么能解决你的问题:
- PostgreSQL 的
initdb在初始化时需要 fork 子进程 - 当设置为 0 时,内核可能认为系统"可能"没有足够内存,拒绝了 fork 操作
- 设置为 1 后,内核总是允许内存分配,fork 操作成功
- 你的系统虽然有 6GB+ 可用内存,但内核的启发式算法误判了
2. vm.max_map_count=262144
含义:
限制一个进程可以拥有的内存映射区域(memory map areas)的最大数量。
默认值: 通常是 65530
为什么需要调整:
- PostgreSQL、Elasticsearch 等数据库需要大量的内存映射
- 默认值 65530 可能不够用
- 调整到 262144 是常见的推荐值
如何永久保存这些设置
临时设置重启后会失效,需要永久保存:
# 编辑 sysctl 配置文件
cat >> /etc/sysctl.conf << EOF# PostgreSQL 优化参数
vm.overcommit_memory=1
vm.max_map_count=262144
EOF# 使配置生效
sysctl -p# 验证设置
sysctl vm.overcommit_memory
sysctl vm.max_map_count
为什么你的系统会遇到这个问题?
根本原因:
- 麒麟信创 的内核配置比较保守,
overcommit_memory默认是 0 - PostgreSQL 初始化时需要 fork 进程,内核错误地认为内存不足而拒绝
这些设置的影响
优点:
✅ 允许应用程序正常分配内存
✅ 适合内存充足的系统
✅ 提高数据库性能
推荐的完整优化配置
# 添加到 /etc/sysctl.conf
cat >> /etc/sysctl.conf << EOF# ===== PostgreSQL 性能优化 =====
# 内存 overcommit 设置
vm.overcommit_memory=1
vm.overcommit_ratio=50# 内存映射区域数量
vm.max_map_count=262144# 共享内存设置(根据你的 6GB 内存)
kernel.shmmax=2147483648
kernel.shmall=524288# 减少 swap 使用
vm.swappiness=10
EOF# 应用配置
sysctl -p
