面向 OLTP 的 Linux 参数调优

本页目录

下面是面向高并发 OLTP(例如 Web 和移动应用)的 Linux 基础调优建议。其中大部分来自 Autobase 的默认配置,该项目原名为 postgresql_cluster。

请将下列参数视为进一步研究的切入点,文中提供的值仅作为粗略的调优参考,需根据具体情况进行审查。

大部分参数可在 sysctl.conf 中修改,更改后需要调用:

Shell
sysctl -p /etc/sysctl.conf

临时更改 (以 vm.swappiness 为例):

Shell
sudo sysctl -w vm.swappiness=1

或者:

Shell
echo 1 | sudo tee /proc/sys/vm/swappiness

内存管理

  1. vm.overcommit_memory = 2

    避免内存过度分配,防止 OOM killer 影响 Postgres。

  2. vm.swappiness = 1

    最小化 swap 使用,避免完全禁用。

    💀这是一个具有争议的话题。我个人在关键任务系统中在高负载下使用 0 来禁用 swap,承担OOM 风险。不过,许多专家建议不要完全关闭,可以使用较低值—1 或 10。

相关优质文章:

  1. vm.min_free_kbytes = 102400

    确保在内存分配高峰期间为 Postgres 预留可用内存。

  2. transparent_hugepage/enabled=never,transparent_hugepage/defrag=never

    禁用透明大页 (THP),以防止不适合 Postgres OLTP 工作负载的延迟和碎片。一般建议在 OLTP 系统中禁用 THP (例如 Oracle)。

I/O管理

  1. vm.dirty_background_bytes = 67108864

  2. vm.dirty_bytes = 536870912

    调整 pdflush 以防止 IO 延迟峰值,详见 @grayhemp 的 PgCookbook - a PostgreSQL documentation project。

网络配置

📝 以下是 ipv4 配置;🎯 **TODO:**ipv6 配置待补充

  1. net.ipv4.ip_local_port_range = 10000 65535

    允许处理更多客户端连接。

  2. net.core.netdev_max_backlog = 10000

    应对网络流量高峰,避免丢包。

  3. net.ipv4.tcp_max_syn_backlog = 8192

    适应高并发连接请求。

  4. net.core.somaxconn = 65535

    增加套接字连接队列的上限。

  5. net.ipv4.tcp_tw_reuse = 1

    减少高吞吐量 OLTP 应用的连接建立时间。

NUMA配置

  1. vm.zone_reclaim_mode = 0

    避免跨 NUMA 节点的内存回收对 Postgres 造成性能影响。

  2. kernel.numa_balancing = 0

    禁用自动 NUMA 平衡,以提高 Postgres 的 CPU 缓存效率。

  3. kernel.sched_autogroup_enabled = 0

    改善 Postgres 进程调度的延迟。

文件系统和文件句柄

  1. fs.file-max = 262144

    设置 Linux 内核可以分配的最大文件句柄数量。在运行像 Postgres 这样的数据库服务器时,足够的文件描述符对于处理大量连接和文件至关重要。

🎯 TODO:根据不同主流操作系统进行进一步审查和调整。

我见

文中提到了几个不错的工具:

另外,关于 OOM、虚拟内存、物理内存等,推荐阅读小林的文章,比如在 4GB 物理内存的机器上,申请 8G 内存会怎么样?

讨论与补充

在 GitHub 查看讨论

支持作者

感谢支持 PostgreSQL Howto 的长期维护。

微信赞赏码

读者交流群

二维码若已过期,可通过公众号 PostgreSQL 学徒或邮件联系。

PostgreSQL 学徒读者交流群二维码