知识卡片
独占核+碎片核的CPU弹性复用调度模型
内容
Eru在CPU资源调度上把应用申请的CPU数量拆分成两类来处理:独占核,完全绑定给单个容器专用;碎片核,每个容器最多只有一个碎片核,这个核会被多个容器共享。举例来说,如果一个容器申请3.2个CPU(假定一个CPU可以分成10份精细粒度),系统会通过CpuSet参数给这个容器绑定4个物理核(3个作为独占核完全属于它),同时把整体CPUShare统一设定为一个固定值(如1024*2);这4个核里会有一个核同时被其他最多5个容器共享,用来实现CPU资源真正意义上的弹性——在没有竞争的情况下,这个共享核对当前容器而言几乎等同于独占(能吃满这个核100%的用量),但一旦这个核被其他容器同时申请使用、遇上高峰期,系统会保证每个容器在这个共享核上至少能拿到自己申请的那个最低份额(比如20%),超出部分则取决于当时的竞争情况。这个设计巧妙地在”资源利用率”和”资源可预期性”之间做了折中:如果全部按独占核分配,大量CPU资源在容器负载不满的时候会被闲置浪费;如果全部按纯粹的份额比例共享,容器在高峰期能拿到多少资源完全不可预期。独占核+碎片核的组合让大部分资源(独占核部分)保持确定性,只留下极小一部分(每个容器仅一个碎片核)参与弹性共享,既保证了大部分场景下资源是可预期、稳定的,又通过这一小部分弹性共享的核,在整体层面提高了CPU资源的利用率、避免了纯独占模式下的浪费。这个思路对任何”既要保证资源可预期性、又想提升整体利用率”的资源调度场景都有参考价值:不必在”全独占”和”全共享”之间二选一,把大部分资源设计成确定性分配、只留一小部分参与弹性复用,往往能兼顾两方面的诉求。
参考来源
- 位置:《高可用架构(第1卷)》第4章《容器与云计算》"4.4 解析Docker在芒果TV的实践之路"节,"4.4.8 资源分配和集群调度"及"4.4.12 疑问与解惑"(源文件:_epub-src/OEBPS/Text/Chapter4_4_9.xhtml、Chapter4_4_13.xhtml)
- 结论依据:原文说明"我们把应用申请CPU的数目计算为2类,一类称之为独占核,一类为碎片核。一个Container有且仅有一个碎片核……其中一个核会跟其他5个Container共享,实现CPU资源的弹性",以及问答环节"对于这个container而言,0号核的资源是弹性的,最少能保证20%",共同支撑本卡片结论。
- 原始内容:我们把应用申请CPU的数目计算为2类,一类称之为独占核,一类为碎片核。一个Container有且仅有一个碎片核,比如申请为3.2个CPU……其中一个核会跟其他5个Container共享,实现CPU资源的弹性……对于这个container而言,0号核的资源是弹性的,最少能保证20%。