• mpstat(Multiprocessor Statistics)可以用top代替(按1):查看每个cpu的信息
  • vmstat:查看所有cpu信息
  • pidstat:查看具体的进程

CPU - 图3
CPU - 图4
CPU - 图5

进程状态rdzsi

  • R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。
  • D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
  • Z 是 Zombie 的缩写,它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。
  • S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
  • I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况。要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会。
  • T 或者 t,也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态。
  • X,也就是 Dead 的缩写,表示进程已经消亡,所以不会在 top 或者 ps 命令中看到它。

    平均负载与cpu使用率

    uptime:查看负载
    平均负载是指单位时间内,系统处于可运行状态(cpu负载)和不可中断状态(io负载)平均进程数(就是上面的R、D状态),也就是平均活跃进程数

  • 平均负载为2:在只有2个CPU核心的系统上,意味着所有CPU核心数都刚好被完全占用。在有4个CPU核心的系统上,意味着CPU有50%的空闲。

  • 查看cpu个数:grep ‘model name’ /proc/cpuinfo | wc -l

最近1分钟的负载值63% + 上一次最近1分钟负载值37%=最近一分钟显示负载值
看懂Load Average - 简书

cpu load中所说的不可中断状态到底是啥?
Load average 不直接代表 CPU 利用率可能是 io 阻塞比较多
不可中断状态:ps状态D,硬件设备的IO响应
image.png
cpu使用率:
image.png

CPU使用率低 & 负载高

总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低。

cpu使用率低负载高,原因分析 - 简书
相反,一个死循环就是cpu使用率高,负载低。

查看CPU负载命令

watch -d uptime:动态查看uptime负载

image.png

mpstat -P ALL 5:-P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据

和top有啥区别?按 1 显示所有 cpu 的负载,结果和 mpstat 基本一致

image.png

pidstat -u 5 1:显示哪个进程导致的cpu占用

image.png

image.png

什么是CPU上下文

每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器。

切换时机:

  • 时间片轮转
  • 系统资源不足
  • sleep
  • 高优先级进程抢占
  • 硬件中断

    vmstat 5:查看上下文切换

    image.png
    image.png

  • b:等待io,可能读盘或写盘比较多。

    pidstat -w -u 1 :查看每个进程的上下文切换情况

    pidstat比top更详细一点。
    image.png

  • cswch:自愿上下文切换

  • nvcswch:非自愿上下文切换

image.png

/proc/xxx/status:查看每个进程上下文切换的具体数量

image.png

watch -d cat /proc/interrupts :查看中断类型

image.png

总结

首先通过uptime查看系统负载,然后使用mpstat结合pidstat来初步判断到底是cpu计算量大还是进程争抢过大或者是io过多,接着使用vmstat分析切换次数,以及切换类型,来进一步判断到底是io过多导致问题还是进程争抢激烈导致问题。

导致cpu负载高的原因

  1. io?
  2. 上下文切换?
  3. 进程切换中断?

    pstree命令【进程树】【找进程的父进程】

    pstree -p 1:树状显示线程
    pstree -aps 3084:查指定进程的父进程

    僵尸进程 & 孤儿进程

    僵尸进程和僵死进程有什么区别? - 知乎
    image.png
  • 僵尸进程:父进程应该调用wait(),但没有调用。子进程一直占用进程表项。
  • 孤儿进程:父进程结束,子进程交由init进程。

    pidstat -d -p 4344 1 3 :查看进程io情况

    image.png

    strace -p 6082:跟踪进程系统调用

linux中断(软硬中断)

中断处理分为两个阶段:

  1. 上部分用来快速处理中断
  2. 下半部分延迟处理上半部分未完成的工作,以内核线程的方式运行

网卡收到数据,通过硬件中断通知内核有新数据。

  • 【硬中断处理】上半部分把网卡的数据读到内存中,更新硬件寄存器状态,发送一个软中断信号。【硬件触发】【打断cpu任务,立即执行】
  • 【软中断处理】下半部分,被软中断信号唤醒,从内存拿到数据,对数据进行处理。【内核触发】【内核线程执行,线程名ksoftirqd/x】

零拷贝

查看中断情况

/proc/softirqs 软中断情况
/proc/interrupts 硬中断情况
CPU - 图20

sar命令:查看网络

Linux系列之SAR命令使用详解_飞翔的博客-CSDN博客_sar命令

软中断高解决方法?

image.png

进程优先级

image.png
top命令的pr值是什么意思,跟nice值有什么关系 - 知乎