在 Debian + PostgreSQL 环境中进行优化,通常从 系统层、数据库配置、SQL 与索引、硬件与监控 四个方面入手。下面给你一套实用、可落地的优化指南(适用于 Debian 10/11/12,PostgreSQL 12–16)。
编辑 /etc/sysctl.conf 或 /etc/sysctl.d/99-postgresql.conf:
# 共享内存
kernel.shmmax = 17179869184
kernel.shmall = 4194304
# 网络
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 文件句柄
fs.file-max = 2097152
应用:
sysctl -p
编辑 /etc/security/limits.conf:
postgres soft nofile 65536
postgres hard nofile 65536
确认:
su - postgres
ulimit -n
配置文件位置(Debian 常见):
/etc/postgresql/15/main/postgresql.conf
# 物理内存的 25% 左右
shared_buffers = 2GB
# 用于排序、哈希等
work_mem = 16MB
# 维护操作(VACUUM、CREATE INDEX)
maintenance_work_mem = 512MB
# 磁盘缓存(通常设为 shared_buffers 的 4 倍)
effective_cache_size = 8GB
经验公式(16GB 内存示例):
- shared_buffers ≈ 25%
- effective_cache_size ≈ 75%
- work_mem 根据并发数调整
wal_buffers = 16MB
checkpoint_timeout = 15min
max_wal_size = 2GB
min_wal_size = 512MB
减少频繁 checkpoint:
checkpoint_completion_target = 0.9
max_connections = 200
⚠️ 高并发建议配合 pgbouncer
random_page_cost = 1.1 # SSD
seq_page_cost = 1.0
Debian 安装:
apt install pgbouncer
示例 /etc/pgbouncer/pgbouncer.ini:
[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb
[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 50
CREATE INDEX idx_user_status ON users(status, created_at);
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 1;
关注:
SELECT *LIKE '%abc'VACUUM ANALYZE;
或自动:
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.05
CREATE TABLE orders (
id serial,
created_at date
) PARTITION BY RANGE (created_at);
SELECT * FROM pg_stat_activity;
SELECT * FROM pg_stat_statements;
启用 pg_stat_statements:
shared_preload_libraries = 'pg_stat_statements'
/var/log/postgresql/postgresql-15-main.log
如果你愿意,可以告诉我:
我可以给你一套 针对你环境的精确参数配置。