https://www.jianshu.com/p/2b6658ad59b3
平均负载:单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数, 它和 CPU 使用率并没有直接关系。
可运行状态的进程: 正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps
命令看到的处于 R 状态(Running 或 Runnable) 的进程。
不可中断状态的进程: 正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应, 也就是我们在 ps
命令中看到的 D 状态(Uninterruptible Sleep, 也称为 Disk Sleep) 的进程。
$ grep 'model name' /proc/cpuinfo | wc -l
2
uptime
给了我们三个不同时间间隔的平均值,给我们提供了分析系统负载趋势的数据来源,让我们更全面、更立体地理解目前的负载情况。
1 分钟
、5 分钟
、15 分钟
的三个值基本相同,或者相差不大,说明系统负载很平稳。1 分钟
的值远小于15 分钟
的值,说明系统最近 1分钟的负载在减少,而过去15 分钟内却有很大的负载1 分钟
的值远大于 15 分钟
的值,就说明最近 1 分钟的负载在增加。一旦 1 分钟
的平均负载接近或超过了 CPU 的个数,就意味着系统正在发生过载的问题。平均负载不仅包括了正在使用 CPU 的进程,还包括了等待CPU和等待 I/O的进程。
CPU使用率是指单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。比如:
uptime
: 当前时间、系统运行时间、正在登录用户数、过去1分钟、5分钟、15分钟的平均负载$ uptime
00:19:43 up 2 min, 1 user, load average: 3.15, 1.54, 0.60
# -d 参数表示高亮显示变化的区域
$ watch -d uptime
Every 2.0s: uptime Wed Dec 26 00:21:14 2018
00:21:14 up 3 min, 1 user, load average: 0.87, 1.23, 0.58
mpstat
: 查看 CPU 使用率的变化情况# -P ALL 表示监控所有 CPU, 后面数字 5 表示间隔 5 秒输出一组数据
$ mpstat -P ALL 5
Linux 4.15.0-42-generic (c5220056-VirtualBox) 12/26/2018 _x86_64_ (2 CPU)
12:22:14 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
12:22:19 AM all 4.55 0.00 3.31 0.00 0.00 0.21 0.00 0.00 0.00 91.93
12:22:19 AM 0 4.32 0.00 3.50 0.00 0.00 0.00 0.00 0.00 0.00 92.18
12:22:19 AM 1 4.80 0.00 2.92 0.00 0.00 0.42 0.00 0.00 0.00 91.86
pidsta
# 间隔 5 秒后输出一组数据
$ pidstat -u 5 1
Linux 4.15.0-42-generic (c5220056-VirtualBox) 12/26/2018 _x86_64_ (2 CPU)
12:24:54 AM UID PID %usr %system %guest %CPU CPU Command
12:24:59 AM 0 1392 0.00 0.20 0.00 0.20 1 kworker/u4:25
12:24:59 AM 0 5863 0.00 0.20 0.00 0.20 0 dockerd
12:24:59 AM 0 6097 0.00 0.20 0.00 0.20 1 docker-containe
12:24:59 AM 0 7341 1.20 2.20 0.00 3.39 1 Xorg
12:24:59 AM 1000 8425 7.78 0.60 0.00 8.38 1 compiz
12:24:59 AM 1000 8500 0.20 0.00 0.00 0.20 1 vmtoolsd
12:24:59 AM 1000 8808 0.80 0.20 0.00 1.00 0 gnome-terminal-
12:24:59 AM 1000 9563 0.00 0.40 0.00 0.40 0 pidstat
Average: UID PID %usr %system %guest %CPU CPU Command
Average: 0 1392 0.00 0.20 0.00 0.20 - kworker/u4:25
Average: 0 5863 0.00 0.20 0.00 0.20 - dockerd
Average: 0 6097 0.00 0.20 0.00 0.20 - docker-containe
Average: 0 7341 1.20 2.20 0.00 3.39 - Xorg
Average: 1000 8425 7.78 0.60 0.00 8.38 - compiz
Average: 1000 8500 0.20 0.00 0.00 0.20 - vmtoolsd
Average: 1000 8808 0.80 0.20 0.00 1.00 - gnome-terminal-
Average: 1000 9563 0.00 0.40 0.00 0.40 - pidstat
在每个任务运行前, CPU 都需要知道任务从哪里加载、又从哪里开始运行、也就是说,需要系统事先给他设置好 CPU 寄存器和程序计数器(Program Counter, PC)
CPU 寄存器:是 CPU 内置的容量小、但速度极快的内存。
程序计数器:是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。
它们都是 CPU 在运行任何任务前,比如的依赖环境,因此也被叫做 CPU 上下文。
上下文切换:就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。
, CPU 的上下文切换可以分为进程上下文切换、线程上下文切换以及中断上下文切换。
Linux 按照特权等级,把进程的运行空间分为内核空间
和用户空间
用户空间(Ring 3)只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用陷入到内核中,才能访问这些特权资源。
进程上下文切换和系统调用的区别
进程是由内核来管理和调度的,进程的切换只能发生在内核态。所以,进程的上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态。
系统调用过程中,并不涉及到虚拟内存等进程用户态的资源,也不会切换进程。
因此,进程的上下文切换比系统调用时多了一步:在保存当前进程的内核状态和CPU寄存器之前,需要先把该进程的虚拟内存、栈等保存下来;而加载了下一个进程的内核态后,还需要刷新进程的虚拟内存和用户栈。
什么时候会切换进程上文
线程和进程的区别
线程的上下文切换两种情况
中断处理会打断进程的正常调度和执行。在打断其他进程时,需要将进程当前的状态保存下来,中断结束后,进程仍然可以从原来的状态恢复运行。
进程上下文切换和中断上下文切换的区别
进程上下文切换和中断上文切换的相同之处
vmstat
:常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断次数。cs (context switch)
:每秒上下文切换的次数。in (interrupt)
:每秒中断的次数。r (Running or Runnable)
:就绪队列的长度,也就是正在运行和等待 CPU 的进程数。b (Blocked)
:处在不可中断睡眠状态的进程数。# 每隔 5 秒输出 1 组数据
$ 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 0 5014224 290736 2060812 0 0 33 37 100 327 6 1 92 0 0
1 0 0 5014204 290736 2060844 0 0 0 0 321 926 4 1 95 0 0
注:vmstat
只给出了系统总体的上下文切换情况
pidstat -w
:查看每个进程的上下文切换情况cswch
:每秒自愿上下文切换(voluntary context switches) 的次数。nvcswch
:每秒非自愿上下文切换(non voluntary context switches) 的次数。# 每隔 5 秒输出 1 组数据
$ pidstat -w 5
Linux 4.15.0-42-generic (c5220056-VirtualBox) 12/26/2018 _x86_64_ (2 CPU)
05:47:58 AM UID PID cswch/s nvcswch/s Command
05:48:03 AM 0 7 0.20 0.00 ksoftirqd/0
05:48:03 AM 0 8 15.57 0.00 rcu_sched
05:48:03 AM 0 11 0.20 0.00 watchdog/0
05:48:03 AM 0 14 0.20 0.00 watchdog/1
注:pidstat
默认显示进程的指标数据,加上 -t
参数后,才会输出线程的指标。
/proc/interrupts
:查看中断发生的类型# -d 参数表示高亮显示变化的区域
$ watch -d cat /proc/interrupts
根据上下文切换的类型做具体分析
查看/proc/stat
,提供的是系统的 CPU 和任务统计信息。
USER_HZ
, 也就是 10 ms(1/100秒)$ cat /proc/stat |grep ^cpu
cpu 3177 0 5996 34551 917 0 191 0 0 0
cpu0 1582 0 2980 17287 472 0 76 0 0 0
cpu1 1594 0 3016 17264 445 0 114 0 0 0
CPU使用率相关的重要指标
user(us)
,代表用户态 CPU 时间。nice(ni)
,代表低优先级用户态 CPU 时间,也就是进程的 nice
值被调整为 1-19 之间时的 CPU 时间。nice
可取值范围是 -20 到 19, 数值越大,优先级反而越低system (sys)
,代表内核态 CPU 时间。idle(us)
,代表空闲时间。注意,这里它不包括等待 I/O 的时间(iowait
)。iowait(wa)
,代表等待 I/O 的 CPU 时间。irq(hi)
,代表处理硬中断的 CPU 时间softirq(si)
,代表处理软中断的CPU 时间。steal(st)
,代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。giest_nice(gnice)
,代表以低优先级运行虚拟机的时间。CPU使用率的计算
查看 CPU 使用率
top
:显示系统总体的CPU 和内存使用情况,以及各个进程的资源使用情况。ps
:只显示了每个进程的资源使用情况。top 的输出:
# 默认每 3 秒刷新一次
top - 14:15:36 up 1:05, 1 user, load average: 0.27, 0.22, 0.15
Tasks: 248 total, 1 running, 179 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.2 us, 0.7 sy, 0.0 ni, 98.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8168764 total, 6196696 free, 810812 used, 1161256 buff/cache
KiB Swap: 2095100 total, 2095100 free, 0 used. 7016500 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8455 c5220056 20 0 1395968 229828 81832 S 3.0 2.8 4:44.39 compiz
6739 root 20 0 472636 106196 35576 S 1.7 1.3 0:30.13 Xorg
8751 c5220056 20 0 595952 35720 28220 S 0.7 0.4 0:01.41 gnome-terminal-
6033 root 20 0 568528 68736 39208 S 0.3 0.8 0:11.10 dockerd
10547 c5220056 20 0 49020 3868 3132 R 0.3 0.0 0:00.02 top
1 root 20 0 185428 6020 3968 S 0.0 0.1 0:04.82 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
7 root 20 0 0 0 0 S 0.0 0.0 0:00.31 ksoftirqd/0
8 root 20 0 0 0 0 I 0.0 0.0 0:01.22 rcu_sched
9 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_bh
10 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/0
11 root rt 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/0
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/