K8S中限制容器的CPU
k8s 的一个资源清单:
|
|
容器就是 Namespace 和 Cgroup,Namespace 做隔离、Cgroup 做资源限制。所以Cgroup下有一个 CPU Cgroup 来限制容器的使用的 CPU。
Linux 中普遍的调度算法是 CFS (Completely Fair Scheduler,完成公平调度),在CPU Cgroup中有两个跟CFS有关的参数:
-
cpu.cfs_period_us:是 CFS 算法的一个调度周期,一般它的值是 100000,以 microseconds 为单位,也就 100ms。
-
cpu.cfs_quota_us:表示 CFS 算法中,在一个调度周期里这个控制组被允许的运行时间,比如这个值为 50000 时,就是 50ms。
-
cpu.shares:表示在机器CPU被占满了的时候,各 CPU Cgroup 的分配比例。例如:有group1的cpu.shares=1024和group2的cpu.shares=3072,服务器一共4个CPU,
group1:group2=1:3
,即group1只能占用1个CPU,而group3能够占用3个CPU。
cpu.cfs_period_us/cpu.cfs_quota_us
占用的CPU,如:50ms/100ms=0.5个CPU
。一般cpu.cfs_period_us是固定的不修改,都是通过修改cpu.cfs_quota_us来限制CPU占用。
这些存放在/sys/fs/cgroup/cpu
,如/sys/fs/cgroup/cpu/group1
、/sys/fs/cgroup/cpu/group2
文件目录下写入文件:
-
cgroup.procs文件:该cgroup控制的pid
-
cpu.cfs_quota_us: 150000。限制为 1.5 CPU
-
cpu.shares:1024
requests.cpu 和 limits.cpu
requests.cpu 就是 cpu.share的值,它是确保即使在CPU满载的情况下,PID仍能获取到的CPU。
limits.cpu 就是 cpu.cfs_period_us/cpu.cfs_quota_us
的值,最大能获取的 CPU 。
假如服务有4个CPU:
1、在单独启动如下的容器时,该容器能占用的CPU为300%,即3个CPU。
|
|
2、如果再启动一个容器,下面这个容器能占用 3 个CPU,上面的容器占用的 CPU 就会被降为 1 个CPU
|
|
Request CPU 就是无论其他容器申请了多少 CPU ,即使运行时整个节点都被沾满的情况下,我的这个容器还是可以保证获取到需要的 CPU 数目。Limit CPU 就是限制容器能够申请的 CPU 上限。
解释:
服务器有4个CPU,在不考虑Limit CPU的情况下,而且都设置了cpu.shares。group2 运行的容器有四个线程运行的时候可以四个CPU。group1 有 2 个线程,当 group1 的容器也运行起来的时候,2个线程最大可以消耗2个CPU。由于group2的cpu.shares的设置,保证了group2可以占用3个CPU,而分配给group1的只有1个CPU。