Load Average
-
含义:
- 在一段时间内,CPU正在处理以及等待CPU处理的进程数之和。 三个数字分别代表了1分钟,5分钟,15分钟的统计值。
-
啥是平均负载
-
误区纠正: 这里平均负载(如0.01)并不是CPU的使用率是 1%。而是系统处于可运行状态和不可中断状态的平均进程数,或称为平均活跃进程数,它和
CPU 使用率并没半毛钱关系。 -
可运行状态: 处于 R 状态(Running 或 Runnable)的进程,可以使用 ps命令中看到的R状态进程
-
不可中断状态: 处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态。
- 例如,进程正在向磁盘写入数据,在得到磁盘回复前,该进程不能被打断。这是为了保证磁盘数据和进程数据的一致性。所以,不可中断状态实际上是系统对进程和硬件设备的一种保护机制。
理想状态下,平均负载等于CPU个数,是正好将机器的性能发挥到极致,又不至于有一部分进程得不到执行。
逐行分析
第一行:
top - 20:41:08 up 18 days, 5:24, 2 users, load average: 0.04, 0.03, 0.05
top:当前时间
up:机器运行了多少时间
users:当前有多少用户
load average:分别是过去1分钟,5分钟,15分钟的负载
第二行:
Tasks: 216 total, 1 running, 215 sleeping, 0 stopped, 0 zombie
Tasks:当前有多少进程
running:正在运行的进程
sleeping:正在休眠的进程
stopped:停止的进程
zombie:僵尸进程
第三行:
%Cpu(s): 0.2 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
us: 用户进程占CPU的使用率
sy: 系统进程占CPU的使用率
ni: 用户进程空间改变过优先级
id: 空闲CPU占用率
wa: 等待输入输出的CPU时间百分比
hi: 硬件的中断请求
si: 软件的中断请求
st: steal time
-
wa只代表磁盘IO Wait,不包括网络IO Wait。
-
wa 代表的是 在DMA模式下执行IO操作是不占用CPU的,所以CPU IO等待(上图的wa)实际上属于CPU空闲率的一部分。
-
需要特别注意一个点:JAVA线程的 Runnable 状态 对应在 操作系统中的线程状态可能是 Ready 也可能是 Wait,也肯能是 running
第四行&第五行
KiB Mem : 65810456 total, 30324416 free, 9862224 used, 25623816 buff/cache
KiB Swap: 7999484 total, 7999484 free, 0 used. 54807988 avail Mem
total:内存总量
free:空闲内存
used:使用的
buffer/cache: 写缓存/读缓存
第五行往下
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
19868 root 20 0 19.733g 369980 15180 S 0.7 0.6 129:53.91 java
19682 root 20 0 19.859g 5.766g 22252 S 0.3 9.2 139:42.81 java
54625 100 20 0 50868 33512 4104 S 0.3 0.1 0:04.68 fluentd
PID:进程id
USER:进程所有者
PR:优先级。数值越大优先级越高
NI:nice值,负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存总量
SWAP:进程使用的虚拟内存中被换出的大小
RES:进程使用的、未被换出的物理内存大小
SHR:共享内存大小
SHR:共享内存大小
S:进程状态。D表示不可中断的睡眠状态;R表示运行;S表示睡眠;T表示跟踪/停止;Z表示僵尸进程。
%CPU:上次更新到现在的CPU占用百分比 ;
%MEM:进程使用的物理内存百分比 ;
TIME+:进程使用的CPU时间总计,单位1/100秒;
COMMAND:命令名/命令行
查询 CPU 最高的线程
- 先查询出使用 CPU 最高的进程 toc -c
- 找到内部使用CPU 最高的线程 toc -Hp 《线程号》
- -p <进程号> 指定进程
- -H 开启线程查看
- 如果是java 的程序,需要将其转为成为16进制的,再通过jstack 进行栈的查询