kubernetes cpu绑核配置
2021-07-15 tech kubernetes 4 mins 1644 字
经过压测,我们发现绑核功能导致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