- mpstat(Multiprocessor Statistics)可以用top代替(按1):查看每个cpu的信息
- vmstat:查看所有cpu信息
- pidstat:查看具体的进程
进程状态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响应
cpu使用率:
CPU使用率低 & 负载高
总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低。
cpu使用率低负载高,原因分析 - 简书
相反,一个死循环就是cpu使用率高,负载低。
查看CPU负载命令
watch -d uptime:动态查看uptime负载
mpstat -P ALL 5:-P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据
和top有啥区别?按 1 显示所有 cpu 的负载,结果和 mpstat 基本一致
pidstat -u 5 1:显示哪个进程导致的cpu占用
什么是CPU上下文
每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器。
切换时机:
- 时间片轮转
- 系统资源不足
- sleep
- 高优先级进程抢占
-
vmstat 5:查看上下文切换
-
pidstat -w -u 1 :查看每个进程的上下文切换情况
pidstat比top更详细一点。
cswch:自愿上下文切换
- nvcswch:非自愿上下文切换
/proc/xxx/status:查看每个进程上下文切换的具体数量
watch -d cat /proc/interrupts :查看中断类型
总结
首先通过uptime查看系统负载,然后使用mpstat结合pidstat来初步判断到底是cpu计算量大还是进程争抢过大或者是io过多,接着使用vmstat分析切换次数,以及切换类型,来进一步判断到底是io过多导致问题还是进程争抢激烈导致问题。
导致cpu负载高的原因
- io?
- 上下文切换?
- 进程切换中断?
pstree命令【进程树】【找进程的父进程】
pstree -p 1:树状显示线程
pstree -aps 3084:查指定进程的父进程僵尸进程 & 孤儿进程
僵尸进程和僵死进程有什么区别? - 知乎
- 僵尸进程:父进程应该调用wait(),但没有调用。子进程一直占用进程表项。
- 孤儿进程:父进程结束,子进程交由init进程。
pidstat -d -p 4344 1 3 :查看进程io情况
strace -p 6082:跟踪进程系统调用
linux中断(软硬中断)
中断处理分为两个阶段:
- 上部分用来快速处理中断
- 下半部分延迟处理上半部分未完成的工作,以内核线程的方式运行
网卡收到数据,通过硬件中断通知内核有新数据。
- 【硬中断处理】上半部分把网卡的数据读到内存中,更新硬件寄存器状态,发送一个软中断信号。【硬件触发】【打断cpu任务,立即执行】
- 【软中断处理】下半部分,被软中断信号唤醒,从内存拿到数据,对数据进行处理。【内核触发】【内核线程执行,线程名ksoftirqd/x】
查看中断情况
/proc/softirqs 软中断情况
/proc/interrupts 硬中断情况
sar命令:查看网络
Linux系列之SAR命令使用详解_飞翔的博客-CSDN博客_sar命令
软中断高解决方法?
进程优先级
top命令的pr值是什么意思,跟nice值有什么关系 - 知乎