温馨提示×

centos为何postgresql占内存高

小樊
40
2026-09-12 07:48:28
栏目: 云计算

在 CentOS 上,PostgreSQL 占用内存高通常不是“内存泄漏”,而是其本身设计就是“能占多少占多少”,再加上 CentOS 环境常见的一些配置和使用习惯。下面按原因 → 解释 → 解决建议说明。


一、PostgreSQL 内存使用的正常构成(先别慌)

PostgreSQL 内存主要分为:

  1. ** shared_buffers(共享缓冲区)**

    • 默认通常是 128MB
    • 但很多人会调到 25%–40% 内存
  2. ** wal_buffers**

    • WAL 日志缓存
  3. ** work_mem(每个查询/排序/哈希)**

    • ⚠️ 每个连接、每个操作都可能单独占用
    • 并发高时非常容易“爆内存”
  4. ** maintenance_work_mem**

    • 用于 VACUUM、CREATE INDEX
  5. ** 操作系统文件系统缓存(OS Cache)**

    • PostgreSQL 读的数据会被 Linux 缓存
    • free -h 看到的“used”很高,很多是 OS Cache

✅ 结论:

PostgreSQL 看起来吃内存,很多时候是“Linux 缓存 + 配置偏大”


二、CentOS 上 PostgreSQL 内存高的常见原因

1️⃣ shared_buffers 设置过大(最常见)

shared_buffers = 4GB

如果服务器只有 8G 内存,这就已经很激进。

✅ 建议:

shared_buffers = 25% 内存

2️⃣ work_mem 设置不合理(隐形内存杀手)

work_mem = 64MB

如果有:

  • 100 个连接
  • 每个连接 5 个排序

那就是:

100 × 5 × 64MB = 32GB

✅ 建议:

work_mem = 4MB ~ 16MB

3️⃣ 连接数过多(CentOS + pg + 应用直连)

  • 默认 max_connections = 100~500
  • 每个连接都有固定内存开销

✅ 建议:

  • 使用 连接池(pgbouncer)
  • max_connections 控制在 100 以内更稳

4️⃣ 没开 huge pages / 内存碎片

PostgreSQL 在大内存下:

  • 不开 huge pages
  • 会导致页表占用大量内存

✅ CentOS 建议:

sysctl -w vm.nr_hugepages=XXXX

5️⃣ 表/索引未维护(VACUUM 缺失)

  • 死元组多
  • 查询变慢
  • 内存和 IO 同时升高

✅ 解决:

VACUUM ANALYZE;

或开启 autovacuum(默认开)


6️⃣ 你看到的是“假高”(Linux 缓存)

free -h

如果:

buff/cache 很高
available 还很多

✅ 这是正常的,不是 PostgreSQL 泄漏


三、快速判断 PostgreSQL 是否“真吃内存”

1️⃣ 看 PostgreSQL 实际用多少

SELECT
  pg_size_pretty(sum(allocated_bytes)) 
FROM pg_stat_activity;

或:

ps aux --sort=-rss | head

2️⃣ 看配置是否合理

SHOW shared_buffers;
SHOW work_mem;
SHOW max_connections;

四、CentOS 上推荐的基础配置(示例 8G 内存)

shared_buffers = 2GB
work_mem = 8MB
maintenance_work_mem = 512MB
max_connections = 100

并配合:

  • pgbouncer
  • 定期 VACUUM

五、一句话总结

CentOS 上 PostgreSQL 内存高,90% 是因为:shared_buffers + work_mem + 连接数 + Linux 缓存,而不是 bug。

如果你愿意,可以贴:

  • free -h
  • postgresql.conf 关键参数
  • 内存大小 & 版本

我可以帮你精准算一遍该调多少。

0 踩