CPU 性能模式与 NUMA 调优指南

详解 CPU 性能模式与 NUMA 调优:设置 CPU governor 为 performance、使用 numactl 配置 CPU 绑核、通过内核参数禁用透明大页(THP),覆盖命令与持久化,含 Ubuntu 22.04 实测回显。

Linux性能优化与调优CPU优化内核参数2026/09/29

CPU 性能模式与 NUMA 调优指南

目标:为高负载服务优化 CPU 运行模式:将 CPU governor 设为 performance 避免频率波动、用 numactl 做 NUMA 绑核规避开跨节点访问、通过内核参数 transparent_hugepage=never 禁用透明大页(THP)以降低延迟抖动。本文命令以 Ubuntu 22.04 视角讲解,标 ⚠️ 处为依赖物理机真实硬件能力的配置。

环境信息

  • 操作系统:Ubuntu 22.04.5 LTS;内核:6.8.0-138-generic
  • CPU:6 核;nproc = 6;NUMA 拓扑:numactl --hardware 显示 1 个 node(node0,6 线程)
  • THP 状态:always [madvise] never(当前生效项在 [ ] 内)
  • ⚠️ cpufreq governor 需物理机/虚拟化透传的 cpufreq 驱动支持

前置条件

  • root 权限;依赖系统 cpufreq 驱动与物理 NUMA 拓扑。
  • ⚠️ 若所在环境无 /sys/devices/system/cpu/cpu0/cpufreq/(多数云端虚拟机),governor 调优无法直接作用于虚拟 CPU,仅作为物理机运维参考。

1. CPU Governor 调整为 performance

Linux cpufreq 通过 scaling governor 决定 CPU 频率放大策略。performance 持频率最高档,powersave 最低档,ondemand/schedutil 动态调频。

# 查看当前 governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# performance   (物理机)
# 或
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# 查看可用 governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
# performance powersave ondemand ... 

临时切换(对所有核):

# 对每一核设为 performance
for g in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
  echo performance > "$g"
done

持久化:用 systemd cpu governor 服务或 cpufrequtils 包:

# 服务器安装 cpufrequtils(RHEL/CentOS 风格:cpupower)
apt-get install -y cpufrequtils
# 写入默认 governor
echo 'GOVERNOR="performance"' > /etc/default/cpufrequtils
systemctl restart cpufrequtils

⚠️ 注意:performance 提升确定性与吞吐,但功耗/发热更高;在功耗敏感场景可选用 schedutil/ondemand。

2. NUMA 绑核(numactl)

NUMA 下 CPU 与本地内存距离影响带宽;跨节点内存访问通量下降。用 numactl 查看拓扑并做进程绑核/内存策略。

# 查看 NUMA 拓扑
numactl --hardware
# available: 1 nodes (0)
# node 0 cpus: 0 1 2 3 4 5
# node distances: node0 0: 10

# 首次需安装 numactl
apt-get install -y numactl

绑定进程到指定 CPU 或节点启动:

# 启动进程并绑定到 CPU 0-1
numactl --physcpubind=0-1 --localalloc ./myserver

# 绑定到 node0 及其本地内存
numactl --cpunodebind=0 --membind=0 ./myserver

# 查看任意 pid 的 NUMA 策略
numactl --show

💡 说明:对延迟敏感的中间件(如数据库)常使用 --physcpubind 绑核,避免 OS 调度导致的性能抖动。多节点拓扑示例见上节 --hardware 的 node 列表。

3. 禁用透明大页(THP)

THP 尝试以 2MB 大页透明化映射,但后台 khugepaged 合并页会造成延迟毛刺,高并发/数据库场景常建议禁用或改为 madvise。

# 查看当前状态([ ] 内为当前生效项)
cat /sys/kernel/mm/transparent_hugepage/enabled
# always [madvise] never

# 临时禁用(需 write-root 权限)
echo never > /sys/kernel/mm/transparent_hugepage/enabled

持久化:在 /etc/default/grub 的 GRUB_CMDLINE_LINUX 追加内核参数:

GRUB_CMDLINE_LINUX="... transparent_hugepage=never"
# 重新生成 grub 配置并重启生效
update-grub
reboot
# 重启后验证仍为 never
cat /sys/kernel/mm/transparent_hugepage/enabled
# always madvise [never]

⚠️ 注意:一定禁用 khugepaged 相关服务与参数才彻底,避免其后台合并。多数发行版 THP 默认 always,数据库官方文档(MySQL/Redis)普遍建议 never 或 madvise。

4. 综合调优清单

项目标值作用
governorperformance消除 CPU 频率波动对延迟抖动
numactl 绑核按 node 绑定规避开跨 NUMA 访问
THPnever/madvise消除 khugepaged 大页合并毛刺
ulimit -l调大允许锁页内存(大页场景)

5. 常见问题

Q:云虚拟机上 scaling_governor 不存在? A:虚拟 CPU 通常不暴露 cpufreq;此节是物理机/裸金属运维配置,虚拟机可直接跳过 governor 一项。

Q:禁用 THP 后内存少了? A:THP 用于减少 TLB 压力,禁用会略微增加 TLB 缺失,但对延迟敏感服务通常利大于弊;用大页应用(数据库)应显式配置 hugepages 而非依赖 THP。

Q:numactl --physcpubind 与 taskset 有何区别? A:numactl --physcpubind 更强调与内存策略(--membind)配合;taskset 只绑定 CPU。NUMA 调优优先 numactl。

卸载方式

恢复 governor 为系统默认(如 ondemand)、移除 numactl 启动参数中的绑核、删除 grub 中 THP 参数并 update-grub 重启。

参考链接

  • numactl 手册:man numactl、man cpufrequtils
  • 内核文档:Documentation/admin-guide/mm/transhuge.rst、Intel/AMD NUMA 优化指南