详细配置Linux参数提升 OLTP Postgres性能

下面列出针对 Postgres 服务器上的 OLTP 工作负载优化的全套推荐 Linux 内核和系统设置,重点关注 Postgres 细节和fs.file-max设置的包含内容。

内存管理:

  • vm.overcommit_memory = 2:防止内核过度使用内存,降低 OOM Killer 终止 Postgres 进程的风险。
  • vm.swappiness = 1:最大限度地减少 Postgres 进程的交换,因为交换的使用会显着降低数据库性能。
  • vm.min_free_kbytes = 102400:保留预留的内存量以应对意外的需求高峰,确保 Postgres 在需要时有可用的内存。
  • 透明大页:配置transparent_hugepage/enabled和transparent_hugepage/defrag来never禁用 THP,避免 Postgres 的潜在延迟问题。

输入/输出管理:
  • vm.dirty_expire_centisecs = 1000:确定脏页何时刷新到磁盘,影响Postgres如何写入WAL和其他文件。
  • vm.dirty_background_bytes = 67108864:设置内核开始在后台将脏数据写入磁盘的阈值。
  • vm.dirty_bytes = 536870912:Postgres 进程开始立即写出数据之前的最大脏内存量。

文件系统和文件处理:
  • fs.file-max = [appropriate value]:设置系统范围内打开文件描述符的数量限制,该限制应该足够高,以免限制 Postgres。

NUMA 配置:
  • vm.zone_reclaim_mode = 0:禁用 NUMA 内存回收,这可能会对 NUMA 硬件上的 Postgres 性能产生负面影响。
  • kernel.numa_balancing = 0:关闭自动 NUMA 平衡,减少 Postgres 跨 NUMA 节点不必要的数据移动。

进程和连接调度:
  • kernel.sched_autogroup_enabled = 0:通过不对客户端连接进行分组来改进 Postgres 的调度,这可能会延迟进程唤醒。

网络配置:
  • net.ipv4.ip_nonlocal_bind = 1:促进 Postgres 高可用性设置,其中服务可能需要绑定到非本地 IP 地址。
  • net.ipv4.ip_forward = 1:如果 Postgres 节点需要路由功能,则允许 IP 转发。
  • net.ipv4.ip_local_port_range = 10000 65535:增加传出连接的端口范围,为 Postgres 容纳更多客户端连接。
  • net.core.netdev_max_backlog = 10000:确定最大数据包数量,增加积压以处理峰值网络流量而不丢失数据包。
  • net.ipv4.tcp_max_syn_backlog = 8192:增加传入连接的队列长度,防止 Postgres 在新连接爆发期间丢失。
  • net.core.somaxconn = 65535:设置 Postgres 的最大排队套接字连接数,允许更多并发连接。
  • net.ipv4.tcp_tw_reuse = 1:使 Postgres 能够更快地回收处于 TIME_WAIT 状态的套接字,这有利于连接繁重的工作负载。

选择这些设置中的每一个都是为了优化 Postgres 服务器在 OLTP 工作负载下的性能和可靠性,特别是对于移动和 Web 应用程序。在对实时系统进行任何更改之前,请务必记住在与生产设置非常相似的测试环境中对这些设置进行基准测试和验证。