温馨提示×

centos怎样调postgresql性能

小樊
43
2026-09-18 12:46:44
栏目: 云计算

在 CentOS 上调优 PostgreSQL 性能,通常从系统层、数据库配置、硬件与文件系统、SQL与索引、监控几个方面入手。下面给你一套比较实用、可落地的方案(以 CentOS 7/8 + PostgreSQL 12/13/14 为例,其他版本类似)。


一、系统层优化(CentOS)

1. 关闭或调整透明大页(THP)

PostgreSQL 不推荐 THP:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

永久生效:

vi /etc/rc.local
# 加入上面两行
chmod +x /etc/rc.local

2. 内核参数优化

编辑 /etc/sysctl.conf:

# 共享内存
kernel.shmmax = 68719476736
kernel.shmall = 16777216

# 文件句柄
fs.file-max = 1000000

# 网络
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1

# 交换
vm.swappiness = 10
vm.overcommit_memory = 2
vm.overcommit_ratio = 90

生效:

sysctl -p

3. 文件描述符限制

/etc/security/limits.conf:

postgres soft nofile 100000
postgres hard nofile 100000

二、PostgreSQL 核心参数调优

配置文件一般在:

/var/lib/pgsql/<版本>/data/postgresql.conf

1. 内存相关(最重要)

shared_buffers = 25% 内存   # 如 8G 内存设 2G
effective_cache_size = 50%-75% 内存
work_mem = 16MB ~ 64MB      # 复杂查询多可加大
maintenance_work_mem = 512MB ~ 2GB

2. 写入性能

wal_buffers = 16MB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
max_wal_size = 4GB
min_wal_size = 1GB

3. 并发与连接

max_connections = 200 ~ 500
superuser_reserved_connections = 10

⚠️ 连接太多用 pgbouncer 更合适


三、文件系统与磁盘

1. 文件系统

推荐使用:

  • XFS(CentOS 默认,稳定)
  • 挂载选项:
defaults,noatime,nodiratime

2. 磁盘分离(高并发场景)

  • WAL 和数据目录分开磁盘
  • SSD / NVMe 最佳

四、SQL 与索引优化

1. 查看慢查询

SELECT * FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

开启:

shared_preload_libraries = 'pg_stat_statements'
CREATE EXTENSION pg_stat_statements;

2. 索引建议

  • 大表必须建索引
  • 联合索引注意顺序
  • 定期:
VACUUM ANALYZE;

五、定期维护

VACUUM (VERBOSE, ANALYZE);
REINDEX TABLE table_name;

可配置 autovacuum:

autovacuum = on
autovacuum_vacuum_scale_factor = 0.1

六、监控工具(强烈推荐)

  • pg_stat_activity
  • pg_stat_statements
  • pgBadger(日志分析)
  • Prometheus + Grafana + postgres_exporter

七、快速参考(示例:16G 内存)

shared_buffers = 4GB
effective_cache_size = 12GB
work_mem = 32MB
maintenance_work_mem = 1GB
max_connections = 300

如果你愿意,可以告诉我:

  • CentOS 版本
  • PostgreSQL 版本
  • 内存 / CPU / 磁盘
  • 主要场景(OLTP / 报表 / 写入多)

我可以直接帮你出一份可用配置。

0 踩