第 8 章 使用 CPU Manager 和拓扑管理器
CPU Manager 管理 CPU 组并限制特定 CPU 的负载。
CPU Manager 对于有以下属性的负载有用:
- 需要尽可能多的 CPU 时间。
- 对处理器缓存丢失非常敏感。
- 低延迟网络应用程序。
- 需要与其他进程协调,并从共享一个处理器缓存中受益。
拓扑管理器(Topology Manager)从 CPU Manager、设备管理器和其他 Hint 提供者收集提示信息,以匹配相同非统一 内存访问(NUMA)节点上的所有 QoS 类的 pod 资源(如 CPU、SR-IOV VF 和其他设备资源)。
拓扑管理器使用收集来的提示信息中获得的拓扑信息,根据配置的 Topology Manager 策略以及请求的 Pod 资源,决定节点是否被节点接受或拒绝。
拓扑管理器对希望使用硬件加速器来支持对工作延迟有极高要求的操作及高吞吐并发计算的负载很有用。
			要使用拓扑管理器,您必须使用 静态 策略配置 CPU Manager。
		
8.1. 设置 CPU Manager
流程
- 可选:标记节点: - oc label node perf-node.example.com cpumanager=true - # oc label node perf-node.example.com cpumanager=true- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 编辑启用 CPU Manager 的节点的 - MachineConfigPool。在这个示例中,所有 worker 都启用了 CPU Manager:- oc edit machineconfigpool worker - # oc edit machineconfigpool worker- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 为 worker 机器配置池添加标签: - metadata: creationTimestamp: 2020-xx-xxx generation: 3 labels: custom-kubelet: cpumanager-enabled- metadata: creationTimestamp: 2020-xx-xxx generation: 3 labels: custom-kubelet: cpumanager-enabled- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 创建 - KubeletConfig,- cpumanager-kubeletconfig.yaml,自定义资源 (CR) 。请参阅上一步中创建的标签,以便使用新的 kubelet 配置更新正确的节点。请参见- MachineConfigPoolSelector部分:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 创建动态 kubelet 配置: - oc create -f cpumanager-kubeletconfig.yaml - # oc create -f cpumanager-kubeletconfig.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 这会在 kubelet 配置中添加 CPU Manager 功能,如果需要,Machine Config Operator(MCO)将重启节点。要启用 CPU Manager,则不需要重启。 
- 检查合并的 kubelet 配置: - oc get machineconfig 99-worker-XXXXXX-XXXXX-XXXX-XXXXX-kubelet -o json | grep ownerReference -A7 - # oc get machineconfig 99-worker-XXXXXX-XXXXX-XXXX-XXXXX-kubelet -o json | grep ownerReference -A7- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 检查 worker 是否有更新的 - kubelet.conf:- oc debug node/perf-node.example.com - # oc debug node/perf-node.example.com sh-4.2# cat /host/etc/kubernetes/kubelet.conf | grep cpuManager- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - cpuManagerPolicy: static cpuManagerReconcilePeriod: 5s - cpuManagerPolicy: static- 1 - cpuManagerReconcilePeriod: 5s- 2 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 创建请求一个或多个内核的 pod。限制和请求都必须将其 CPU 值设置为一个整数。这是专用于此 pod 的内核数: - cat cpumanager-pod.yaml - # cat cpumanager-pod.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 创建 pod: - oc create -f cpumanager-pod.yaml - # oc create -f cpumanager-pod.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 确定为您标记的节点调度了 pod: - oc describe pod cpumanager - # oc describe pod cpumanager- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 确认正确配置了 - cgroups。获取- pause进程的进程 ID(PID):- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 服务质量(QoS)等级为 - Guaranteed的 pod 被放置到- kubepods.slice中。其它 QoS 等级的 pod 会位于- kubepods的子- cgroups中:- cd /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-pod69c01f8e_6b74_11e9_ac0f_0a2b62178a22.slice/crio-b5437308f1ad1a7db0574c542bdf08563b865c0345c86e9585f8c0b0a655612c.scope for i in `ls cpuset.cpus tasks` ; do echo -n "$i "; cat $i ; done - # cd /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-pod69c01f8e_6b74_11e9_ac0f_0a2b62178a22.slice/crio-b5437308f1ad1a7db0574c542bdf08563b865c0345c86e9585f8c0b0a655612c.scope # for i in `ls cpuset.cpus tasks` ; do echo -n "$i "; cat $i ; done- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - cpuset.cpus 1 tasks 32706 - cpuset.cpus 1 tasks 32706- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 检查任务允许的 CPU 列表: - grep ^Cpus_allowed_list /proc/32706/status - # grep ^Cpus_allowed_list /proc/32706/status- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - Cpus_allowed_list: 1 - Cpus_allowed_list: 1- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 确认系统中的另一个 pod(在这个示例中,QoS 等级为 - burstable的 pod)不能在为等级为- Guaranteed的 pod 分配的内核中运行:- cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc494a073_6b77_11e9_98c0_06bba5c387ea.slice/crio-c56982f57b75a2420947f0afc6cafe7534c5734efc34157525fa9abbf99e3849.scope/cpuset.cpus 0 oc describe node perf-node.example.com - # cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc494a073_6b77_11e9_98c0_06bba5c387ea.slice/crio-c56982f57b75a2420947f0afc6cafe7534c5734efc34157525fa9abbf99e3849.scope/cpuset.cpus 0 # oc describe node perf-node.example.com- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 这个 VM 有两个 CPU 内核。 - system-reserved设置保留 500 millicores,这代表一个内核中的一半被从节点的总容量中减小,以达到- Node Allocatable的数量。您可以看到- Allocatable CPU是 1500 毫秒。这意味着您可以运行一个 CPU Manager pod,因为每个 pod 需要一个完整的内核。一个完整的内核等于 1000 毫秒。如果您尝试调度第二个 pod,系统将接受该 pod,但不会调度它:- NAME READY STATUS RESTARTS AGE cpumanager-6cqz7 1/1 Running 0 33m cpumanager-7qc2t 0/1 Pending 0 11s - NAME READY STATUS RESTARTS AGE cpumanager-6cqz7 1/1 Running 0 33m cpumanager-7qc2t 0/1 Pending 0 11s- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow