【博客593】k8s为pod进行cpu绑核以进一步提高性能

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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、启动 kubelet
    systemctl 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和limitsrequest和limits要一致。
  • 对于要绑核的容器request值必须是整数。

验证

1、确认非绑核

随便找一个可用的pod确认目前非绑核状态

  • docker ps 确认docker id
  • docker inspect查找 pid
  • taskset 查看cpu绑定情况

example

# docker ps|grep demo
# docker inspect xxx|grep Pid
            "Pid": 123203,
            "PidMode": "",
            "PidsLimit": 0,
# taskset -c -p 123203
pid 123203's current affinity list: 0-71

2、绑核后验证效果

修改pod的yaml配置

          resources:
            limits:
              cpu: '4'
              ephemeral-storage: 40Gi
              memory: 8G
            requests:
              cpu: '4'
              ephemeral-storage: 40Gi
              memory: 8G

确认kubelet开启绑核后pod 不需要重启也会自动绑核

# docker ps|grep demo
# docker inspect xxx|grep Pid
            "Pid": 123203,
            "PidMode": "",
            "PidsLimit": 0,
# taskset -c -p 123203
pid 123203's current affinity list: 2,4,38,39
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s