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 针对 cgroups(v2)的调优清单

按 “必须做 / 强烈建议 / 高级可选 / 绝对不要” 分级,并且区分 MySQL 与 PostgreSQL 的差异。

适用前提

  • RHEL 9 / AlmaLinux 9(cgroups v2)
  • systemd 管理服务
  • 裸机 / VM / 专用节点(不是混部)

一、最重要的前提结论(先记住)

数据库使用 cgroups 的原则是:“只用 accounting,不用弹性限制”

也就是:

  • ❌ 不要用来“压”
  • ✅ 只用来“隔离、保护系统”

二、CPU 调优(最容易被误用)

✅ 必须做

1️⃣ 不要设置 CPUQuota(或设为无限)

systemd(推荐)

[Service]
CPUQuota=infinity

或直接不设置(默认无限)

📌 CPU throttling = TPS 抖动 = 慢查询爆炸

2️⃣ 明确 CPUWeight(当有其他服务时)

CPUWeight=100
  • 默认 100
  • 可适当提高(200~500)

🔥 强烈建议(数据库专用节点)

3️⃣ 使用 cpuset 绑定 CPU

AllowedCPUs=0-15

或手工:

cpuset.cpus=0-15

📌 防止调度抖动、跨 NUMA

❌ 绝对不要

  • 不要用 –cpus=2
  • 不要用 CPUQuota=200%
  • 不要在高峰期动态改 quota

三、内存调优(最致命)

✅ 必须做

1️⃣ 不设置 memory.max(或设为 infinity)

MemoryMax=infinity

📌 memory.max = OOM 定时炸弹

2️⃣ 禁用 swap(对数据库)

MemorySwapMax=0

或系统级:

swapoff -a

3️⃣ 明确数据库内存由数据库自己管理

MySQL

innodb_buffer_pool_size = 70%~80% RAM

PostgreSQL

shared_buffers = 25% RAM
effective_cache_size = 70% RAM

🔥 强烈建议

4️⃣ 使用 memory.high(软保护,而不是限制)

MemoryHigh=90%

作用:

  • 保护宿主
  • 不直接 kill 数据库

📌 memory.high > memory.max

5️⃣ 启用 memory.oom.group

echo 1 > memory.oom.group

或 systemd:

OOMPolicy=kill

📌 防止“半死不活”

❌ 绝对不要

  • 不要用 docker -m 64g
  • 不要在数据库容器里用 swap
  • 不要让 kubelet 管数据库内存

四、IO 调优(经常被忽略)

✅ 必须做

1️⃣ 不要用 overlay2 跑数据目录

  • MySQL / PG 数据目录:
    • ❌ overlay
    • ✅ hostPath / local disk / raw block

2️⃣ IO 限速默认不设

IOReadBandwidthMax=
IOWriteBandwidthMax=

📌 数据库 不是 batch IO

🔥 强烈建议

3️⃣ 独占磁盘或独立 IO cgroup

IOWeight=100

有混部时:

  • DB:200
  • 普通服务:50

❌ 绝对不要

  • 不要 blkio throttle DB
  • 不要多 DB 共享一个限速盘

五、PIDs 调优(容易救命)

✅ 必须做

TasksMax=16384

📌 防 fork 炸弹

📌 MySQL / PG 都可能短时间拉高线程

❌ 不要

  • 不要用默认 512
  • 不要无限(会拖死宿主)

六、NUMA + cgroups(数据库性能分水岭)

✅ 强烈建议(生产)

1️⃣ 绑定 CPU + 内存到同一 NUMA

AllowedCPUs=0-15
AllowedMemoryNodes=0

或启动命令:

numactl --cpunodebind=0 --membind=0

2️⃣ 禁用自动 NUMA balancing(数据库)

echo 0 > /proc/sys/kernel/numa_balancing

📌 尤其 MySQL

七、HugePages(强烈建议)

MySQL

innodb_buffer_pool_size
innodb_use_large_pages=ON

PostgreSQL

huge_pages=on

📌 HugePages + cgroups = 稳定延迟

八、systemd 推荐模板(通用)

[Service]
CPUQuota=infinity
CPUWeight=200

MemoryMax=infinity
MemoryHigh=90%
MemorySwapMax=0
OOMPolicy=kill

TasksMax=16384

IOWeight=200

AllowedCPUs=0-15
AllowedMemoryNodes=0

九、MySQL vs PostgreSQL 的关键差异

项目 MySQL PostgreSQL
NUMA 敏感 ⭐⭐⭐⭐ ⭐⭐⭐
OOM 容忍 极差 较好
HugePage 强烈推荐 推荐
IO 抖动 极敏感 敏感
cgroup 容忍

十、真实生产“翻车清单”(一定要避开)

  • ❌ memory.max + 高并发
  • ❌ CPUQuota + 峰值流量
  • ❌ overlay2 + fsync
  • ❌ swap + 数据库
  • ❌ NUMA 不绑
  • ❌ 混部 DB

十一、总结

数据库的 cgroups 不是“限制器”,而是“保护壳”。

如果你在“压数据库”,说明架构已经错了。