本文最后更新于:2020年11月20日 晚上

uptime:获取当前时间、系统运行时间、登录用户数、平均负载
平均负载:单位时间内,系统处于可运行状态和不可中断状态的平均进程数,即平均活跃进程数
获取CPU核数:
top
grep ‘model name’ /proc/cpuinfo | wc -l
负载过高:平均负载>CPU数量*70%
pidstat -u 5 1:查看进程的cpu使用情况(每5s输出一组数据)

Linux多任务:linux系统在很短时间内,将cpu轮流分配给多个任务,造成多任务同时运行的错觉
CPU寄存器:CPU内置的小容量、速度极快的内存
程序计数器:存储CPU正在执行的指令位置、或即将执行的下一指令的位置
CPU上下文:CPU寄存器和程序计数器
CPU上下文切换:把前一任务的CPU上下文保存在内核,在任务重新调度时再加载到CPU;然后加载新任务的上下文,并跳转到程序计数器所指的新位置,运行新任务
1)进程上下文切换:
进程在用户空间运行时被称为进程的用户态,陷入内核空间的时被称为进程的内核态;
进程从用户态到内核态的转变,是通过内核的系统调用,在同一个进程运行,称为特权模式切换;
进程上下文切换需要内核在CPU上运行,从一个进程切换到另一个进程;
2)线程上下文切换:
线程是调度的基本单位,而进程则是资源拥有的基本单位;
前后两个线程属于不同进程时资源不共享,切换过程和进程上下文切换一样;
前后两个线程属于同一个进程时,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源保持不动,只需切换线程的私有数据、寄存器等不共享的数据。
3)中断上下文切换:
为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件。在中断其他进程时,需要保存当前进程的状态,但不包括用户态信息。对同一个 CPU 来说,中断处理比进程拥有更高的优先级

CPU上下文切换情况查看:vmstat、pidstat
cs(context switch)是每秒上下文切换的次数。
in(interrupt)则是每秒中断的次数。
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待CPU的进程数。
b(Blocked)则是处于不可中断睡眠状态的进程数。
自愿上下文切换:指进程无法获取所需资源,导致的上下文切换。如, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
非自愿上下文切换:指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。

平均CPU使用率=1-(一段时间内空闲时间差值)/(一段时间内总CPU时间差值)
进程状态:
进程有R(正在/等待运行)、D(不可中断睡眠)、Z(僵尸进程)、S(可中断睡眠)、I(空闲状态)、T(暂停或跟踪)、X(死亡进程)七个状态
其中,不可中断状态,表示进程正在跟硬件交互,为了保护进程数据和硬件的一致性,系统不允许其他进
程或中断打断这个进程。进程长时间处于不可中断状态,通常表示系统有 I/O 性能问题。
僵尸进程表示进程已经退出,但它的父进程还没有回收子进程占用的资源。
相关联的进程使用进程组和会话进行管理

iowait过高排查: dstat、pidstat 等工具,确认是否磁盘 I/O 的问题。再使用ps 命令找到的 D 状态(即不可中断状态)的进程,查看是否是这些进程导致等待I/O
僵尸进程排查:使用 pstree 找出父进程后,去查看父进程的代码,检查 wait() /waitpid() 的调用,或是 SIGCHLD 信号处理函数的注册