1. 平衡负载
- 均载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程 数(不可中断状态实际上是系统对进程和硬件设备的一种保护机制。),也就是平均活跃进程数和CPU使用率没关系。如果数量为 2 ,在只有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。在 4 个CPU 的系统上,意味着 CPU 有 50% 的空闲。而在只有 1 个 CPU 的系统中,则意味着有一半的进程竞争不到 CPU。
- 平均负载和CPU使用率不同,I/O密集型也会导致平均负载升高,但是CPU使用率不一定很高
命令备忘
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
# 查看物理CPU个数
$ cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
-> 1
# 查看每个物理CPU中core的个数(即核数)
$ cat /proc/cpuinfo| grep "cpu cores"| uniq
-> 4
# 查看逻辑CPU的个数
$ cat /proc/cpuinfo| grep "processor"| wc -l
$ grep 'model name' /proc/cpuinfo | wc -l
-> 8
查看CPU信息(型号)
$ cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
-> 8 Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
# 2020年02月01日 Ubuntu 查看状态
$uptime
15:41:01 up 2 days, 21:03, 1 user, load average: 0.22, 0.33, 0.68
# 定位问题
# 安装stress 和 sysstat,先看状态,定位进程
$ watch -d uptime
$ mpstat -P ALL 5
$ pidstat -u 5 1
2. CPU 上下文
人和cpu一样看起来可以处理多任务,其实也是把不同的时间分配给不同的任务,并且上下文切换的时候也要浪费时间。不同的是机器可以一直做一个任务不累,但是人最好换一下,否则效率也会下降,所以也要人为的切换一下任务
- 根据任务的不同,CPU 的上下文切换就可以分为几个不同的场景,也就是进程上下 文切换、线程上下文切换以及中断上下文切换。
命令备忘
# cs(context switch)是每秒上下文切换的次数。
# in(interrupt)则是每秒中断的次数。
# r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
# b(Blocked)则是处于不可中断睡眠状态的进程数。
$ vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 1024 1212708 246464 2799540 0 0 25 28 404 51 6 2 92 0 0
# cswch: ,表示每秒自愿上下文切换 (voluntary context switches)的次数,所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
# nvcswch: ,表示每秒非自愿上下文 切换(non voluntary context switches)的次数。而非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
$ pidstat -w
Linux 4.15.0-76-generic (Ubuntu) 2020年02月02日 _x86_64_ (8 CPU)
17时59分52秒 UID PID cswch/s nvcswch/s Command
17时59分52秒 0 1 8.02 0.01 systemd
17时59分52秒 0 2 0.01 0.00 kthreadd
3. 基础篇
- CPU 使用率 = 1 - 空闲时间/总CPU时间