Kubernetes生产实践系列之三十一:Kubernetes基础技术之CPU资源的调度和管理(CFS)

K8s之CPU 配置、Linux CFS、编程语言性能问题(CPU Configuration for K8s, Linux CFS, Programming Language Performanc) ‌K8s(Kubernetes)是一个开源的容器管理平台,主要用于管理云平台中多个主机上的容器化应用。‌它的目标是简化容器应用的部署、规划和更新过程,提供一种高效的管理机制。‌1 K8s的核心特性包括: ‌服务发现与负载均衡‌:无需修改应用程序即可使用陌生的服务发现机制。 ‌存储编排‌:自动挂载所选存储系统,包括本地存储。 ‌Secret和配置管理‌:部署更新Secrets和应用程序的配置时不必重新构建容器镜像,且不必将软件堆栈配置中的秘密信息暴露出来。 ‌ 阅读详情

一、前言

在使用Kubernetes的过程中,我们看到过这样一个告警信息:

[K8S]告警主题: CPUThrottlingHigh
告警级别: warning
告警类型: CPUThrottlingHigh
故障实例: 
告警详情: 27% throttling of CPU in namespace kube-system for container kube-proxy in pod kube-proxy-9pj9j.
触发时间: 2020-05-08 17:34:17

这个告警信息说明kube-proxy容器被throttling了,然而查看该容器的资源使用历史信息,发现该容器以及容器所在的节点的CPU资源使用率都不高:

告警期间容器所在节点CPU使用率

 

告警期间kube-proxy的资源使用率

经过我们的分析,发现该告警实际上是和Kubernetes对于CPU资源的限制和管控机制有关。Kubernetes依赖于容器的runtime进行CPU资源的调度,而容器runtime以Docker为例,是借助于cgroup和CFS调度机制进行资源管控。本文基于这个告警案例,首先分析了CFS的基本原理,然后对于Kubernetes借助CFS进行CPU资源的调度和管控方法进行了介绍,最后使用一个例子来分析CFS的一些调度特性来解释这个告警的root cause和解决方案。

转载自https://blog.youkuaiyun.com/cloudvtech

二、CFS基本原理

2.1 基本原理

Linux在2.6.23之后开始引入CFS逐步替代O1调度器作为新的进程调度器,正如它名字所描述的,CFS(Completely Fair Scheduler)调度器追求的是对所有进程的全面公平,实际上它的做法就是在一个特定的调度周期内,保证所有待调度的进程都能被执行一遍,主要和当前已经占用的CPU时间经权重除权之后的值(vruntime,见下面公式)来决定本轮调度周期内所能占用的CPU时间,vruntime越少,本轮能占用的CPU时间越多;总体而言,CFS就是通过保证各个进程vruntime的大小尽量一致来达到公平调度的效果:

进程的运行时间计算公式为:
进程运行时间 = 调度周期 * 进程权重 / 所有进程权重之和

vruntime = 进程运行时间 * NICE_0_LOAD / 进程权重 = (调度周期 * 进程权重 / 所有进程总权重) * NICE_0_LOAD / 进程权重 = 调度周期 * NICE_0_LOAD / 所有进程总权重 

通过上面两个公式,可以看到vruntime不是进程实际占用CPU的时间,而是剔除权重影响之后的CPU时间,这样所有进程在被调度决策的时候的依据是一致的,而实际占用CPU时间是经进程优先级权重放大的。这种方式使得系统的调度粒度更小来,更加适合高负载和多交互的场景。

2.2 Kernel配置

在kernel文件系统中,可以通过调整如下几个参数来改变CFS的一些行为:

  • /proc/sys/kernel/sched_min_granularity_ns,表示进程最少运行时间,防止频繁的切换,对于交互系统
  • /proc/sys/kernel/sched_nr_migrate,在多CPU情况下进行负载均衡时,一次最多移动多少个进程到另一个CPU上
  • /proc/sys/kernel/sched_wakeup_granularity_ns,表示进程被唤醒后至少应该运行的时间,这个数值越小,那么发生抢占的概率也就越高
  • /proc/sys/kernel/sched_latency_ns,表示一个运行队列所有进程运行一次的时间长度(正常情况下的队列调度周期,P)
  • sched_nr_latency,这个参数是内核内部参数,无法直接设置,是通过sched_latency_ns/sched_min_granularity_ns这个公式计算出来的;在实际运行中,如果队列排队进程数 nr_running > sched_nr_latency,则调度周期就不是sched_latency_ns,而是P = sched_min_granularity_ns * nr_running,如果 nr_running <= sched_nr_latency,则 P = sched_latency_ns

在阿里云的Kubernetes节点上,这些参数配置如下:

[root@iZxxxxxxxxxxxxxxxxxxxxZ ~]# cat /proc/sys/kernel/sched_min_granularity_ns
10000000
[root@iZxxxxxxxxxxxxxxxxxxxxZ ~]# cat /proc/sys/kernel/sched_nr_migrate
32
[root@iZxxxxxxxxxxxxxxxxxxxxZ ~]# cat /proc/sys/kernel/sched_wakeup_granularity_ns
15000000
[root@iZxxxxxxxxxxxxxxxxxxxxZ ~]# cat /proc/sys/kernel/sched_latency_ns
24000000

可以算出来 sched_nr_latency = sched_latency_ns / sched_min_granularity_ns = 24000000 / 10000000 = 2.4

在阿里云普通的虚拟机上的参数如下:

[root@prod-tomcat-01 ~]# cat /proc/sys/kernel/sched_min_granularity_ns
3000000
[root@prod-tomcat-01 ~]# cat /proc/sys/kernel/sched_latency_ns
15000000

可以算出来 sched_nr_latency = sched_latency_ns / sched_min_granularity_ns = 15000000 / 3000000 = 5

而在普通的CentOS Linux release 7.5.1804 (Core) 上的参数如下:

[root@k8s-node-01 ~]# cat /proc/sys/kernel/sched_min_granularity_ns
3000000
[root@k8s-node-01 ~]# cat /proc/sys/kernel/sched_nr_migrate
32
[root@k8s-node-01 ~]# cat /proc/sys/kernel/sched_wakeup_granularity_ns
4000000
[root@k8s-node-01 ~]# cat /proc/sys/kernel/sched_latency_ns
24000000

可以算出来 sched_nr_latency = sched_latency_ns / sched_min_granularity_ns = 24000000 / 3000000 = 8

可以看到,阿里云的Kubernetes节点设置了更长的最小执行时间,在进程队列稍有等待(2.4)的时候就开始保证每个进程的最小运行时间不少于10毫秒。

2.3 运行和观察

部署这样一个yaml POD:

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - image: busybox
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
    command:
      - "/bin/sh"
      - "-c"
      - "while true; do sleep 10; done" 
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always

可以看到该容器内部的进程对应的CPU调度信息变化如下:

[root@k8s-node-04 ~]# cat /proc/121133/sched
sh (121133, #threads: 1)
-------------------------------------------------------------------
se.exec_start                                :   20229360324.308323
se.vruntime                                  :             0.179610
se.sum_exec_runtime                          :            31.190620
se.nr_migrations                             :                   12
nr_switches                                  :                   79
nr_voluntary_switches                        :                   78
nr_involuntary_switches                      :                    1
se.load.weight                               :                 1024
policy                                       :                    0
prio                                         :                  120
clock-delta                                  :                   26
mm->numa_scan_seq                            :                    0
numa_migrations, 0
numa_faults_memory, 0, 0, 0, 0, -1
numa_faults_memory, 1, 0, 0, 0, -1
numa_faults_memory, 0, 1, 1, 0, -1
numa_faults_memory, 1, 1, 0, 0, -1


[root@k8s-node-04 ~]# cat /proc/121133/sched
sh (121133, #threads: 1)
-------------------------------------------------------------------
se.exec_start                                :   20229480327.896307
se.vruntime                                  :             0.149504
se.sum_exec_runtime                          :            33.325310
se.nr_migrations                             :                   17
nr_switches                                  :                   91
nr_voluntary_switches                        :                   90
nr_involuntary_switches                      :                    1
se.load.weight                               :                 1024
policy                                       :                    0
prio                                         :                  120
clock-delta                                  :                   31
mm->numa_scan_seq                            :                    0
numa_migrations, 0
numa_faults_memory, 0, 0, 1, 0, -1
numa_faults_memory, 1, 0, 0, 0, -1
numa_faults_memory, 0, 1, 0, 0, -1
numa_faults_memory, 1, 1, 0, 0, -1


[root@k8s-node-04 ~]# cat /proc/121133/sched
sh (121133, #threads: 1)
-------------------------------------------------------------------
se.exec_start                                :   20229520328.862396
se.vruntime                                  :             1.531536
se.sum_exec_runtime                          :            34.053116
se.nr_migrations                             :                   18
nr_switches                                  :                   95
nr_voluntary_switches                        :                   94
nr_involuntary_switches                      :                    1
se.load.weight                               :                 1024
policy                                       :                    0
prio                                         :                  120
clock-delta                                  :                   34
mm->numa_scan_seq                            :                    0
numa_migrations, 0
numa_faults_memory, 0, 0, 0, 0, -1
numa_faults_memory, 1, 0, 0, 0, -1
numa_faults_memory, 0, 1, 1, 0, -1
numa_faults_memory, 1, 1, 0, 0, -1

其中sum_exec_runtime表示实际运行的物理时间。

转载自https://blog.youkuaiyun.com/cloudvtech

三、Kubernetes借助CFS进行CPU管理

3.1 CFS进行CPU资源限流(throtting)的原理

根据文章《Kubernetes生产实践系列之三十:Kubernetes基础技术之集群计算资源管理》的描述,Kubernetes的资源定义:

    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

比如里面的CPU需求,会被翻译成容器runtime的运行时参数,并最终变成cgroups和CFS的参数配置:

cat cpu.shares
256
cat cpu.cfs_quota_us
50000
cat cpu.cfs_period_us
100000

这里有一个默认的参数:

cat /proc/sys/kernel/sched_latency_ns
24000000

所以在这个节点上,正常压力下,系统的CFS调度周期是24ms,CFS重分配周期是100ms,而该POD在一个重分配周期最多占用50ms的时间,在有压力的情况下,POD可以占据的CPU share比例是256。

下面一个例子可以说明不同资源需求的POD容器是如何在CFS的调度下占用CPU资源的:

CPU资源配置和CFS调度

在这个例子中,有如下系统配置情况:

  • CFS调度周期为10ms,正常负载情况下,进程ready队列里面的进程在每10ms的间隔内都会保证被执行一次
  • CFS重分配周期为100ms,用于保证一个进程的limits设置会被反映在每100ms的重分配周期内可以占用的CPU时间数,在多核系统中,limit最大值可以是 CFS重分配周期*CPU核数
  • 该执行进程队列只有进程A和进程B两个进程
  • 进程A和B定义的CPU share占用都一样,所以在系统资源紧张的时候可以保证A和B进程都可以占用可用CPU资源的一半
  • 定义的CFS重分配周期都是100ms
  • 进程A在100ms内最多占用50ms,进程B在100ms内最多占用20ms

所以在一个CFS重分配周期(相当于10个CFS调度周期)内,进程队列的执行情况如下:

  • 在前面的4个CFS调度周期内,进程A和B由于share值是一样的,所以每个CFS调度内(10ms),进程A和B都会占用5ms
  • 在第4个CFS调度周期结束的时候,在本CFS重分配周期内,进程B已经占用了20ms,在剩下的8个CFS调度周期即80ms内,进程B都会被限流,一直到下一个CFS重分配周期内,进程B才可以继续占用CPU
  • 在第5-7这3个CFS调度周期内,由于进程B被限流,所以进程A可以完全拥有这3个CFS调度的CPU资源,占用30ms的执行时间,这样在本CFS重分配周期内,进程A已经占用了50ms的CPU时间,在后面剩下的3个CFS调度周期即后面的30ms内,进程A也会被限流,一直到下一个CFS重分配周期内,进程A才可以继续占用CPU

如果进程被限流了,可以在如下的路径看到:

cat /sys/fs/cgroup/cpu/kubepods/pod5326d6f4-789d-11ea-b093-fa163e23cb69/69336c973f9f414c3f9fdfbd90200b7083b35f4d54ce302a4f5fc330f2889846/cpu.stat 

nr_periods 14001693

nr_throttled 2160435

throttled_time 570069950532853

3.2 本文开头问题的原因分析

根据3.1描述的原理,很容易理解本文开通的告警信息的出现,是由于在某些特定的CFS重分配周期内,kube-proxy的CPU占用率超过了给它分配的limits,而参看kube-proxy daemonset的配置,确实它的limits配置只有200ms,这就意味着在默认的100ms的CFS重调度周期内,它只能占用20ms,所以在特定繁忙场景会有问题:

cat cpu.shares 
204
cat cpu.cfs_period_us 
100000
cat cpu.cfs_quota_us 
20000

注:这里cpu.shares的计算方法如下:200x1024/1000~=204

而这个问题的解决方案就是将CPU limits提高。

Zalando公司有一个分享《Optimizing Kubernetes Resource Requests/Limits for Cost-Efficiency and Latency / Henning Jacobs》很好的讲述了CPU资源管理的问题,可以参考,这个演讲的PPT在这里可以找到。

更具体问题分析和讨论还可以参考如下文章:

其中《Overly aggressive CFS》里面还有几个小实验可以帮助大家更好的认识到CFS进行CPU资源管控的特点:

转载自https://blog.youkuaiyun.com/cloudvtech

使用container_cpu_cfs_throttled_seconds_total 来避免Kubernetes CPU Limits造成的事故 container_cpu_cfs_throttled_seconds_total 当容器超出其CPU限制时,Linux运行时将“限制”该容器并在container_cpu_cfs_throttled_seconds_total指标中记录其被限制的时间使用prometheus来避免Kubernetes CPU Limits... 阅读详情

相关推荐

prometheus-metrics指标翻译

【代码】prometheus-metrics指标翻译。

运维工程师 4612

弹窗!到底谁是幕后黑手?

Docker 技术鼻祖系列夜深了,程序员的电脑却没关······突然,桌面右下角弹出了一个窗口······五分钟后······又五分钟后······[ 完 ]本文纯属娱乐,请勿对号入座,...

云原生实验室 413

Kubernetes CPU limits 陷阱:CFS Throttling 导致延迟飙升的机理与规避

在容器化与微服务架构中,Kubernetes 资源管理是保障服务稳定的基石。许多团队默认设置 CPU limits 以防资源失控,却忽略了其底层基于 CFS 配额的工作机制。当容器 CPU 使用超过配额时,内核会强制节流(Throttling),导致请求排队、P99 延迟抖动,甚至出现“CPU 不高但服务慢”的诡异现象。理解 requests 与 limits 的本质区别,掌握通过 cpu.stat 或 Prometheus 监控 CFS Throttling 的方法,对于性能调优与故障排查至关重要。合理利

优快云头条 488

CPU ThrottlingHigh告警问题与数据指标采集

每5分钟采集一次container_cpu_cfs_throttled_periods_total和container_cpu_cfs_periods_total,根据差值计算Throttling百分比,连续三次(15分钟内)超过5%时即告警。每隔1分钟采集一次container_cpu_usage_seconds_total。cgroup cpuacct子系统cpu.stat中的nr_throttled。cgroup cpuacct子系统cpu.stat中的nr_periods。

阿拉斯加大闸蟹的博客 1万+

CPU资源分配:提示系统轻量级任务的调度技巧

作为后端开发或运维工程师,你是否遇到过这些问题?定时运行的轻量级脚本(比如日志切割)突然占满CPU,导致核心服务响应延迟;IoT设备上的传感器数据采集任务(每10ms一次)偶尔“丢包”,因为被其他任务抢占了CPU;容器化的微服务实例(比如接口转发)明明配置了CPU限制,却还是频繁触发限流。这些问题的根源往往不是“任务太重”,而是CPU资源分配策略与任务特性不匹配。

AI智能探索者的博客 1009

Sony DPT RP1/CP1破解攻略

前言 自己有一台Sony DPT CP1和一台kindle,两个都已经用了很多年。直到最近发现微信读书上经常可以找到一些免费而且不错的书,所以就萌生了在两台机器上使用微信读书的想法。kindle比较容易实现,直接打开内置浏览器,进入微信读书网页版就行了,而Sony的电纸书则只能通过破解+安装微信读书的方式实现。大概弄了两三个小时吧,也遇到了一些问题,所以这里记录一下整个过程,希望能方便后来的使用者。 首先感谢HappyZ, osc_t5nbj8ds。前者是提供公开破解的方法的大神,后者则是解决了我遇到的问题

weixin_43467572的博客 1万+

10 个常用监控 Kubernetes 性能的 Prometheus Operator 指标

公众号关注「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !Prometheus Operator 安装完成后会有很多默认的监控指标,一不注意就大量的报警产生,所以...

easylife206的专栏 1万+

Allegro 16.6 高级技巧实战:用Region规则和动态间距搞定高密度连接器布局布线

本文深入探讨了Allegro 16.6在高密度连接器布局布线中的高级技巧,重点介绍了Region规则和动态间距属性的应用。通过局部规则覆盖和分层控制,解决0.5mm以下引脚间距的布线难题,提升PCB设计效率和质量。

weixin_30352645的博客 439

Kubernetes 调度器 和 Linux CFS(Completely Fair Scheduler)算法

Kubernetes 调度器决定 Pod 分配到哪个节点,而Linux CFS 调度器控制节点上容器的 CPU 使用情况 —— 尤其是如何公平地使用 CPU,并实现cpu.limit的限制。用户态任务的 CPU 时间分配**CFS(完全公平调度器)**是 Linux 控制进程 CPU 使用的核心机制,基于vruntime和红黑树调度进程;Kubernetes 利用 CFS 的 cgroup 参数(quota/period)限制容器 CPU 使用量,实现cpu.limits;

喝醉酒的小白 691

同花顺PC端逆向解析:Hook注入与加密破解实战指南

在Windows客户端数据采集场景中,当常规HTTP爬虫失效时,内存级逆向分析成为获取实时行情数据的关键路径。其核心涉及进程注入、运行时解密、反调试绕过等底层技术,本质是理解PE加载机制、函数调用约定与内存保护策略的协同过程。同花顺作为典型加固客户端,采用ASPack加壳+自研解密+多线程校验三重防护,迫使开发者转向APC注入、动态密钥提取与XXTEA算法复刻等高阶手段。本文聚焦于DLL注入选型依据、解密函数定位方法及二进制Blob结构化解析,最终实现从内存读取到Pandas DataFrame的端到端数据

weixin_32234493的博客 1194

Linux 下安装 openjdk 17【详细步骤】

JDK17,安装教程。

甘蓝的专栏 7502

Kubernetes和ZStack分配CPU的机制

Kubernetes 的 CPU 管理更侧重于容器层面的资源请求和限制,以及通过 Cgroup 和 CFS 进行资源隔离和调度。而 ZStack 的 CPU 分配则更侧重于虚拟机层面的 CPU 绑定和超分管理,以及通过 vNUMA 配置优化性能。两者在资源分配的粒度和调度策略上有所不同。Kubernetes 的 CPU 管理策略允许更细粒度的控制和优化容器性能,而 ZStack 提供了虚拟机层面的 CPU 资源优化和性能提升。

喝醉酒的小白 1478

XYC Q8开源掌机刷第三方系统教程

分区结束后直接将各种游戏文件放入OD分区的Roms文件夹下

m0_60352504的博客 4566

Linux内核cgroup v2 CPU带宽控制机制:cpu.max、cpu.weight与CFS配额调度的精确调优

统一层级树:所有控制器共享同一棵cgroup树,避免v1中的层级分裂问题。原子操作:通过cgroup.controllers和cgroup.subtree_control实现控制器的原子启用。更精细的接口文件:每个控制器有独立的接口文件,语义更清晰。cgroup v2目录结构示例# 挂载cgroup v2文件系统# 查看cgroup v2层级树# 输出示例:# ├── cgroup.controllers # 系统支持的控制器。

qwe0iop0的博客 2689

Taro React组件使用(5) —— RuiPasswordInput 密码输入框显示隐藏和清空

初始化时,需要将传入的 value 赋值给当前组件的 value, 不能直接修改 props 的 value;在组件内输出组件内的变量时,最好先判断输出函数是否定义,再输出,否则很容易引起报错。

止于至善 891

Web3:Ubuntu系统 使用Docker-compose方式部署blockscout浏览器&配置版本-v5.2.3-beta+charts图表

详细介绍了在Ubuntu 23.04系统上部署Blockscout浏览器的步骤,以及过程中遇到的问题进行一一解决。

鄙人kunzhi96,感恩遇见! 2万+

k8s集群CPU静态调度实施

背景 默认情况下,如果一台服务器上部署了多个服务,那么这些服务之间是共享GPU资源的,当服务存在资源竞争时,性能敏感的服务可能会发生剧烈的性能抖动。 通过k8s部署的服务,默认情况下,kubelet 使用 CFS 配额 来执行 pod 的 CPU 约束。当节点上运行了很多 CPU 密集的 pod 时,工作负载可能会迁移到不同的 CPU 核,这取决于调度时 pod 是否被扼制,以及哪些 CPU 核是可用的。许多工作负载对这种迁移不敏感,因此无需任何干预即可正常工作。 然而对于性能敏感的服务,性能明显地受到 C

樛木南雨 1679

AI在电商中的搜索优化

自拟标题 《AI技术助力电商搜索优化:深度解析一线大厂面试题及算法编程实践》 概述 随着人工智能技术的不断发展,AI在电商搜索优化中的应用日益广泛。本文将围绕“AI在电商中的搜索优化”这一主题,介绍国内头部一线大厂如阿里巴巴、百度、腾讯、字节跳动等在面试中常见的AI相关面试题和算法编程题,并提供详尽的答案解

AI天才研究院 912

从零搞懂Docker CPU限额:3步实现容器资源公平调度

掌握Docker容器CPU资源调度难题,3步实现公平分配。详解Docker容器CPU份额设置方法,涵盖–cpu-shares参数配置、多容器资源竞争场景与性能优化优势,轻松提升系统利用率,值得收藏。

DeepLens的博客 1046

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

K8S调度- 资源模型

(1)对于上述K8S 对资源的限制,是参考了 Borg 论文中“动态资源边界”的概念:容器化作业在提交时所设置的资源边界,并不一定是调度系统所必须严格遵守的,因为在实际场景中,大多数作业使用到的资源其实远小于它所请求的资源限额。(2)用户在提交 Pod 时,可以声明一个相对较小的 requests 值供调度器使用;Kubernetes 真正设置给容器 cgroups 的,则是相对较大的 limits 值。

QI8811481的博客 644

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Kubernetes CPU limits 陷阱:CFS 配额如何引发延迟毛刺与节流

在容器资源管理中,CPU 是可压缩资源,Kubernetes 通过 requests 与 limits 控制资源分配,其中 CPU limits 依赖内核 CFS 配额机制。很多人误以为 limits 是平滑限速,实际上当容器的 CPU 消耗在一个调度周期内达到配额上限,内核会直接暂停该 cgroup 内线程,直到下一周期开始,从而产生间歇性停顿与延迟毛刺。这种节流现象隐蔽性强,应用自身指标正常,但 P99 延迟却骤增,是很多线上服务“CPU 使用率不高却响应缓慢”的幕后推手。理解 CFS 配额原理后,可以

weixin_34167819的博客 284

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Kubernetes CPU limits 引发的隐蔽延迟:从 CFS 节流到 Requests 治理

在Kubernetes集群中,CPU资源管理是保障容器性能的关键。许多团队习惯同时设置requests和limits,却忽略了二者底层机制的本质差异:requests基于CFS shares实现调度预留,而limits通过CFS quota在100ms窗口内强制节流。当突发流量使CPU时间配额耗尽时,内核会暂时挂起容器线程,导致P99延迟飙升,但监控显示的CPU平均使用率却很低,这种隐蔽的节流现象常被cgroup计数器揭示。理解这一原理后,合理治理Requests预算、按需保留或移除CPU limits,并

weixin_34126557的博客 526

K8s 生产调优实录:从 Pod 调度到内核参数的全链路性能突破

K8s 性能调优不是单点配置,而是从调度器决策逻辑、资源模型、CPU 管理策略到内核参数的全链路工程。核心路径:先用 VPA 获取准确的资源基线,再根据业务类型选择 QoS 等级和 CPU 管理策略,最后通过内核参数消除网络栈瓶颈。每一步调优都需要配套监控来验证效果,同时评估对集群稳定性和可维护性的影响。生产环境建议分阶段推进:先治理资源模型(requests/limits 对齐),再优化调度策略,最后动内核参数。etcd 作为集群基石,必须独立部署在 SSD 上并开启自动压缩。

2609_95049439的博客 5423

Linux 组调度与容器编排:Kubernetes 的 CPU 资源分配底层

本文深入解析了Kubernetes资源管理与Linux内核Cgroup/CFS调度的底层关联机制。主要内容包括: 核心原理剖析: requests.cpu对应cpu.shares权重分配 limits.cpu映射cfs_bandwidth硬限流 三层cgroup树形结构实现层级隔离 throttled_cfs_rq链表管理限流容器 典型问题分析: Pod限流但整机CPU满载 ResourceQuota配额失效 实时业务调度抖动 周期性接口延迟 实践解决方案: 手动搭建三层cgroup实验环境 精准换算req

望获实时Linux系统 99

K8S 中的 CPUThrottlingHigh 到底是个什么鬼?

1. 前言在使用 Kubernetes 的过程中,我们看到过这样一个告警信息:[K8S] 告警主题: CPUThrottlingHigh告警级别: warning告警类型: CPUThr...

云原生实验室 9962

Linux CFS 的 CFS_BANDWIDTH:任务组的 CPU 带宽硬限制

文章摘要: CFS带宽控制是Linux内核实现CPU资源隔离的核心机制,通过配额(quota)和周期(period)参数限制进程组的CPU使用上限。本文详细解析了其工作原理,包括cgroup v1/v2的接口差异、节流机制和内核实现,并提供了5个典型应用案例:基础CPU限制、多核配额配置、Kubernetes映射、动态调整脚本及内核级调试方法。关键点包括:配额计算公式(上限=quota/period)、cgroup v2的统一接口(cpu.max)、以及Kubernetes资源限制的底层实现原理。文章还给出

望获实时Linux系统 403
上一篇: Kubernetes生产实践系列之三十:Kubernetes基础技术之集群计算资源管理
cloudvtech
博客等级 码龄9年 533粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值