外观
PostgreSQL 操作系统优化
CPU 优化
1. CPU 调度策略
- 优化目标:提高 PostgreSQL 进程的 CPU 优先级,减少上下文切换开销
- 配置方法:bash
# 查看当前 CPU 调度策略 chrt -p <postgres_pid> # 将 PostgreSQL 主进程设置为实时调度策略 chrt -f -p 50 <postgres_pid> # 或者在启动 PostgreSQL 时设置调度策略 chrt -f 50 postgres -D /var/lib/postgresql/15/main
2. CPU 亲和性
- 优化目标:将 PostgreSQL 进程绑定到特定 CPU 核心,减少跨 NUMA 节点访问
- 配置方法:bash
# 使用 taskset 将进程绑定到特定 CPU 核心 taskset -c 0-3,8-11 <postgres_pid> # 或者在 PostgreSQL 配置文件中设置 # postgresql.conf # wal_writer_cpu_affinity = 0,1 # bgwriter_cpu_affinity = 2,3 # autovacuum_max_workers = 4 # autovacuum_work_mem = 2GB
3. NUMA 优化
- 优化目标:解决 NUMA 架构下的内存访问不平衡问题
- 配置方法:bash
# 安装 numactl yum install numactl -y # 查看 NUMA 节点信息 numactl --hardware # 使用 numactl 启动 PostgreSQL,绑定到特定 NUMA 节点 numactl --interleave=all postgres -D /var/lib/postgresql/15/main # 或者在系统层面关闭 NUMA 平衡 echo 0 > /proc/sys/kernel/numa_balancing
内存优化
1. 内存分配策略
- 优化目标:提高内存分配效率,减少内存碎片
- 配置方法:bash
# 查看当前内存分配策略 cat /proc/sys/vm/overcommit_memory # 设置内存过度提交策略为 2(推荐) echo 2 > /proc/sys/vm/overcommit_memory echo "vm.overcommit_memory = 2" >> /etc/sysctl.conf # 设置过度提交比例 echo 90 > /proc/sys/vm/overcommit_ratio echo "vm.overcommit_ratio = 90" >> /etc/sysctl.conf
2. 内存回收策略
- 优化目标:减少不必要的内存回收,提高系统响应速度
- 配置方法:bash
# 调整脏页回写阈值 echo 10 > /proc/sys/vm/dirty_background_ratio echo "vm.dirty_background_ratio = 10" >> /etc/sysctl.conf echo 30 > /proc/sys/vm/dirty_ratio echo "vm.dirty_ratio = 30" >> /etc/sysctl.conf # 调整脏页回写延迟 echo 3000 > /proc/sys/vm/dirty_writeback_centisecs echo "vm.dirty_writeback_centisecs = 3000" >> /etc/sysctl.conf
3. 大页内存
- 优化目标:减少 TLB miss,提高内存访问效率
- 配置方法:bash
# 查看大页支持情况 grep -i huge /proc/meminfo # 启用透明大页 echo always > /sys/kernel/mm/transparent_hugepage/enabled echo always > /sys/kernel/mm/transparent_hugepage/defrag # 或者配置静态大页 echo 1024 > /proc/sys/vm/nr_hugepages echo "vm.nr_hugepages = 1024" >> /etc/sysctl.conf
文件系统优化
1. 文件系统选择
- 推荐文件系统:
- XFS:适合大文件、高并发场景,是 PostgreSQL 的推荐文件系统
- EXT4:稳定性好,适合中小规模部署
- Btrfs:支持快照和校验,适合需要高级功能的场景
2. 文件系统挂载选项
优化目标:提高文件系统性能和可靠性
配置方法:
bash# 编辑 /etc/fstab,添加挂载选项 UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /var/lib/postgresql xfs defaults,noatime,nodiratime,allocsize=16m 0 2 # 重新挂载文件系统 mount -o remount /var/lib/postgresql关键挂载选项说明:
noatime:不更新文件访问时间,减少 I/O 操作nodiratime:不更新目录访问时间,减少 I/O 操作allocsize=16m:XFS 文件系统预分配块大小,适合大文件barrier=0:关闭写屏障,提高性能(需确保存储设备有电池备份缓存)data=writeback:EXT4 文件系统使用回写模式,提高性能
3. 磁盘调度器
- 优化目标:根据存储设备类型选择合适的 I/O 调度器
- 配置方法:bash
# 查看当前磁盘调度器 cat /sys/block/sda/queue/scheduler # 对于 SSD 设备,使用 none 或 mq-deadline 调度器 echo none > /sys/block/sda/queue/scheduler # 对于机械硬盘,使用 cfq 或 deadline 调度器 echo deadline > /sys/block/sda/queue/scheduler # 永久设置调度器 echo "ACTION==\"add|change\", KERNEL==\"sd*\", ATTR{queue/scheduler}="none"" > /etc/udev/rules.d/60-scheduler.rules
内核参数优化
1. 网络相关参数
- 优化目标:提高网络性能,支持更多并发连接
- 配置方法:bash
# 调整 TCP 缓冲区大小 echo 4096 16777216 16777216 > /proc/sys/net/ipv4/tcp_rmem echo 4096 16777216 16777216 > /proc/sys/net/ipv4/tcp_wmem echo "net.ipv4.tcp_rmem = 4096 16777216 16777216" >> /etc/sysctl.conf echo "net.ipv4.tcp_wmem = 4096 16777216 16777216" >> /etc/sysctl.conf # 启用 TCP 窗口缩放 echo 1 > /proc/sys/net/ipv4/tcp_window_scaling echo "net.ipv4.tcp_window_scaling = 1" >> /etc/sysctl.conf # 调整 TIME_WAIT 端口回收 echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse echo "net.ipv4.tcp_tw_recycle = 1" >> /etc/sysctl.conf echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf # 调整文件描述符限制 echo "* soft nofile 65536" >> /etc/security/limits.conf echo "* hard nofile 65536" >> /etc/security/limits.conf
2. I/O 相关参数
- 优化目标:提高 I/O 性能,减少 I/O 等待
- 配置方法:bash
# 调整最大 I/O 队列长度 echo 1024 > /proc/sys/fs/aio-max-nr echo "fs.aio-max-nr = 1024" >> /etc/sysctl.conf # 调整文件句柄数量 echo 65536 > /proc/sys/fs/file-max echo "fs.file-max = 65536" >> /etc/sysctl.conf # 调整磁盘预读大小 blockdev --setra 8192 /dev/sda
3. 其他关键参数
- 优化目标:提高系统整体性能和稳定性
- 配置方法:bash
# 禁用内存过度使用 echo 2 > /proc/sys/vm/overcommit_memory echo "vm.overcommit_memory = 2" >> /etc/sysctl.conf # 调整 SWAP 使用率阈值 echo 10 > /proc/sys/vm/swappiness echo "vm.swappiness = 10" >> /etc/sysctl.conf # 调整脏页回写参数 echo 10 > /proc/sys/vm/dirty_background_ratio echo 30 > /proc/sys/vm/dirty_ratio echo "vm.dirty_background_ratio = 10" >> /etc/sysctl.conf echo "vm.dirty_ratio = 30" >> /etc/sysctl.conf
进程管理优化
1. 进程优先级
- 优化目标:提高 PostgreSQL 进程的优先级,确保关键进程获得足够资源
- 配置方法:bash
# 使用 nice 命令调整进程优先级 nice -n -10 postgres -D /var/lib/postgresql/15/main # 或者在启动脚本中设置 # /etc/systemd/system/postgresql.service [Service] Nice=-10 OOMScoreAdjust=-1000
2. OOM 杀手配置
- 优化目标:防止 PostgreSQL 进程被 OOM 杀手杀死
- 配置方法:bash
# 查看当前 OOM 分数 cat /proc/<postgres_pid>/oom_score_adj # 设置 OOM 分数调整值,降低被杀死的概率 echo -1000 > /proc/<postgres_pid>/oom_score_adj # 或者在系统服务文件中设置 # /etc/systemd/system/postgresql.service [Service] OOMScoreAdjust=-1000
日志系统优化
1. 减少日志 I/O 开销
- 优化目标:减少系统日志对 PostgreSQL 性能的影响
- 配置方法:bash
# 调整 rsyslog 配置,减少日志写入频率 # /etc/rsyslog.conf $ActionWriteAllMarkMessages on $WriteAllMarkMessagesInterval 3600 # 或者使用 journald 的内存模式 # /etc/systemd/journald.conf Storage=volatile RuntimeMaxUse=100M
2. 配置日志轮转
- 优化目标:防止日志文件过大,影响系统性能
- 配置方法:bash
# 配置 PostgreSQL 日志轮转 # /etc/logrotate.d/postgresql /var/log/postgresql/*.log { daily rotate 7 compress delaycompress missingok notifempty create 0640 postgres postgres sharedscripts postrotate /bin/kill -HUP $(cat /var/run/postgresql/15-main.pid 2>/dev/null) 2>/dev/null || true endscript }
常见优化案例
案例 1:SSD 存储优化
问题:使用 SSD 存储时,I/O 性能未达到预期
优化配置:
bash
# 设置 SSD 专用调度器
echo none > /sys/block/sda/queue/scheduler
# 优化文件系统挂载选项
# /etc/fstab
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /var/lib/postgresql xfs defaults,noatime,nodiratime,allocsize=16m,barrier=0 0 2
# 调整内核参数
echo 10 > /proc/sys/vm/swappiness
echo 2 > /proc/sys/vm/overcommit_memory效果:I/O 延迟降低 50%,查询响应时间缩短 30%
案例 2:高并发场景优化
问题:高并发场景下,系统连接数不足,响应缓慢
优化配置:
bash
# 调整文件描述符限制
echo "* soft nofile 100000" >> /etc/security/limits.conf
echo "* hard nofile 100000" >> /etc/security/limits.conf
# 调整网络参数
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 4096 16777216 16777216 > /proc/sys/net/ipv4/tcp_rmem
echo 4096 16777216 16777216 > /proc/sys/net/ipv4/tcp_wmem
# 调整 PostgreSQL 配置
# postgresql.conf
max_connections = 2000
shared_buffers = 8GB
work_mem = 4MB效果:系统支持并发连接数从 500 提升到 2000,CPU 利用率从 80% 降低到 50%
案例 3:NUMA 架构优化
问题:NUMA 架构下,内存访问延迟高,系统性能不稳定
优化配置:
bash
# 安装 numactl
yum install numactl -y
# 使用 numactl 启动 PostgreSQL
numactl --interleave=all postgres -D /var/lib/postgresql/15/main
# 调整 PostgreSQL 配置
# postgresql.conf
shared_buffers = 16GB
effective_cache_size = 32GB
work_mem = 8MB效果:查询响应时间波动减少 70%,系统吞吐量提升 25%
操作系统优化最佳实践
根据硬件类型调整配置:
- SSD 设备:使用 none 调度器,关闭写屏障
- 机械硬盘:使用 deadline 调度器,调整预读大小
- NUMA 架构:使用 numactl 绑定内存和 CPU
逐步优化,持续监控:
- 每次只调整一个参数,观察效果
- 使用监控工具(如 Prometheus、Grafana)跟踪性能变化
- 建立性能基准,便于对比优化效果
考虑安全与性能的平衡:
- 关闭写屏障可以提高性能,但会增加数据丢失风险
- 调整 SWAP 使用率阈值时,需确保系统有足够内存
- 优化网络参数时,需考虑安全防护
定期更新系统和内核:
- 及时安装系统补丁和内核更新
- 新内核版本通常包含性能优化和 bug 修复
- 测试新内核后再部署到生产环境
根据负载类型调整配置:
- OLTP 场景:优化 CPU 和内存,减少延迟
- OLAP 场景:优化 I/O 和文件系统,提高吞吐量
- 混合负载:平衡各项资源配置
常见问题(FAQ)
Q1: 如何确定 PostgreSQL 进程的 CPU 使用率过高?
A1: 可以使用以下命令监控 PostgreSQL 进程的 CPU 使用率:
bash
# 实时监控 PostgreSQL 进程
top -p $(pgrep -d ',' postgres)
# 查看 CPU 使用率统计
mpstat -P ALL 1
# 分析进程 CPU 使用情况
pidstat -u -p <postgres_pid> 1Q2: 如何优化 PostgreSQL 在虚拟机环境中的性能?
A2: 虚拟机环境下的 PostgreSQL 优化建议:
- 确保虚拟机分配足够的 CPU 和内存资源
- 使用 paravirtualized 驱动(如 virtio)
- 关闭不必要的虚拟机功能(如动态内存调整)
- 调整虚拟机的 I/O 调度器和磁盘缓存设置
- 考虑使用裸金属虚拟化或容器化部署
Q3: 如何调整 Linux 系统的最大文件描述符限制?
A3: 可以通过以下步骤调整文件描述符限制:
- 编辑
/etc/security/limits.conf文件,添加:* soft nofile 65536 * hard nofile 65536 - 编辑
/etc/sysctl.conf文件,添加:fs.file-max = 65536 - 执行
sysctl -p使配置生效 - 重启 PostgreSQL 服务
Q4: 如何选择合适的文件系统挂载选项?
A4: 文件系统挂载选项的选择取决于存储设备类型和使用场景:
- 对于 SSD 设备:使用
noatime,nodiratime,allocsize=16m,barrier=0 - 对于机械硬盘:使用
noatime,nodiratime,barrier=1 - 对于需要高可靠性的场景:保留
barrier=1 - 对于性能敏感的场景:可以关闭
barrier(需确保存储设备有电池备份缓存)
Q5: 如何优化 Linux 系统的网络性能?
A5: Linux 系统网络性能优化建议:
- 调整 TCP 缓冲区大小(tcp_rmem, tcp_wmem)
- 启用 TCP 窗口缩放(tcp_window_scaling)
- 调整 TIME_WAIT 端口回收(tcp_tw_recycle, tcp_tw_reuse)
- 增加最大文件描述符限制
- 调整网络队列长度
- 使用高性能网络驱动(如 Intel ixgbe、mlx5)
Q6: 如何防止 PostgreSQL 进程被 OOM 杀手杀死?
A6: 可以通过以下方法降低 PostgreSQL 进程被 OOM 杀手杀死的概率:
- 设置合理的内存配置,避免过度分配
- 调整
vm.overcommit_memory和vm.overcommit_ratio参数 - 降低系统的
swappiness值 - 设置 PostgreSQL 进程的 OOM 分数调整值(oom_score_adj)
- 在系统服务文件中添加
OOMScoreAdjust=-1000配置
Q7: 如何监控 Linux 系统的性能?
A7: 常用的 Linux 系统性能监控工具:
- top/htop:实时监控进程和系统资源
- vmstat:监控虚拟内存、进程、I/O 等
- iostat:监控磁盘 I/O 性能
- sar:收集、报告和保存系统活动信息
- netstat/ss:监控网络连接和统计信息
- numastat:监控 NUMA 架构下的内存访问
- Prometheus + Grafana:开源监控解决方案,提供可视化展示
Q8: 如何优化 Linux 系统的 SWAP 性能?
A8: SWAP 性能优化建议:
- 降低
vm.swappiness值(建议 10-20),减少不必要的 SWAP 使用 - 使用高速存储设备(如 SSD)作为 SWAP 分区
- 考虑使用 zswap 或 zram 压缩内存,减少 SWAP I/O
- 确保 SWAP 分区大小合理(通常为物理内存的 1-2 倍)
- 监控 SWAP 使用情况,避免频繁换页
Q9: 如何调整 Linux 内核的 I/O 调度器?
A9: 可以使用以下命令调整 I/O 调度器:
bash
# 查看当前可用的调度器
cat /sys/block/sda/queue/scheduler
# 设置调度器
echo <scheduler_name> > /sys/block/sda/queue/scheduler
# 永久设置调度器
echo "ACTION==\"add|change\", KERNEL==\"sd*\", ATTR{queue/scheduler}="<scheduler_name>"" > /etc/udev/rules.d/60-scheduler.rulesQ10: 如何优化 Linux 系统的 CPU 性能?
A10: CPU 性能优化建议:
- 调整 CPU 调度策略和优先级
- 配置 CPU 亲和性,减少跨 NUMA 节点访问
- 启用 CPU 节能模式(如 intel_pstate)
- 调整 CPU 频率,根据负载动态调整
- 优化应用程序代码,减少 CPU 密集型操作
