kubernetes资源
在K8s中定义Pod中运行容器有两个维度的限制:
- 资源需求(Requests):即运行Pod的节点必须满足运行Pod的最基本需求才能运行Pod。如 Pod运行至少需要2G内存,1核CPU。(软限制)
- 资源限额(Limits):即运行Pod期间,可能内存使用量会增加,那最多能使用多少内存,这就是资源限额。(硬限制)
# kubectl describe node node1.zcf.com
.......................
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits #这里显示的就是 资源的需求 和 限额
-------- -------- ------
cpu 250m (12%) 0 (0%)
memory 0 (0%) 0 (0%)
ephemeral-storage 0 (0%) 0 (0%)
Requests: 就是需求限制,也叫软限制
Limits:最大限制,也叫硬限制
通常来说:Limits >= Requests
并且requests 和 limits 通常要一起配置,若只配置了requests,而不配置limits,则很可能导致Pod会吃掉所有资源。
cgoup资源限制(cgroup)
- --cpu-period: 是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配。--cpu-period、--cpu-quota 两个参数是控制容器可以分配到的 CPU 时钟周期。
- --cpu-quota: 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。与--cpu-shares不同的是,这种配置是指定一个绝对值,容器对 CPU 资源的使用绝对不会超过配置的值。cpu-quota 的值默认为 -1, 表示不做控制。cpu-period 和 cpu-quota 参数一般联合使用。
- --cpu-shares:通过 cpu share 可以设置容器使用 CPU 的优先级。但具体cpu资源分配结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。
例如:两个容 器 A、B 的 CPU 份额分别为 1000 和 500,在CPU进行时间片分配的时候,容器A比容器B多一倍的机会获得 CPU 的时间片。但分配的结果取决于当时主机和其他容器的运行状态, 实际上也无法保证容器 A一定能获得CPU时间片。比如容器A的进程一直是空闲的,那么容器B是可以获取比容器A更多的CPU时间片的。极端情况下,例如主机上只运行了一个容器,即使它的 CPU 份额只有 50,它也可以独占整个主机的CPU资源。Cgroups 只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的CPU份额来确定有多少CPU资源分配给它。
- --cpuset-cpus:对多核 CPU 的服务器,Docker 还可以控制容器运行使用哪些 CPU 内核,即使用参数。这对具有多 CPU 的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。即:CPU内核绑定。
cpuset-cpus、cpuset-mems 参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的。
- --cpuset-mems:在多内存节点的服务器上可以通过--cpuset-mems设置容器使用哪些内存节点。
-
--memory:与操作系统类似,容器可使用的内存包括两部分:物理内存和 Swap。cgroup通过--memory设置物理内存的使用限额,例如 100M、1024M。
-
--memory-swap:通过--memory-swap可以设置内存+swap 的使用限额。
CPU
多核
cpu核心数指的是CPU内核数量,表示一个CPU由多少个核心组成。cpu核心是CPU的重要组成部件,在内核频率、缓存大小等条件相同的情况下,CPU核心数量越多,CPU的整体性能越强。
核心(Die)又称为内核,是CPU最重要的组成部分。CPU中心那块隆起的芯片就是核心,是由单晶硅以一定的生产工艺制造出来的,CPU所有的计算、接受/存储命令、处理数据都由核心执行。各种CPU核心都具有固定的逻辑结构,一级缓存、二级缓存、执行单元、指令级单元和总线接口等逻辑单元都会有科学的布局。
CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数
多个物理CPU,CPU通过总线进行通信,效率比较低。多核CPU,不同的核通过L2 cache进行通信,存储和外设通过总线与CPU通信。目前大部分cpu是L3 cache共享,L2 cache core独享如下:
超线程
多核超线程,每个核有两个逻辑的处理单元,两个核共同分享一个核的资源,如下:
以linuxi服务器为例输出的各项参数,其中CPU是四核的:
#查看CPU信息(型号)
[root@AAA ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
4 Intel(R) Xeon(R) CPU E5-2403 v2 @ 1.80GHz
# 查看物理CPU个数
[root@AAA ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
1
# 查看每个物理CPU中core的个数(即核数)
[root@AAA ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores : 4
# 查看逻辑CPU的个数
[root@AAA ~]# cat /proc/cpuinfo| grep "processor"| wc -l
4
#查看CPU的各项指标
[root@AAA ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 62
Stepping: 4
CPU MHz: 1800.057
BogoMIPS: 3600.11
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 10240K
NUMA node0 CPU(s): 0-3
K8s中CPU资源的分配
根据上述,我们知道2核2线程的CPU,可被系统识别为4个逻辑CPU,在K8s中对CPU的分配限制是通过cgroup对逻辑CPU做分片限制的。也就是说分配给容器一个CPU,实际是分配一个逻辑CPU。而且1个逻辑CPU还可被单独划分子单位,即 1个逻辑CPU,还可被划分为1000个millicore(毫核), 简单说就是1个逻辑CPU,继续逻辑分割为1000个豪核心。
豪核:可简单理解为将CPU的时间片做逻辑分割,每一段时间片就是一个豪核心。所以:500m 就是500豪核心,即0.5个逻辑CPU。
单位换算
K,M,G,T,P,E #通常这些单位是以1000为换算标准的。
Ki, Mi, Gi, Ti, Pi, Ei #这些通常是以1024为换算标准的。