温馨提示×

centos怎么优化postgresql

小樊
52
2026-09-06 12:17:55
栏目: 云计算

在 CentOS 上优化 PostgreSQL,通常可以从系统层面、数据库配置、硬件与文件系统、运维监控几个方面入手。下面给你一套比较实用、可落地的优化思路(以 CentOS 7/8 + PostgreSQL 12/13/14 为例)。


一、系统层面优化(CentOS)

1. 关闭或调整 SELinux(按需)

getenforce
# 如果是 Enforcing,可临时关闭
setenforce 0
# 永久关闭(生产谨慎)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

2. 防火墙与连接数

确保 PostgreSQL 端口(默认 5432)开放:

firewall-cmd --add-port=5432/tcp --permanent
firewall-cmd --reload

3. 内核参数优化(重要)

编辑 /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

生效:

sysctl -p

4. 文件描述符限制

/etc/security/limits.conf

postgres soft nofile 65536
postgres hard nofile 65536

二、文件系统与磁盘优化

1. 推荐文件系统

  • XFS(推荐)
  • 挂载选项:
mount -o noatime,nodiratime /dev/sdb /var/lib/pgsql

2. 磁盘分离(重要)

  • 数据目录:/var/lib/pgsql
  • WAL 日志:单独磁盘
  • 临时文件(temp_tablespaces):单独磁盘

三、PostgreSQL 核心参数优化

配置文件位置(以 RPM 安装为例):

/var/lib/pgsql/14/data/postgresql.conf

1. 内存相关(最关键)

shared_buffers = 25% ~ 40% 内存
work_mem = 16MB ~ 64MB(复杂查询可调大)
maintenance_work_mem = 512MB ~ 1GB
effective_cache_size = 50% ~ 75% 内存

示例(32GB 内存):

shared_buffers = 8GB
effective_cache_size = 24GB
work_mem = 32MB
maintenance_work_mem = 1GB

2. WAL 与写入优化

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 = 5

⚠️ 连接数过高建议配合 PgBouncer

4. 查询优化器

random_page_cost = 1.1   # SSD
seq_page_cost = 1.0
default_statistics_target = 100

四、数据库维护优化

1. 定期 VACUUM & ANALYZE

VACUUM ANALYZE;

或配置自动清理:

autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.05

2. 索引优化

  • 避免冗余索引
  • 大表使用 BRIN / 分区表
  • 热点查询建 覆盖索引

五、使用连接池(强烈推荐)

PgBouncer

yum install pgbouncer

模式建议:

  • transaction 模式(Web 应用)

六、监控与调优工具

1. 系统监控

top
iostat -x 1
vmstat 1

2. PG 内部监控

SELECT * FROM pg_stat_activity;
SELECT * FROM pg_stat_statements;

启用:

shared_preload_libraries = 'pg_stat_statements'

七、常见性能问题速查

问题 可能原因
CPU 高 缺少索引 / 慢 SQL
IO 高 checkpoint 频繁
内存爆 work_mem 过大
连接满 没用连接池

八、示例:通用优化配置(16G 内存)

shared_buffers = 4GB
effective_cache_size = 12GB
work_mem = 16MB
maintenance_work_mem = 512MB
max_connections = 200
wal_buffers = 16MB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9

如果你能告诉我:

  • CentOS 版本
  • PostgreSQL 版本
  • 内存 / CPU / 磁盘类型(SSD?)
  • 业务类型(OLTP / 报表 / 混合)

我可以直接给你一套可复制的配置文件

0