kubernetes cpu绑核配置

经过压测,我们发现绑核功能导致cpu不能充分利用,只能利用到 65%-70%,因而最后并没有启用该功能。同行有位大佬给出的结论是,docker绑核是软实现的,不能被系统灵活调度,qps下降是正常现象。

这篇文章仅做记录。

一、CPU 管理策略

CPU 管理策略通过 kubelet 参数 --cpu-manager-policy 来指定。支持两种策略:

  • none: 默认策略,表示现有的调度行为。
  • static: 允许为节点上具有某些资源特征的 pod 赋予增强的 CPU 亲和性和独占性。

同时,要求使用 --kube-reserved 和/或 --system-reserved--reserved-cpus 来保证预留的 CPU 值大于零,可以不是整数,最终计算reserved cpu时会向上取整。

要使得绑核生效,pod 的配置需要 request 和 limit 的值相等。

二、设置步骤

1. 确认非绑核

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

  • docker ps 确认docker id
  • docker inspect查找 pid
  • taskset 查看cpu绑定情况
# 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

当前机器的核数时72核,可以看到容器没有绑核。

2. 修改kubelet配置

cd /var/lib/kubelet
mv cpu_manager_state bak_cpu_manager_state

修改 kubelet 的启动参数,添加: –cpu-manager-policy=static 和 –kube-reserved=cpu=1(给cpu池子留点资源)。各人的kubelet启动配置不完全一致,以下仅供参考。

# vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# 在 Environment= 列添加/修改下面两行
Environment="... ...
--cpu-manager-policy=static \
--kube-reserved=cpu=1,memory=1000Mi"

重启kubelet

systemctl daemon-reload
systemctl start kubelet
systemctl status kubelet

3. 修改pod的yaml配置

仅供参考:

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

4. 确认已绑核

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

三、参考资料


graph-easy 绘制流程图 原神图形技术简析及杂谈 - 2401DEM