在 CentOS 上调优 PostgreSQL 性能,通常从系统层、数据库配置、硬件与文件系统、SQL与索引、监控几个方面入手。下面给你一套比较实用、可落地的方案(以 CentOS 7/8 + PostgreSQL 12/13/14 为例,其他版本类似)。
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
编辑 /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
/etc/security/limits.conf:
postgres soft nofile 100000
postgres hard nofile 100000
配置文件一般在:
/var/lib/pgsql/<版本>/data/postgresql.conf
shared_buffers = 25% 内存 # 如 8G 内存设 2G
effective_cache_size = 50%-75% 内存
work_mem = 16MB ~ 64MB # 复杂查询多可加大
maintenance_work_mem = 512MB ~ 2GB
wal_buffers = 16MB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
max_wal_size = 4GB
min_wal_size = 1GB
max_connections = 200 ~ 500
superuser_reserved_connections = 10
⚠️ 连接太多用 pgbouncer 更合适
推荐使用:
defaults,noatime,nodiratime
SELECT * FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
开启:
shared_preload_libraries = 'pg_stat_statements'
CREATE EXTENSION pg_stat_statements;
VACUUM ANALYZE;
VACUUM (VERBOSE, ANALYZE);
REINDEX TABLE table_name;
可配置 autovacuum:
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
pg_stat_activitypg_stat_statementspgBadger(日志分析)Prometheus + Grafana + postgres_exportershared_buffers = 4GB
effective_cache_size = 12GB
work_mem = 32MB
maintenance_work_mem = 1GB
max_connections = 300
如果你愿意,可以告诉我:
我可以直接帮你出一份可用配置。