容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
24647 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册

05|容器CPU(1):怎么限制容器的CPU使用?

cpu.shares
cpu.cfs_quota_us和cpu.cfs_period_us
cpu.shares
cpu.cfs_quota_us
cpu.cfs_period_us
steal值
nice值
软中断的开销(si)
硬中断的开销(hi)
等待I/O的时间(wa)
内核态(sy)
用户态(us)
Request CPU
Limit CPU
CPU Cgroup参数的作用
CPU Cgroup相关的控制信息
控制组的层级关系
CPU使用的分类
通过CPU Cgroup的配置实现控制容器CPU资源的作用
Network
Storage
Memory
CPU
分配到的CPU数量
控制组目录层次结构图
Kubernetes中的CPU上限和相对比例
CPU Cgroup
Linux中的CPU使用的概念
Pod Spec中的"Request CPU"和"Limit CPU"
Cgroups技术限制资源
思考题
现象解释
CPU使用和CPU Cgroup
Kubernetes平台中的CPU资源限制
Namespace和Cgroups
怎么限制容器的CPU使用?
怎么限制容器的CPU使用?

该思维导图由 AI 生成,仅供参考

你好,我是程远。从这一讲开始,我们进入容器 CPU 这个模块。
我在第一讲中给你讲过,容器在 Linux 系统中最核心的两个概念是 Namespace 和 Cgroups。我们可以通过 Cgroups 技术限制资源。这个资源可以分为很多类型,比如 CPU,Memory,Storage,Network 等等。而计算资源是最基本的一种资源,所有的容器都需要这种资源。
那么,今天我们就先聊一聊,怎么限制容器的 CPU 使用?
我们拿 Kubernetes 平台做例子,具体来看下面这个 pod/container 里的 spec 定义,在 CPU 资源相关的定义中有两项内容,分别是 Request CPULimit CPU
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
env:
resources:
requests:
memory: "64Mi"
cpu: "1"
limits:
memory: "128Mi"
cpu: "2"
很多刚刚使用 Kubernetes 的同学,可能一开始并不理解这两个参数有什么作用。
这里我先给你说结论,在 Pod Spec 里的"Request CPU"和"Limit CPU"的值,最后会通过 CPU Cgroup 的配置,来实现控制容器 CPU 资源的作用。
那接下来我会先从进程的 CPU 使用讲起,然后带你在 CPU Cgroup 子系统中建立几个控制组,用这个例子为你讲解 CPU Cgroup 中的三个最重要的参数"cpu.cfs_quota_us""cpu.cfs_period_us""cpu.shares"。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了如何在Kubernetes平台中限制容器的CPU使用,以及Linux系统中的CPU使用分类和CPU Cgroup的工作原理。文章详细讲解了CPU Cgroup中的三个重要参数"cpu.cfs_quota_us"、"cpu.cfs_period_us"和"cpu.shares"的作用,以及如何通过这些参数来限制容器的CPU使用。通过实际例子和操作步骤,读者可以快速了解如何在容器中限制CPU使用,并对CPU Cgroup的工作原理有了深入的了解。文章还提出了思考题,引发读者思考和讨论。整体而言,本文内容丰富,涵盖了CPU资源管理的关键知识点,适合技术人员深入学习和交流。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《容器实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • Action
    为什么说“云平台里呢,大部分程序都不是实时调度的进程,而是普通调度(SCHED_NORMAL)类型进程”?这块不是很明白

    作者回复: 进程如果设置为SCHED_FIFO 或者SCHED_RR实时调度类型,那么只要进程任务不结束,就不会把cpu资源让给SCHED_NORMAL进程。这种实时的进程,在实时性要比较高的嵌入式系统中会用到,但是云平台中提供互联网服务的应用中不太会去用实时调度。

    2020-12-25
    13
  • 海盗船长
    老师,不太明白 “Request CPU就是无论其他容器申请多少 CPU 资源,即使运行时整个节点的 CPU 都被占满的情况下,我的这个容器还是可以保证获得需要的 CPU 数目”,这句话改怎么理解呢?当节点cpu都被占满的情况下,我的这个容器会去抢占吗? 另外cpu.shares是个权重,如何去保证Request CPU的数量?

    作者回复: 首先这个容器已经在节点上运行了,并且其他的容器也都配置了cpu.shares。 比如shares比例, group4: group3=3:1, 在一个4个CPU的节点上,我们先不用考虑limit, 对于group4,如果没有group3的程序运行,那么group4里的4个线程运行的时候可以占用4个CPU。当group3里的2个线程也运行起来了,即使2个线程最大可以消耗2个CPU,但是由于有了shares比例分配,那么group4里的线程仍然可以保证有3个CPU, 而分配给group3的只有1个CPU。 cpu.shares是个相对值,但是在Linux节点上一般的约定是以值1024为1个CPU的比例,当所有的配置都遵守这个约定的时候,那么给值N*1024, 就表示N个CPU的数量了。

    2020-11-25
    2
    5
  • 言希
    请问老师,我在环境上遇到 cpu.cfs_quota_us 取值为 -1 的,这种是不是代表的不限制CPU的使用 ?

    作者回复: 对的,不限制。

    2021-04-29
    3
  • Action
    老师,假如我有10个节点,每个节点的cpu核心数是40,只是调度pod,那么limit.cpu 可以设置为400吧?

    作者回复: 一个pod只能在一个节点上运行,如果一个节点上的cpu是40, 那么limit.cpu最大只能是40

    2020-12-25
    3
  • 兜兜
    请问下关于wa和hi/si的问题: 1. 例子中,wa是等待磁盘IO的状态,那等待网络IO时,是不是wa呢? 2. 例子中,hi/si是收到网卡中断,那收到磁盘中断时,是不是也是hi/si?

    作者回复: 网络I/O 没有wa状态部分。 hi/si 对于磁盘都是有的。

    2020-11-29
    3
  • 谦寻
    老师,您好,如果一个容器里面有多个进程,这个限制是针对所有进程,还是只是pid是1的进程?

    作者回复: 一般对于容器,是一个cgroup控制组里限制容器中的所有进程。

    2020-12-07
    2
  • 不二
    请问老师,cpu.rt_runtime_us一般是不是用不上,Linux系统中哪些程序会被配置为实时调度程序呢?如果没有实时调度程序这个参数也就没有了存在的必要吧

    作者回复: 一些嵌入式实时的程序需要实时调度的

    2021-01-14
    1
  • *
    老师, threads-cpu这个脚本能提供吗

    作者回复: 文稿里有链接的。 https://github.com/chengyli/training/tree/main/cpu/cgroup_cpu

    2022-02-27
    2
  • Geek_ce0af4
    评论区太精彩

    编辑回复: 后面高能更多~加油

    2021-08-30
  • 马成
    软中断我理解就是内部中断,系统调用是其中的一种。那么sy内核时间指的是系统调用时间么?si软中断时间包含系统调用时间么?我被搞糊涂了……

    作者回复: softirq 指 bottom half of interrupt, 是中断处理的一部分, 和系统调用是两个概念。 可以找一本Linux kernel的书籍看一下,比如Linux kernel development.

    2021-07-22
    2
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部