速卖通素材
奋斗

在2核4G的Linux服务器上搭建PostgreSQL需要注意什么?

服务器

在 2 核 4G(约 2 vCPU + 4GB RAM)的 Linux 服务器上部署 PostgreSQL,核心挑战在于资源受限下的性能与稳定性平衡。若配置不当,极易因内存溢出导致 OOM Killer 杀死数据库进程。以下是关键注意事项及优化建议:


🔒 一、内存管理(最关键!)

PostgreSQL 默认配置(如 shared_buffers)可能过高,需手动调优:

参数 推荐值(4G 总内存) 说明
shared_buffers 1GB ~ 1.5GB 占物理内存 25%~37%,严禁超过 2GB
work_mem 64MB ~ 128MB 每个查询操作临时内存;若并发高,设为 64MB 更安全
maintenance_work_mem 256MB ~ 512MB VACUUM/CREATE INDEX 专用,可略高于 work_mem
effective_cache_size 2.5GB ~ 3GB 告知 planner 系统缓存可用量(含 OS page cache),设得高些有助于优化执行计划
wal_buffers 16MB ~ 32MB 默认即可,无需大幅调整

安全原则
shared_buffers + (max_connections × work_mem) + maintenance_work_mem + OS 预留 ≈ ≤ 3.5GB
⚠️ 务必为 OS 和 Swap 预留至少 0.5GB。

📌 检查当前连接数:SHOW max_connections;(默认 100,建议降至 50~80)


⚙️ 二、Swap 空间设置(防崩溃关键)

即使有 Swap,也避免频繁使用(影响性能),但必须存在以防突发负载:

# 创建 2GB Swap(推荐 ≥ 物理内存 50%)
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 永久生效
echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab

# 调整 Swappiness(降低 Swap 倾向)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

💡 监控命令:free -hvmstat 1 观察 si/so 是否持续非零。


🛡️ 三、安全与访问控制

  • 禁用远程 root 登录PermitRootLogin no in /etc/ssh/sshd_config
  • 限制 PG 监听地址listen_addresses = 'localhost' 或指定内网 IP
  • pg_hba.conf 精细化:仅允许必要 IP 段,认证方式优先用 md5scram-sha-256
  • 启用防火墙ufw allow from <app-server-ip> to any port 5432

📈 四、性能监控与日志

  • 开启详细日志(开发/测试环境):
    log_min_duration_statement = 100ms   # 记录慢查询
    log_checkpoints = on
    log_lock_waits = on
  • 使用工具监控:
    • pg_stat_activity 查活跃会话
    • pg_stat_bgwriter 看写入压力
    • iostat -x 1 观察磁盘 I/O
    • top / htop 实时看内存/CPU

🧩 五、其他实践建议

  • 版本选择:推荐 PostgreSQL 14+(性能优化更好,如并行查询改进)
  • 扩展插件:按需安装(如 pg_partman 分区管理),避免预装无用模块
  • 备份策略:结合 pg_basebackup + WAL 归档,或定时 pg_dump
  • 容器化? ❌ 不推荐 Docker 运行 DB(I/O 开销大、调试难),除非资源充足且明确需求
  • 自动重启:配置 systemd 服务并设置 Restart=always,防止宕机后无响应

✅ 快速自检清单

# 1. 检查内存分配合理性
psql -c "SHOW shared_buffers;" 
psql -c "SHOW work_mem;"

# 2. 验证 Swap 状态
free -h && cat /proc/sys/vm/swappiness

# 3. 查看当前连接数
psql -c "SELECT count(*) FROM pg_stat_activity;"

# 4. 测试慢查询捕获
psql -c "SET log_min_duration_statement = 100ms;"

只要合理控制内存参数 + 保留足够 Swap + 严格限制连接数,2 核 4G 完全可以稳定支撑中小型业务(如日活万级以下的 Web 应用、内部系统)。初期建议先用 pgbench 做基准压测,再根据实际负载微调。需要具体 postgresql.conf 模板我可提供一份。

未经允许不得转载:轻量云Cloud » 在2核4G的Linux服务器上搭建PostgreSQL需要注意什么?