在 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 -h、vmstat 1观察si/so是否持续非零。
🛡️ 三、安全与访问控制
- 禁用远程 root 登录:
PermitRootLogin noin/etc/ssh/sshd_config - 限制 PG 监听地址:
listen_addresses = 'localhost'或指定内网 IP - pg_hba.conf 精细化:仅允许必要 IP 段,认证方式优先用
md5或scram-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/Otop/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