k8s pod 绑核

一、概述

默认配置下,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.mzph.cn/web/2031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

狠不狠?做个标签累不累?

QT是专门用来开发用户界面的程序&#xff0c;小部件&#xff08;Widgets&#xff09;是构成用户界面的基本元素。QT6提供了一个丰富的库&#xff0c;用于创建桌面、移动和嵌入式应用程序的用户界面。 小部件是图形用户界面(GUI)编程中的一个重要概念。它是构成用户界面的基本元…

@NameBinding注解名称绑定过滤器/拦截器

NameBinding注解名称绑定过滤器/拦截器&#xff0c;只针对某一些资源方法执行处理逻辑 一、为什么要用名称绑定 一般情况下&#xff0c;借助Spring的过滤器或者拦截器等对Http请求或响应进行处理就能满足需求。但是在有些场景下若只需对特定的xxxResource做拦截处理&#xff0…

项目大集成

一 keeplived 高可用 192.168.11.11nginx keeplived192.168.11.12nginx keeplived 两台均编译安装服务器 1 主服务器修改文件&#xff1a; 2 备服务器修改文本 scp keepalived.conf 192.168.11.12:/etc/keepalived/ 3 给主服务器添加虚拟ip ifconfig ens33:0 192.168…

Qt5怎么用QSetting生成配置文件、读取配置文件和保存配置文件

2024年4月22日&#xff0c;周一下午 在 Qt5 中&#xff0c;可以通过 QSettings 类生成、读取和保存配置文件。 QSettings 类提供了一个跨平台的接口&#xff0c;用于读取和写入应用程序的设置和配置信息&#xff0c;这些信息可以存储在不同的地方&#xff0c;如注册表&#xf…

【多态】底层原理

博主首页&#xff1a; 有趣的中国人 专栏首页&#xff1a; C进阶 本篇文章主要讲解 多态底层原理 的相关内容 1. 多态原理 1.1 虚函数表 先看一下这段代码&#xff0c;计算一下sizeof(Base)是多少&#xff1a; class Base { public:virtual void Func1(){cout << &quo…

Oracle 21 C 安装详细操作手册,并配置客户端连接

Oracle 21 C 安装详细操作手册 Win 11 Oracle 21C 下载&#xff1a; Database Software Downloads | Oracle 中国 云盘共享 链接&#xff1a;https://pan.baidu.com/s/12XCilnFYyLFnSVoU_ShaSA 提取码&#xff1a;nfwc Oracle 21C 配置与登陆&#xff1a; 开始菜单 NetMa…

Node.js身份核验接口、身份证二、三要素实名认证接口

随着互联网的高速发展&#xff0c;人们可以发表言论的渠道越来越多。网络平台不断汲取各地、各人、各时发表的各种信息。人们喜欢将信息发布到微博、知乎、天涯、豆瓣等等网络平台&#xff0c;逐步的&#xff0c;网络信息进入大爆炸时代。这些大量涌现的信息中难免掺杂着一些不…

数学建模:Matlab一元二次回归模型-重庆房价预测

摘要 自1998年我国实行住房改革以来,房地产行业已经逐渐成长为拉动中国经济增长的龙头产业。近几年在国家积极的财政政策刺激下,我国房地产市场处于不断发展阶段。然而,与美国等发达国家住房市场进入成熟期不同,我国正处在城市化和工业化进程加速阶段,住房水平低和需求比…

java中spring底层核心原理解析(1)

相关系列 java中spring底层核心原理解析(2)-CSDN博客 总起 本章主要是讲以下的内容 Bean的生命周期底层原理依赖注入底层原理初始化底层原理推断构造方法底层原理 先看spring入门代码&#xff1a; ClassPathXmlApplicationContext context new ClassPathXmlApplicationCo…

Git下载安装

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

华为认证云计算前景如何

互联网/移动互联网经历了高速发展的二十年&#xff0c;我们有幸一起见证了华为、阿里、腾讯、百度、字节跳动、京东、滴滴、拼多多等互联网公司的崛起&#xff0c;让普通技术人实现逆袭拿到高薪&#xff0c;也让小镇做题家们有了阶层跨越的机会。 但机会都是留给有准备的人&…

C++:特殊成员函数

构造函数、析构函数和拷贝构造函数是C类中的三种特殊成员函数&#xff0c;它们分别用于对象的初始化、清理和拷贝操作。 1.构造函数&#xff08;Constructor&#xff09;&#xff1a;构造函数在对象创建时自动调用&#xff0c;用于初始化对象的成员变量。它的名称与类名相同&a…

基于大语言模型的本地知识库问答系统构建方案

文章大纲 RAG (Retrive,Augment,Generate)检索增强生成方案简介1. 数据准备阶段2. 应用阶段基于 LangChain 的实现开源实现参考RAG 与其他方案比较知识图谱方案: KG-RAG 表示基于知识图谱的RAG(Retrieval Augmented Generation)检索增强多模态检索结论参考文献与学习路径写…

使用机器学习算法构建问答系统

长时间以来&#xff0c;我一直在阅读关于人工智能和机器学习的多篇文章、一些论文和大量博客文章。最近&#xff0c;神经网络的进步特别引人注目&#xff0c;比如产生类似人类水平文本的 GPT3.5 模型。为了理解使用神经网络进行自然语言处理的最新技术&#xff0c;我想设计一个…

富格林:戒备虚假套路保障安全

富格林悉知&#xff0c;现货黄金是一种传统而又具有吸引力的投资方式&#xff0c;因为它通常被视为一种避险资产。对于投资者来说&#xff0c;特别是新进场的新手投资者戒备虚假套路是保障做单安全的关键之处。那么我们该如何进行戒备虚假套路以达到安全做单的目标呢&#xff1…

React Router 6 + Ant Design:构建基于角色的动态路由和菜单

要根据用户的角色生成不同的路由菜单并实现权限控制,你可以采取以下步骤: 定义路由配置 首先,你需要定义一个包含所有可能路由的配置文件,例如: const routes [{path: /dashboard,element: <DashboardPage />,roles: [admin, manager, user]},{path: /users,element:…

Node.js 基础学习

文章目录 1. Node.js1.1 是什么&#xff1f;1.2 作用 2. 命令行工具2.1 命令的结构2.2 常用命令 3. Node.js 注意点3.1 Node.js 中不能使用DOM 和BOM 的API3.2 Node.js 中顶级对象叫做global 4. Buffer4.1 Buffer 特点4.2 Buffer 创建方式4.3 Buffer 操作与注意点 5. 计算机基础…

CSS基础:浮动(float)的3种方式,清除浮动3种方式的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

【报错】ModuleNotFoundError: No module named ‘einops‘

1 报错 💔💔💔 ModuleNotFoundError: No module named einops 解决方法 💚 💚 💚 pip --default-timeout=100 install einops -i https://pypi.tuna.tsinghua.edu.cn/simple 问题解决啦!!!🌺🌺🌺 2 报错 💔💔💔 ModuleNotFoundError: No module

iOS OC项目中引入SwiftUI文件

iOS OC项目中引入SwiftUI文件 1、创建SwiftUI文件 2、第一次创建时&#xff0c;Xcode会提示桥接&#xff0c;选择 Creat Bridging Header即可。 3、创建swift管理类 /**在UIKit中使用SwiftUI&#xff0c;需要使用UIHostingController对SwiftUI进行包装&#xff0c;返回的是U…