CPU性能监控top命令解析及问题定位实战

目录

      • 第一行,系统、任务统计信息:
      • 第二行,进程统计信息:
      • 第三行,cpu统计信息:
      • 第四行,内存统计信息:
      • 第五行,swap交换分区统计信息:
      • 最后就是各进程的监控:
    • Java项目问题定位
        • us 用户态进程消耗的 CPU 百分比过高
        • wa I/O读写等待消耗的CPU百分比过高
        • sy 内核消耗的CPU百分比过高
        • si 软中断消耗的CPU百分比过高

CPU监控命令为: top,在命令行输入top回车即可看到和下图类似的样子
CPU性能监控top命令解析及问题定位实战_第1张图片

第一行,系统、任务统计信息:

在这里插入图片描述
top -
10:54:39 - 当前系统时间
106 days, 15:01 - 系统已经运行了106天15小时1分钟(在这期间没有重启过)
1 user - 当前有一个用户登录系统
load average: 0.06, 0.03, 0.05 - 后面的三个分别是为 1分钟、5分钟、15分钟前到现在系统负载的平均值,转为百分比为6%,3%,5%

第二行,进程统计信息:

在这里插入图片描述
任务(进程):系统现在共有88个进程,其中处于运行中的有1个,87个在休眠,停止状态的有0个,僵尸状态的有0个
Tasks:
XX total - 进程总数
XX running - 正在运行的进程数
XX sleeping - 睡眠的进程数
XX stopped - 停止的进程数
XX zombie - 僵尸进程数

第三行,cpu统计信息:

在这里插入图片描述
Cpu占用百分比:用户占1.3%,内核占0.7%,改变过优先级的进程占0.0%,空闲98%,IO等待占0.0%,硬中断占0.0%,软终断占0.0%,被偷走的占0.0%
%Cpu(s):
XX us - 用户态进程消耗的CPU百分比
XX sy - 内核消耗的CPU百分比
XX ni - 用户进程空间内改变过优先级的进程占用CPU百分比
XX id - 空闲CPU百分比
XX wa - IO读写等待消耗的CPU百分比
XX hi - 硬中断(Hardware IRQ)消耗的CPU百分比
XX si - 软中断(Software IRQ)消耗的CPU百分比
XX st - 被偷走的CPU百分比

注:
IRQ:IRQ全称为Interrupt Request,即是“中断请求”的意思。
st:stole time 的缩写,该项指标只对虚拟机有效,表示分配给当前虚拟机的 CPU 时间之中,被同一台物理机上的其他虚拟机偷走的时间百分比

第四行,内存统计信息:

在这里插入图片描述
内存/KIB:物理内存总量为1882056kib=1.837G,空闲内存为67216kib=65M,使用中的内存614284kib=599M,缓存的内存量为1200556kib=1.173G
KiB Mem:
XXkib total - 物理内存总量
XXkib used -使用中的内存总量
XXkib free - 空闲内存总量
XXkib buff/cache - 缓存的内存量

注:
KIB:kilo binary byte的缩写,指的是千位二进制字节

第五行,swap交换分区统计信息:

在这里插入图片描述
交换分区/KiB:交换区总量为0,空闲交换区总量为0,使用的交换区总量为0,可用交换区总量为1078984Kib=1.053G
KiB Swap:
XXkib total - 交换区总量
XXkib used - 使用的交换区总量
XXkib free - 空闲交换区总量
XXkib avail Mem - 可用交换区总量

注:
对于内存监控,在top里要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这表示内存不够用了

最后就是各进程的监控:

在这里插入图片描述
PID - 进程id

USER - 进程所有者

PR - 进程优先级

NI - nice值。负值表示高优先级,正值表示低优先级

VIRT - virtual memory usage 虚拟内存
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

RES - resident memory usage 常驻内存
1、进程当前使用的内存大小,但不包括swap out
2、包含其他进程的共享
3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小

SHR - shared memory 共享内存
1、除了自身进程的共享内存,也包括其他进程的共享内存
2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
3、计算某个进程所占的物理内存大小公式:RES – SHR
4、swap out后,它将会降下来

DATA
1、数据占用的内存。如果top没有显示,按f键可以显示出来。
2、真正的该程序要求的数据空间,是真正在运行中要使用的。
S - 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

%CPU - 上次更新到现在的CPU时间占用百分比

%MEM - 进程使用的物理内存百分比

TIME+ - 进程使用的CPU时间总计,单位1/100秒

COMMAND - 进程名称(命令名/命令行)

top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下:
s – 改变画面更新频率
l – 关闭或开启第一部分第一行 top 信息的表示
t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N – 以 PID 的大小的顺序排列表示进程列表
P – 以 CPU 占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表
h – 显示帮助
n – 设置在进程列表所显示进程的数量
q – 退出 top
s – 改变画面更新周期

序号 列名 含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态。(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考 sched.h

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。

通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,方向键移动到要显示或隐藏的列点空格,按Esc键退出即可。
按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。
按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。

Java项目问题定位

us 用户态进程消耗的 CPU 百分比过高

  1. 首先通过top 查出最耗CPU的进程PID,这里标记为JID
  2. 通过top -Hp JID根据进程PID查找出最耗CPU的线程PID,这里标记为XID
  3. 将线程XID转换成16进制,printf "%x\n" XID,这里标记为16XID
  4. 查看堆栈,找到线程在干嘛,jstack JID | grep '16XID' -C5 --color
    最后,根据堆栈里的信息,找到对应的代码,搞定!

wa I/O读写等待消耗的CPU百分比过高

  1. iotop -o 看哪些线程正在读写磁盘,找出占比最高的那个
  2. 查看Java的进程ID ps -ef | grep XX项目
  3. 将线程ID转为16进制printf "%x\n" XID
  4. 查看堆栈,找到线程在干嘛,jstack 进程ID | grep '16进制线程ID' -C5 --color
    最后,根据堆栈里的信息,找到对应的代码,搞定!

sy 内核消耗的CPU百分比过高

sy这个值一般不会高,如果出现sy的值过高,不要先去考虑内核的问题,先查看是不是内存不足、磁盘满了、IO达到瓶颈、网络达到瓶颈;
内核高的分析思路和us高的分析思路差不多,但是这个进程可能不是应用的,而是系统自己的,系统的问题要看它的运行逻辑和配置文件,绝大多数情况是配置的问题。

  1. 首先通过top 查出最耗CPU的进程PID,这里标记为JID
  2. 通过top -Hp JID根据进程PID查找出最耗CPU的线程PID,这里标记为XID
  3. 将线程XID转换成16进制,printf "%x\n" XID,这里标记为16XID
  4. 查看堆栈,找到线程在干嘛,jstack JID | grep '16XID' -C5 --color
    最后,根据堆栈里的信息,找到对应的代码,搞定!

si 软中断消耗的CPU百分比过高

……

你可能感兴趣的:(性能测试,cpu,linux)