Skip to content

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%

操作系统优化最佳实践

  1. 根据硬件类型调整配置

    • SSD 设备:使用 none 调度器,关闭写屏障
    • 机械硬盘:使用 deadline 调度器,调整预读大小
    • NUMA 架构:使用 numactl 绑定内存和 CPU
  2. 逐步优化,持续监控

    • 每次只调整一个参数,观察效果
    • 使用监控工具(如 Prometheus、Grafana)跟踪性能变化
    • 建立性能基准,便于对比优化效果
  3. 考虑安全与性能的平衡

    • 关闭写屏障可以提高性能,但会增加数据丢失风险
    • 调整 SWAP 使用率阈值时,需确保系统有足够内存
    • 优化网络参数时,需考虑安全防护
  4. 定期更新系统和内核

    • 及时安装系统补丁和内核更新
    • 新内核版本通常包含性能优化和 bug 修复
    • 测试新内核后再部署到生产环境
  5. 根据负载类型调整配置

    • 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> 1

Q2: 如何优化 PostgreSQL 在虚拟机环境中的性能?

A2: 虚拟机环境下的 PostgreSQL 优化建议:

  • 确保虚拟机分配足够的 CPU 和内存资源
  • 使用 paravirtualized 驱动(如 virtio)
  • 关闭不必要的虚拟机功能(如动态内存调整)
  • 调整虚拟机的 I/O 调度器和磁盘缓存设置
  • 考虑使用裸金属虚拟化或容器化部署

Q3: 如何调整 Linux 系统的最大文件描述符限制?

A3: 可以通过以下步骤调整文件描述符限制:

  1. 编辑 /etc/security/limits.conf 文件,添加:
    * soft nofile 65536
    * hard nofile 65536
  2. 编辑 /etc/sysctl.conf 文件,添加:
    fs.file-max = 65536
  3. 执行 sysctl -p 使配置生效
  4. 重启 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_memoryvm.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.rules

Q10: 如何优化 Linux 系统的 CPU 性能?

A10: CPU 性能优化建议:

  • 调整 CPU 调度策略和优先级
  • 配置 CPU 亲和性,减少跨 NUMA 节点访问
  • 启用 CPU 节能模式(如 intel_pstate)
  • 调整 CPU 频率,根据负载动态调整
  • 优化应用程序代码,减少 CPU 密集型操作