先泼盆冷水:PostgreSQL 没有“标准配置”,只有“负载特征”。
你问这个问题,就像问“买多大的车适合拉货”——是拉两箱矿泉水,还是拉两吨钢材?这决定了你是买五菱宏光还是重型卡车。
在云服务器上部署 PG,内存和 CPU 的分配逻辑完全不同。别被云厂商的“推荐实例”忽悠了,咱们从底层原理拆解。
一、 核心原则:内存是 PG 的灵魂,CPU 是 PG 的肌肉
1. 内存(RAM):决定你能跑多快
PG 最吃内存的地方在于 Shared Buffers(共享缓冲区)和 OS Cache。
- 黄金法则:将系统总内存的 75%-80% 分配给 PostgreSQL 使用(主要是
shared_buffers+ OS Cache)。 - 为什么?
- PG 大部分查询优化依赖于数据已经在内存中。如果热点数据都在内存里,I/O 几乎为零,速度提升是数量级的。
- 如果内存太小,PG 频繁发生磁盘 I/O,再强的 CPU 也救不回来。
- 配置建议:
- 小型项目/开发测试:2GB – 4GB。够用,但并发高时会卡顿。
- 中型生产环境:8GB – 16GB。这是性价比最高的区间,能容纳百万级行数的热数据。
- 大型核心库:32GB+。此时重点不是堆内存,而是看你的工作集(Working Set)大小。如果你的数据量超过内存,必须依赖 SSD 和优秀的索引设计,否则内存再多也是浪费。
注意:不要给
shared_buffers设得过大(比如超过物理内存的 25%),剩下的内存留给操作系统做 Page Cache。Linux 内核的缓存效率极高,很多时候比 PG 自己的 buffer 更灵活。
2. CPU:决定并发处理能力
CPU 主要影响两个场景:
- 复杂查询执行:排序、哈希连接、聚合计算。
- 高并发连接:每个连接都需要一个进程或线程来调度。
- 核心数选择:
- 单核 vs 多核:PG 是进程模型(传统)或混合模型。单核性能强,但无法利用并行查询。多核可以开启
max_parallel_workers_per_gather,让一个大查询拆成多个子任务同时跑。 - 频率 vs 核心数:对于 OLTP(在线事务处理,如电商下单),高主频更重要;对于 OLAP(分析型,如报表统计),多核心更重要。
- 单核 vs 多核:PG 是进程模型(传统)或混合模型。单核性能强,但无法利用并行查询。多核可以开启
- 配置建议:
- 低并发 IO 密集型:2-4 核足够。瓶颈通常在磁盘读写。
- 高并发或复杂计算:8-16 核起步。
- 极端并发:超过 16 核后,收益递减明显,且上下文切换开销变大。这时候不如考虑分库分表或使用 Citus 等分布式方案。
二、 三种典型场景的配置模板
别猜了,直接对号入座:
场景 A:个人博客、内部工具、日活 < 1000
- CPU:2 vCPU
- 内存:4 GB
- 硬盘:SSD(必需,机械盘会死得很惨)
- 理由:成本优先。这个配置下,只要 SQL 写得不太烂,完全扛得住。内存给 4G,PG 用 2G,剩下 2G 给 OS 绰绰有余。
场景 B:中小型 SaaS 应用、电商后台、日活 1万~10万
- CPU:4-8 vCPU
- 内存:16 GB
- 硬盘:高性能云盘 / NVMe SSD
- 理由:这是最常见的生产环境。16G 内存可以缓存大量热点数据,减少磁盘 I/O。4-8 核保证在处理复杂订单查询时不会阻塞其他请求。记得调整
work_mem和maintenance_work_mem。
场景 C:大数据量分析、高并发交易核心、日活 > 50万
- CPU:16+ vCPU(建议选高主频实例,如 AWS r6i/g6i 类)
- 内存:32 GB – 64 GB+
- 硬盘:本地 NVMe 或极致 IOPS 云盘
- 理由:此时内存用于缓存数十亿行数据,CPU 用于并行处理海量聚合。需要精细调优:
effective_cache_size、random_page_cost、huge_pages等参数都要根据实际压测结果调整。
三、 避坑指南(血泪经验)
-
别迷信“大内存”:
如果你只有 100 万条数据,却买了 128G 内存的服务器,那是纯浪费。先估算你的数据体积。通常,热数据量 <= 内存容量的 70% 是最理想状态。如果热数据远超内存,加内存没用,得优化索引或架构。 -
CPU 核数不是越多越好:
很多新手喜欢买 32 核机器,结果发现 TPS(每秒事务数)没上去,反而因为锁竞争和上下文切换变慢。PG 在高并发下,锁机制是瓶颈。如果 CPU 占用率长期低于 50%,说明瓶颈不在计算,而在 I/O 或锁等待。 -
Swap 是毒药:
在 Linux 上运行 PG,务必关闭 Swap 或设置极低的 swappiness 值。一旦 PG 进程被换出到磁盘,响应时间会从毫秒级跳到秒级甚至分钟级,导致服务假死。 -
监控先行:
上云之前,先装好pg_stat_statements扩展和 Prometheus + Grafana。- 看
pg_stat_activity:有没有长时间运行的空闲事务? - 看
top命令:CPU 是 user 态高(计算忙)还是 system/iowait 高(IO 忙)? - 看
vmstat:内存是否被 swap 占用?
- 看
四、 最终建议
第一步:算数据量。
假设你的表有 1000 万行,平均每行 1KB,总大小约 10GB。
- 如果这些数据都是“热”的(经常查),你需要至少 16GB 内存才能全部塞进 Shared Buffers + OS Cache。
- 如果只有 10% 是热的,那么 4GB 内存就够了。
第二步:定预算,选实例。
- 追求性价比:选通用型实例(如阿里云 g7、腾讯云 S5),内存/CPU 比例 4:1 或 8:1。
- 追求极致性能:选内存优化型(如阿里云 r7、AWS R6i),内存占比更高。
第三步:压测。
用 pgbench 模拟你的真实业务场景,观察 CPU 和内存使用率。
- 如果 CPU 满载但内存空闲 → 增加 CPU 核数。
- 如果内存满载且 I/O 高 → 增加内存。
- 如果两者都低但响应慢 → 检查 SQL 语句和索引,或者网络延迟。
记住:没有最好的配置,只有最适合当前负载的配置。 云服务器的好处就是弹性,先从小配开始,根据监控数据横向扩展(Scale Out)或纵向升级(Scale Up)。
云计算HECS