精读笔记(RHCA 英文教材)· RH442 Chapter 7 Tuning CPU Utilization
精读笔记(RHCA 英文教材)· RH442 Chapter 7 Tuning CPU Utilization
教材原文:RHCA 官方英文教材(PDF 第 250~295 页)(OCR 整书版已从本站移除,本页为章节精读) 关联中文笔记:
02-09-性能调优RH442(RHCA).md(CPU:绑定核 taskset、nice 优先级、NUMA);本章=CPU 三大块:调度策略/优先级 → 亲和性/隔离 → 缓存剖析。 结构:3 个 Section(7.1 调度策略+GE cputuning-policies;7.2 亲和性/隔离+GE cputuning-affinity;7.3 缓存剖析+GE cputuning-cpucache)+ Lab(lab: cputuning-review)。
Chapter Goal / Objectives(原文+译)
- GOAL: Manage CPU resource sharing and scheduling to meet workload requirements.(管理 CPU 资源共享与调度以满足负载需求。)
- OBJECTIVES: ① 配置 CPU 调度策略;② 配置 CPU 与中断亲和性以隔离应用/落实 CPU 承诺;③ 剖析缓存使用。
7.1 Configuring CPU Scheduling Policies and Tunables
- 调度器目标:快速决定下一个进程;公平分享但要允许高优先级抢占;响应交互应用;各种负载下可预测、可扩展。
- 优先级体系:实时调度(real-time,固定优先级 1~99)与非实时(nice 值 -20~19);实时进程总抢在非实时之前。
- nice 语义:nice 高=谦让;CPU 饱和时 nice 10 进程约为 nice 5 的两倍时间(权重倍增);不饱和时人人均分。
nice/renice改。 - 实时策略:
SCHED_FIFO(ps CLS=FF;无时间片,跑到阻塞/sched_yield/被更高优先抢占);SCHED_RR(RR;同级轮转、每轮最多一个时间片)。实时进程用固定优先级(内核不算动态值),同优先级保证高者抢占低者。 - CFS(Completely Fair Scheduler,内核 2.6.23 起默认):动态计算运行时间;用时间有序的红黑树管理可运行进程(公平调度、按虚拟运行时间 vruntime);支持调度类模块与组调度(对进程组公平分 CPU)。
- 实时节流(防实时进程锁死系统):
sched_rt_period_us(默认 1000000µs=1s)与sched_rt_runtime_us(默认 950000µs)→ 每个周期留 0.05s 给非实时;runtime=-1关闭预留(危险)、=0禁止实时分时。 - SCHED_DEADLINE(RHEL8 新):按期限调度(最早期限先),任务用 period/deadline/runtime(ns)描述;高负载也保证实时任务(相比固定优先级实时:不必分析系统里其他任务、上下文切换更少、单 CPU 可容纳更多任务)。
chrt -d --sched-runtime 5000000 --sched-deadline 10000000 --sched-period 16666666 <任务>(每 16.6ms 保证 5ms、10ms 内可用)。 - chrt 选项:
-bBATCH、-fFIFO、-iIDLE、-oOTHER/NORMAL、-rRR、-dDEADLINE;chrt -p <pid>看/改运行中进程(如chrt -o -p 5890)。 - tuna(工具+GUI):
tuna --show_threads看所有线程 SCHED/rtpri/affinity;可按线程查详情。 - systemd 服务开机即设([Service]):
Nice=(-20~19);CPUSchedulingPolicy=(batch/idle/fifo/rr;⚠️ 目前不支持 deadline);CPUSchedulingPriority=(实时 1~99)。例 sshd drop-in:CPUSchedulingPolicy=rr+CPUSchedulingPriority=10→ daemon-reload + restart。 - 观察接口:
ps axo pid,pri,rtprio,ni,cls,cputime,comm(CLS:TS/FF/RR/B/IDLE…);/proc/sched_debug(调度器全局与每 runqueue);/proc/<pid>/sched(该进程 se.vruntime、nr_switches、负载均值等)。
7.1 GE(lab: cputuning-policies)
servera:用 chrt 把任务设成不同策略/优先级、对比 sha1sum 实时(FF) vs 普通(TS) 的 CPU 时间;systemd drop-in 给服务设 RR+优先级;calc_deadline_util.sh 验证 DEADLINE 参数(runtime/deadline/period)。
7.2 Configuring CPU Affinity and Isolation
- 为什么 pin:内存密集进程绑到少数 CPU 提高缓存命中;NUMA 大机上把进程与其内存放同一 NUMA 节点降低访存延迟与争用。
- systemd CPUAffinity:[Service]
CPUAffinity=0 1(空格分隔 CPU 索引,从 0 起;多行合并;空串=全部)。 - taskset:命令行即时绑:
taskset -c 0-2 <cmd>/ 改运行中进程。 - cpuset cgroup(/sys/fs/cgroup/cpuset/):更可扩展的 CPU/内存放置:
cpuset.cpus(必填,允许 CPU 列表/范围,如 2-8)、cpuset.mems(必填,允许 NUMA 内存节点 0-1)、cpuset.cpu_exclusive/mem_exclusive(是否允许别的 cpuset 共享);配合 libcgroup-tools(cgcreate/cgexec/cgclassify)。典型做法:脚本建 cpuset0 → 写 cpus/mems → 把 httpd 各 PID 写进 tasks,再由 systemdExecStartPost=调(如/usr/local/bin/cpuseto)→systemctl daemon-reload+restart → 查/proc/<pid>/status的Cpus_allowed_list/Mems_allowed_list。 - IRQ 亲和性:把特定中断绑到指定核:写
/proc/irq/<N>/smp_affinity(十六进制 CPU 位图,如printf '%032x' $((2**N)));irqbalance 守护可用IRQBALANCE_BANNED_CPUS排除某些核收中断(环境变量),从而把中断赶出隔离核;用watch -dn1 cat /proc/interrupts观察每核中断计数变化。
7.2 GE(lab: cputuning-affinity)
servera:taskset/systemd CPUAffinity 绑服务;手建 cpuset 放 httpd 并核对 /proc/PID/status;调整 IRQ smp_affinity/irqbalance 排除位图,用 /proc/interrupts 验证硬中断收敛到指定核。
7.3 Profiling Cache Use
- 缓存层级:L1i/L1d(每核私有)→ L2 → L3(末级 LLC,多核共享,离核最远);现代 CPU 还有页表缓存。lscpu/lstopo/lshw 可看各级容量与共享关系。
- 缓存行与目录:控制器为每行维护 tag/状态;读写在缓存进行。write-through:行更新同时写主存(慢);write-back:写只进缓存,行被换出才写主存(高效;x86 默认全页 write-back)。
- 关联度(associativity):直接映射(最便宜,命中率低);全关联(最贵,查找最久,命中率高);组关联(set associative)=折中(主流实现)。
- cache miss 影响:L1 miss → L2/LLC,仍 miss → 主存;命中率低=CPU 空等内存(“memory wall”)。
- 剖析工具:
- valgrind --tool=cachegrind
<程序>:模拟 I1/L1i、D1/L1d、LL(末级)读写的 miss 数与 miss rate(I refs/D refs/LL refs;I1 miss、D1 miss、LL miss)。 - perf stat 硬件计数事件:
perf stat -e instructions,cycles,L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses tar cvf backup.tar /etc:L1-dcache-load-misses=L1D miss 率;LLC-load-misses=末级 miss;两者差=各级缓存总体效果。 - ⚠️ 硬件计数器在虚拟机里不可用(VM 拿不到),perf 硬件事件须在裸机跑;VM 里改用软件事件或 cachegrind 之类模拟器。
- valgrind --tool=cachegrind
- GE cputuning-cpucache:对比 cache1/cache2 两类访问模式程序(gcc -g 编译),perf stat 缓存事件 + valgrind cachegrind 找 miss 率差异 → 解释行/关联度效应。
Lab 概要(lab: cputuning-review)
综合题:装 httpd 并用 systemd drop-in 绑核/设 nice/调度策略;压测观察(第二终端生成负载);配 cpuset 或 IRQ 亲和;用 perf/valgrind 剖析 → lab grade cputuning-review。
命令速查表
| 用途 | 命令 | | 看进程调度 | ps axo pid,pri,rtprio,ni,cls,cputime,comm;ps o pid,cls,comm -p <pid> | | 改调度策略 | chrt -f\|-r\|-o\|-b\|-i\|-d <任务>;chrt -p <pid>;DEADLINE 加 --sched-runtime/--sched-deadline/--sched-period | | nice 优先级 | nice -n 10 <cmd>;renice 5 -p <pid> | | 实时节流 | /proc/sys/kernel/sched_rt_period_us、sched_rt_runtime_us | | systemd 调度 | drop-in:[Service] Nice= / CPUSchedulingPolicy=rr / CPUSchedulingPriority=10 / CPUAffinity=0 1 | | 绑定 CPU | taskset -c 0-2 <cmd>;/proc/<pid>/status Cpus_allowed_list | | cpuset | /sys/fs/cgroup/cpuset/<名>/{cpuset.cpus,cpuset.mems,tasks};cgcreate/cgexec/cgclassify | | IRQ 亲和 | /proc/irq/<N>/smp_affinity(位图);irqbalance 的 IRQBALANCE_BANNED_CPUS;watch -dn1 cat /proc/interrupts | | 缓存剖析 | valgrind --tool=cachegrind <程序>;perf stat -e L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses <cmd> | | 实验/评分 | lab start cputuning-policies\|cputuning-affinity\|cputuning-cpucache\|cputuning-review;lab grade cputuning-review |
词汇表
| 英文 | 中文 | 速记 |
|---|---|---|
| SCHED_FIFO / RR | 实时策略 | FF 跑到阻塞;RR 同级轮转时间片 |
| SCHED_DEADLINE | 期限调度 | period/deadline/runtime(ns),最早期限先 |
| nice / dynamic priority | 谦让值/动态优先级 | -20~19;非实时权重 |
| CFS / vruntime | 完全公平调度器 | 红黑树按虚拟运行时间公平排 |
| sched_rt_runtime_us | 实时带宽节流 | 默认留 5% 给非实时 |
| CPUAffinity / taskset | CPU 亲和 | 进程允许跑哪些核 |
| cpuset | CPU/内存集 | cpus / mems 必填 |
| NUMA | 非一致内存访问 | 本节点内存快 |
| smp_affinity / IRQ | 中断亲和 | 位图指定收中断的核 |
| cache miss / hit | 缓存未命中/命中 | L1→LLC→主存阶梯 |
| write-back / write-through | 回写/直写 | 回写高效,x86 默认 |
| set associative | 组关联 | 直接映射与全关联的折中 |
| valgrind cachegrind | 缓存模拟器 | I1/D1/LL miss 率 |
| LLC | 末级缓存 | L1 miss 与 LLC miss 之差=缓存效益 |
自测 10 题
- SCHED_FIFO 与 SCHED_RR 区别?(FIFO 无时间片跑到阻塞;RR 同级轮转)
- nice 范围与"谦让"含义?(-20~19;越高越让,CPU 饱和时差 5 级≈差 2 倍权重)
- 实时节流默认给非实时留多少?(每 1s 留 0.05s;runtime=950000/period=1000000µs)
- deadline 调度三参数?(period/deadline/runtime,ns)
- systemd 支持给服务设 DEADLINE 策略吗?(不支持,只能 batch/idle/fifo/rr)
- NUMA 上为何把进程绑本节点?(降低访存延迟与 CPU 争用)
- cpuset 必填哪两个文件?(cpuset.cpus 与 cpuset.mems)
- 怎么让 irqbalance 别把中断分到某核?(IRQBALANCE_BANNED_CPUS)
- perf 的硬件缓存事件在 VM 里能用吗?(不能;需裸机或改用软件事件/cachegrind)
- write-through 与 write-back 区别?(前者行更新即写主存;后者换出才写,高效)
