CPU 性能模式与 NUMA 调优指南
详解 CPU 性能模式与 NUMA 调优:设置 CPU governor 为 performance、使用 numactl 配置 CPU 绑核、通过内核参数禁用透明大页(THP),覆盖命令与持久化,含 Ubuntu 22.04 实测回显。
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. 综合调优清单
| 项 | 目标值 | 作用 |
|---|---|---|
| governor | performance | 消除 CPU 频率波动对延迟抖动 |
| numactl 绑核 | 按 node 绑定 | 规避开跨 NUMA 访问 |
| THP | never/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 优化指南