k8s pod 绑核

devtools/2024/9/21 5:19:17/

一、概述

默认配置下,kubelet/Linux 使用 CFS(完全公平调度)算法来为 Pod 分配 CPU,工作负载(Pod 中的进程)会被调度到不同的可用的 CPU 核心,而且大多数工作负载对这种迁移带来的性能损失并不敏感。

CFS 是 Linux 内核中 SCHED_NORMAL 类任务(普通进程)的默认调度算法,摒弃了原先的固定时间片优先级概念,致力于公平地将 CPU 时间分配给任务。

但是 CPU 缓存的亲和性和调度延迟会对少数进程带来显著影响,这类工作负载需要独占 CPU(“绑核”)。

之前的文章中已经讲了如何在生产环境中进行资源的预留和pod的绑核策略(https://blog.csdn.net/weixin_40579389/article/details/134147788?spm=1001.2014.3001.5501)

本篇文章来讲解k8s pod绑核在cgroup中的实现。

二、环境信息

1:k8s version
[root@node1 ~]# kubectl get node 
NAME    STATUS   ROLES                  AGE   VERSION
node1   Ready    control-plane,master   44d   v1.23.17
node2   Ready    control-plane,master   44d   v1.23.17
node3   Ready    control-plane,master   44d   v1.23.17#########################
2:kubelet配置
[root@node1 ~]# ps -ef | grep kubelet
root       7080      1 25 Feb21 ?        1-05:16:18 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock --node-ip=172.28.30.163 --node-labels=topology.kubeclipper.io/region=mgmt,kubeclipper.io/agent-id=c9722e0c-4511-4885-a986-9afca2f73265 --pod-infra-container-image=172.28.30.163:5000/pause:3.6 --root-dir=/var/lib/kubelet --kube-reserved=cpu=4,memory=16Gi --system-reserved=cpu=12,memory=16Gi --eviction-hard=memory.available<8Gi,nodefs.available<10% --cpu-manager-policy=static --reserved-cpus=0-3,64-67,32-35,96-99 --memory-manager-policy=Static --topology-manager-policy=single-numa-node --reserved-memory 0:memory=40Gi确认目前cpu的策略为static
###############################
3:cpu numa 架构
[root@node1 ~]# numactl -H
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
node 0 size: 515468 MB
node 0 free: 318958 MB
node distances:
node   0 0:  10 ####################################
4:cgroup 管理的 cgroup 子系统
[root@node1 ~]# cat /sys/fs/cgroup/cpuset/kubepods.slice/cpuset.cpus
0-127
[root@node1 ~]# 
128 个核心都被绑定至 kubepods.slice 子系统。

三、启动pod测试

  • 启动pod
[root@node1 ~]# cat wzb/nginx.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx 
spec:replicas: 1selector: matchLabels:app: nginxtemplate: metadata:labels:app: nginxspec:containers:- name: nginximage: docker.io/library/nginx:latestimagePullPolicy: IfNotPresentresources:requests:cpu: 1     ###设置pod的requests和limits数量为1memory: 1Gilimits: cpu: 1memory: 1Gi[root@node1 ~]# kubectl apply -f  wzb/nginx.yaml 
deployment.apps/nginx-deployment created
[root@node1 ~]# 
[root@node1 ~]# kubectl get po  -o wide 
NAME                                READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
nginx-deployment-554f5cbccb-zfxsv   1/1     Running   0          6s    172.25.40.67   cmu82   <none>           <none>
[root@node1 ~]# 
[root@node1 ~]# 
  • 获取pod id
[root@node1 ~]# kubectl get po nginx-deployment-554f5cbccb-zfxsv -o jsonpath='{.metadata.uid}'
3a9b7ef4-ee9b-45a2-97e7-aa1eb38e5860
  • 获取stress(业务) 容器id
进入node2 
[root@node2 ~]# ctr -n k8s.io c ls   |grep nginx    获取容器id
9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70    docker.io/library/nginx:latest                                           io.containerd.runc.v2
  • 查看pod 的cgroup 子系统能够使用的cpu 集合
[root@node2 ~]# cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice/cpuset.cpus
0-127
能够使用所有的cpu 
  • 查看pause和nginx容器 cpuset.cpus 和 tasks 文件
    pause容器
    通过上面获取到的pod id,nginx 容器id判断pause容器的id
[root@node2 ~]# ll /sys/fs/cgroup/cpuset/   | grep kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860
drwxr-xr-x 2 root root 0 Feb 26 10:38 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:559f861df124ed69d350629030e47664ef9e7a993bfd3e03404dcc29767449d1
drwxr-xr-x 2 root root 0 Feb 26 10:38 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70
[root@node2 ~]# 进入pause 容器目录,查看cpuset.cpus和tasks文件[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:559f861df124ed69d350629030e47664ef9e7a993bfd3e03404dcc29767449d1]# cat cpuset.cpus 
0-127[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:559f861df124ed69d350629030e47664ef9e7a993bfd3e03404dcc29767449d1]# cat tasks 
353184[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:559f861df124ed69d350629030e47664ef9e7a993bfd3e03404dcc29767449d1]# taskset -cp 353184 
pid 353184's current affinity list: 0-127[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:559f861df124ed69d350629030e47664ef9e7a993bfd3e03404dcc29767449d1]# cpuset.cpus 文件输出 0-127,128 个核心都在列,表示进程可以随意使用这 0 - 127 号 CPU。
tasks 文件输出 pause 进程的 pid,将该 cpuset 与 pause 进程绑定,所以 pause 容器可以随意使用这 0 - 127 号 CPU。

nginx容器

   进入nginx 容器cgroup目录
[root@node2 cpuset]# cd kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70]# cat cpuset.cpus 
17[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70]# cat tasks 
353213
353249
353250
353251
353252
......
[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70]# taskset -cp 353213
pid 353213's current affinity list: 17cpuset.cpus 文件输出 17,表示进程只能使用 17 号 CPU。
tasks 文件输出 nginx 进程的 pid,将该 cpuset 与 stress 进程绑定,所以 stress 容器就与 17 号 CPU 绑定了。查看node2主机上的cpu_manager_state文件,该文件记录了该节点上容器的 cpuset 状态:uuid 为 3a9b7ef4-ee9b-45a2-97e7-aa1eb38e5860 的 Pod 中 nginx 容器的绑核。
[root@node2 ~]# cat /var/lib/kubelet/cpu_manager_state  | jq .
{"policyName": "static","defaultCpuSet": "0-3,18-67,81-127","entries": {"3a9b7ef4-ee9b-45a2-97e7-aa1eb38e5860": {"nginx": "17"     ####与cgroup 中绑核一致}},"checksum": 3276404201
}
[root@node2 ~]# 

http://www.ppmy.cn/devtools/18384.html

相关文章

用于恢复 Android 上删除照片的 5 个 Android 照片恢复应用程序

最新的Android智能手机配备了可与数码单反相机媲美的出色相机。这就是为什么人们越来越热衷于用手机拍照。然而&#xff0c;拍照是一件简单的事情&#xff0c;但管理这些照片却并不容易。有时&#xff0c;我们在没有备份Android照片的情况下不小心删除了重要的照片&#xff0c;…

使用composer开发自己的扩展包

前言 日常的开发中我们经常用到composer去安装其他人封装好的扩展包&#xff0c;如果你有好的功能代码想分享给其他人使用&#xff0c;就可以使用composer打包成扩展包。其他人用composer安装后就可以使用你的扩展包了。这篇文章教你如何打包自己的composer扩展包。 1.新建仓…

自动驾驶传感器篇: GNSSIMU组合导航

自动驾驶传感器篇&#xff1a; GNSS&IMU组合导航 1.GNSS1.1 GNSS 系统概述1.2 GNSS系统基本组成1. 空间部分&#xff08;Space Segment&#xff09;&#xff1a;2. 地面控制部分&#xff08;Ground Control Segment&#xff09;&#xff1a;3. 用户设备部分&#xff08;Use…

Vue项目搭建

Vue项目搭建 Vue一、创建项目二、Element三、添加Axios组件请求方法的别名 四、vue文件的生命周期五、vue组件相关属性 Vue vue是JavaScript的一个框架 快速创建vue项目的先决条件&#xff1a;安装node.js 一、创建项目 vue ui 这样创建项目的优点 统一的目录结构本地调试热部署…

抓住四月小尾巴,拿个offer~

首先声明一下~本人是个双非二本大三在校生。 从三月份就开始了苦哈哈的找实习之旅&#xff0c;快三月中旬才敢投大厂&#xff0c;为什么嘞&#xff1f;因为学校要求必须参加完期末考试才能出去实习&#xff08;差不多七月初&#xff09;&#xff0c;因为这个好多公司一听就不安…

如何在 Linux 和 Mac 终端命令中添加别名

在本文中&#xff0c;我们将探讨一种简单的技巧&#xff0c;可以节省您在终端中输入重复命令的时间。 作为开发者&#xff0c;我们花费大量时间在终端上执行命令。无论是浏览目录、运行脚本、更改 Node.js 版本还是版本控制命令&#xff0c;手动输入每个命令都是一项耗时的任务…

stm32开发之netxduo组件之mqtt客户端的使用记录

前言 1使用mqtt协议的简单示例记录 代码 MQTT服务端(C# 编写,使用MQTTnet提供的示例代码) 主程序 namespace ConsoleApp1;public class Program {public static async Task Main(string[] args){await Run_Server_With_Logging();}}public static async Task Run_Server_Wi…

B站秒杀项目学习心得

项目地址&#xff1a;B站大学 特别鸣谢&#xff1a;某大佬博客 在该项目中核心就是秒杀的实现&#xff1a;大量用户进行秒杀订单时不能超卖、同一用户不能重复抢 不能超卖在doSeckill1中通过update的排他性实现(乐观锁)。 //拿到秒殺商品TSeckillGoods seckillGoods itSecki…