Top指令

830 阅读4分钟

Load Average

image.png

  • 含义:

    • 在一段时间内,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 进行栈的查询

参考