Pod绑定Cpu

k8s为pod进行cpu绑核以进一步提高性能

场景:

在k8s中,对于游戏训练等任务场景下,游戏worker模拟真实玩家时,性能对cpu依赖程度很高,此时如果对pod进行cpu绑核能够一定程度上再提高性能

配置步骤

  • 1、驱逐节点:kubectl drain <NODE_NAME>
  • 2、停止 kubelet:systemctl stop kubelet
  • 3、修改 kubelet 参数:–cpu-manager-policy=“static”
  • 4、删除旧的 CPU 管理器状态文件:rm var/lib/kubelet/cpu_manager_state
  • 5、启动 kubeletsystemctl start kubelet
对需要更改其 CPU 管理器策略的每个节点重复此过程。 跳过此过程将导致 kubelet crashlooping 并出现以下错误:
could not restore state from checkpoint: configured policy “static” differs from state checkpoint policy “none”, please drain this node and delete the CPU manager checkpoint file “/var/lib/kubelet/cpu_manager_state” before restarting Kubelet

cpu-manager-policy参数解析

cpu-manager-policy有两种策略:none和static
  • none 策略
    • none 策略显式地启用现有的默认 CPU 亲和方案,不提供操作系统调度器默认行为之外的亲和性策略。 通过 CFS 配额来实现 Guaranteed Pods 和 Burstable Pods 的 CPU 使用限制。
  • static 策略
    • static 策略针对具有整数型 CPU requests 的 Guaranteed Pod, 它允许该类 Pod 中的容器访问节点上的独占 CPU 资源。这种独占性是使用 cpuset cgroup 控制器来实现的。

注意

当启用 static 策略时,要求使用 --kube-reserved 和/或 --system-reserved 或 --reserved-cpus 来保证预留的 CPU 值大于零。 这是因为零预留 CPU 值可能使得共享池变空。
使用规则:
可独占性 CPU 资源数量等于节点的 CPU 总量减去通过 kubelet --kube-reserved 或 --system-reserved 参数保留的 CPU 资源。 从 1.17 版本开始,可以通过 kubelet --reserved-cpus 参数显式地指定 CPU 预留列表。 由 --reserved-cpus 指定的显式 CPU 列表优先于由 --kube-reserved 和 --system-reserved 指定的 CPU 预留。 通过这些参数预留的 CPU 是以整数方式,按物理核心 ID 升序从初始共享池获取的。 共享池是 BestEffort 和 Burstable Pod 运行的 CPU 集合。 Guaranteed Pod 中的容器,如果声明了非整数值的 CPU requests,也将运行在共享池的 CPU 上。 只有 Guaranteed Pod 中,指定了整数型 CPU requests 的容器,才会被分配独占 CPU 资源。
原因:
当 Guaranteed Pod 调度到节点上时,如果其容器符合静态分配要求, 相应的 CPU 会被从共享池中移除,并放置到容器的 cpuset 中。 因为这些容器所使用的 CPU 受到调度域本身的限制,所以不需要使用 CFS 配额来进行 CPU 的绑定。 换言之,容器 cpuset 中的 CPU 数量与 Pod 规约中指定的整数型 CPU limit 相等。 这种静态分配增强了 CPU 亲和性,减少了 CPU 密集的工作负载在节流时引起的上下文切换。
设置pod时要注意的点:
  • Pod的定义里都要设置request和limits,request和limits要一致。
  • 对于要绑核的容器,request值必须是整数。

验证

1、确认非绑核
随便找一个可用的pod,确认目前非绑核状态:
  • docker ps 确认docker id
  • docker inspect查找 pid
  • taskset 查看cpu绑定情况
example:
2、绑核后验证效果
修改pod的yaml配置
确认kubelet开启绑核后,pod 不需要重启,也会自动绑核
 

 
在使用docker时,可以通过参数 cpuset 把容器绑定到某个 cpu 内核上
在这种情况下,由于操作系统在 CPU 之间进行上下文切换的次数大大减少,因此容器里应用的性能会大幅提升。
事实上,cpuset 方式是生产环境中部署在线应用类型的pod的一种常用方式
要在Kubernetes上使用类似docker cpuset 的功能,需要满足以下两个条件
使用所在Pod的QoS是 Guaranteed 的
把requests和limits设置成相同的值,比如2
这样,上面的pod会被绑定到两个独占的cpu内核上
Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP