CPU 的使用率和使用量
在 Linux 使用 top
命令可以动态看到该服务器上一些硬件指标,包括 CPU,一般可以通过查看某个进程的 CPU 使用率分析服务。CPU 使用率以百分比的形式展现,可以比较直观地看出服务 CPU 的使用情况。
而在容器、Kubernetes 环境下,一般以 CPU 使用量来计量,比如一台服务器是 16 核,那么可以分配 4 核给该容器或者 pod,这个 4 核就是 CPU 使用量。
CPU 使用率
CPU 使用率就是某个进程在一段时间内占用的 CPU 时间占总的 CPU 时间的百分比。
比如某个开启多线程的进程 1s 内占用了 CPU0 0.6s,CPU1 0.9s,使用的总时间就是:0.6s(CPU0)+ 0.9s(CPU1) = 1.5s。
使用率就是:1.5s / 1s × 100% = 150%
这个使用率是进程层面的累计 CPU 时间,统计时会加总所有线程在各个 CPU 上的运行时间,所以使用率超过 100% 是正常的,表示它在多个核上并行运行。在 Linux 中,top
这类工具中看到的 %CPU 就是这种含义。
简单理解:假设有 4 台机器(4 个 CPU),每台机器都干活 1 小时,那总计干了 4 小时的活,即使时间只过去了 1 小时,总工时就是 4 小时,对应就是 400%。
CPU 使用量
CPU 使用量是单位时间内进程实际消耗的总 CPU 时间,可以换算为 CPU 核心数(即 vCPU 数),用毫核(millicores)表示,更适合在多核环境下直观反映进程的计算强度。
计算公式如下:
1 | CPU 使用量(毫核,单位为 m) = CPU 使用率 × 1000(1 CPU = 1000m) |
比如某个开启多线程的进程 1s 内占用了 CPU0 0.6s,CPU1 0.9s,使用的总时间就是:0.6s(CPU0)+ 0.9s(CPU1) = 1.5s,使用率为 150%。
那么 CPU 的使用量就是:150% * 1000 = 1500m = 1.5CPU
也就是使用了 1.5 核心。
Kubernetes 中的 CPU 资源分配
在 Kubernetes 中定义的 resources 会传递给底层的 CRI,然后调用 Cgroups 为容器定义资源限制。
kubelet 会调用 Linux Kernel CFS(Completely Fair Scheduler,完全公平调度)來限制 Workload 的 CPU time 的使用率,要点如下:
- CPU 使用量的计算周期为 100ms
- CPU limit 决定了每个计算周期(100ms)内容器可以使用的 CPU 时间上限
- 若达到了 CPU limit,就会出现 CPU Throttling,也就是节流
- CPU limit 换算方法如下:
- 设置为 1 = 每 100ms 可以使用 100ms 的 CPU 时间
- 设置为 0.5 = 每 100ms 可以使用 50ms 的 CPU 时间
- 设置为 2 = 每 100ms 可以使用 200ms 的 CPU 时间
- 若容器中的应用是通过多线程运行的,在多个核心的情况下会将所有线程使用的 CPU 时间累加计算,所以整体仍然受到 CFS quota 的限制
一般情况下,如果 Pod 内的应用程序响应变慢了,就可以检查是否出现了 CPU Throttling,是的话说明需要增加 CPU 资源了。
install_url
to use ShareThis. Please set it in _config.yml
.