Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

MySQL / PostgreSQL NUMA 最佳实践

前提 双路服务器 / 中断亲和性 / NUMA,所以默认:2 Socket,NUMA node0 + node1,大内存场景

一、NUMA 通用核心原则(先背下来)

1️⃣ CPU、内存、IRQ 三件事必须“对齐”

项目 必须
CPU 运行在哪个 NUMA node
内存从哪个 NUMA node 分配
磁盘 / 网卡 IRQ 在哪个 node

👉 任何一个错位,性能都会抖。

2️⃣ 不要“半 NUMA”

❌ 错误示例:

taskset -c 0-15 mysqld
  • CPU 绑了
  • 内存没绑

-> 100% 跨 NUMA

3️⃣ 大实例两种正确路线(只能选一个)

模式 适用
单 NUMA Node 绑定 单实例、内存 ≤ 单 node
NUMA interleave 内存 > 单 node

二、MySQL NUMA 最佳实践(重点)

1️⃣ 强烈推荐的两种模式

✅ 模式 A:单 NUMA Node 运行(最佳性能)

前提:

  • MySQL 实例内存 ≤ 单 NUMA node 内存

启动方式

numactl --cpunodebind=0 --membind=0 mysqld

或 systemd:

[Service]
CPUAffinity=0-15
NUMAPolicy=local

MySQL 参数建议

innodb_buffer_pool_size = 90% of node memory
innodb_buffer_pool_instances = 8

适合场景

  • OLTP
  • 高 QPS
  • 延迟敏感

✅ 模式 B:NUMA interleave(大内存通用解法)

前提:

  • MySQL 内存 > 单 NUMA node

启动方式(官方推荐)

numactl --interleave=all mysqld

systemd:

NUMAPolicy=interleave
NUMAMask=0,1

为什么 interleave 好?

  • 内存均匀分布
  • 避免某个 node 被打满
  • 稳定性 > 极限性能

2️⃣ MySQL 明确“不要做”的事

❌ 不要开启 MySQL 自带 NUMA

innodb_numa_interleave = ON

📌 官方建议:用 numactl,不用 MySQL 内部实现

❌ 不要关闭 NUMA 再启动 MySQL

numactl --interleave=all

≠ BIOS 关闭 NUMA

(这是不同概念)

3️⃣ MySQL NUMA 验证方式

numastat -p $(pidof mysqld)

关键指标:

  • local ≫ remote
  • interleave 场景:node0 / node1 接近

三、PostgreSQL NUMA 最佳实践(更严格)

PostgreSQL 对 NUMA 非常敏感,比 MySQL 更容易“翻车”。

1️⃣ PostgreSQL 的黄金规则

PostgreSQL:宁可 interleave,也不要半 NUMA

2️⃣ 推荐模式

✅ 模式 A:单 NUMA Node(强烈推荐)

启动方式

numactl --cpunodebind=0 --membind=0 postgres

systemd:

CPUAffinity=0-15
NUMAPolicy=local

PostgreSQL 参数

shared_buffers = 70% of node memory
work_mem = 控制总并发

✅ 模式 B:interleave(大内存实例)

numactl --interleave=all postgres

3️⃣ PostgreSQL 不建议的做法

❌ 不要只绑 CPU

❌ 不要关闭 kernel.numa_balancing 再不绑内存

4️⃣ kernel.numa_balancing 建议

场景 设置
MySQL 关闭
PostgreSQL 关闭
echo 0 > /proc/sys/kernel/numa_balancing

四、IRQ / IO / 网络 与 NUMA(非常重要)

1️⃣ 网卡 / NVMe 中断

  • 中断在哪个 NUMA node
  • DB 进程就跑在哪个 node
cat /proc/interrupts

2️⃣ 磁盘 IO 线程

  • blk-mq 默认多队列
  • NUMA 不一致 -> cache miss

五、systemd 启动模板(通用)

MySQL

[Service]
CPUAffinity=0-15
NUMAPolicy=interleave
NUMAMask=0,1

PostgreSQL

[Service]
CPUAffinity=0-15
NUMAPolicy=local

六、验证 checklist(上线前必做)

lscpu
numactl --hardware
numastat
numastat -p mysqld
numastat -p postgres

七、性能调优结论(直白版)

数据库 推荐策略
MySQL interleave 或 单 NUMA
PostgreSQL 单 NUMA > interleave
两者 不要半 NUMA

八、总结

NUMA 调优不是“开或关”,而是:CPU、内存、IRQ 三者位置必须一致。