我是靠谱客的博主 老实耳机,最近开发中收集的这篇文章主要介绍【博客593】k8s为pod进行cpu绑核以进一步提高性能k8s为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、启动 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和limits,request和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

最后

以上就是老实耳机为你收集整理的【博客593】k8s为pod进行cpu绑核以进一步提高性能k8s为pod进行cpu绑核以进一步提高性能的全部内容,希望文章能够帮你解决【博客593】k8s为pod进行cpu绑核以进一步提高性能k8s为pod进行cpu绑核以进一步提高性能所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部