TOP命令详解
TOP命令详解
top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。
top的使用方式 top [-d number] | top [-bnp]
参数解释:
- -d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。
- -b:以批次的方式执行top。
- -n:与-b配合使用,表示需要进行几次top命令的输出结果。
- -p:指定特定的pid进程号进行观察。
在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的):
- ?:显示在top当中可以输入的命令
- P:以CPU的使用资源降序排序显示,默认
- M:以内存的使用资源降序排序显示
- N:以pid降序排序显示
- T:由进程使用的时间累计排序显示
- k:给某一个pid一个信号。可以用来杀死进程
- r:给某个pid重新定制一个nice值(即优先级)
- q:退出top(用ctrl+c也可以退出top)。
- 1:数字1,可以查看CPU核心的个数及详细信息
实例:
# top //每隔5秒显式所有进程的资源占用情况
# top -d 2 //每隔2秒显式所有进程的资源占用情况
# top -c //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
# top -p 12345 -p 6789 //每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
# top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数
# top -Hp 进程id // 显示某个进程下所有线程的资源占用情况
一、top前5行统计信息
第1行是任务队列信息,其参数如下:
内容 | 含义 |
---|---|
21:15:31 | 表示当前时间 |
up 180 days, 10:01 | 系统运行时间 格式为时:分,运行了180天10小时1分钟 |
1 users | 当前登录用户数 |
load average: 0.00, 0.01, 0.05 | 系统平均负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 |
什么是系统平均负载?平均负载可以理解为当前系统的平均活跃进程数,包含了系统处于可运行状态和不可中断状态的平均进程数,就是平均活跃进程数。
那么知道了什么是系统平均负载,那么它为多少时代表我们的系统负载较高呢?比如,此时1分钟的平均负载为5.6,而我们的操作系统是4个CPU,那么就代表此时系统负载过高,意味着有160%的的超载进程竞争不到CPU;若负载为2.0,则意味着有50%的CPU空闲。1分钟的系统负荷只是暂时现象,问题不大。应该主要观察"15分钟系统负荷",将它作为服务器正常运行的指标。
第2、3行为进程和CPU的信息 :
当有多个CPU时,这些内容可能会超过两行,其参数如下:
内容 | 含义 |
---|---|
108 total | 进程总数 |
2 running | 正在运行的进程数 |
106 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
内容 | 含义 |
---|---|
0.0 us | 用户空间占用CPU百分比 |
0.0 sy | 内核空间占用百分比 |
0.0 ni | 用户进程内改变过优先级的进程占用CPU百分比 |
100.0 id | 空闲CPU百分比 |
0.0 wa | 等待输入输出的CPU时间百分比 |
0.0 hi | 硬中断(Hardware IRQ)占用CPU的百分比 |
0.0 si | 软中断(Software Interrupts)占用CPU的百分比 |
0.0 st | 虚拟机占用百分比 |
第4、5行为内存信息,其参数如下 :
内容 | 含义 |
---|---|
KiB Mem: 3880176 total | 物理内存总量,单位:B |
166316 free | 空闲的物理内存总量,单位:B |
772292 used | 使用的物理内存总量,单位:B |
2941568 buff/cache | 用作内核缓存的内存总量,单位:B |
内容 | 含义 |
---|---|
KiB Swap: 0 total | 交换区总量,单位:B |
0 free | 空闲的交换区总量,单位:B |
0 used | 使用的交换区总量,单位:B |
2809396 avail Mem | 代表可用于进程下一次分配的物理内存数量 |
二、进程信息:
内容 | 含义 |
---|---|
PID | 进程id |
USER | 进程所有者的用户名 |
PR | 优先级 |
NI | nice值,负值表示高优先级,正值表示低优先级 |
VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
SHR | 共享内存大小,单位kb |
S | 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 |
%CPU | 上次更新到现在的CPU时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
COMMAND | 命令名/命令行 |
SWAP | 进程使用的虚拟内存中,被换出的大小,单位kb |
CODE | 可执行代码占用的物理内存大小,单位kb |
DATA | 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb |
RUSER | Real user name |
UID | 进程所有者的用户id |
GROUP | 进程所有者的组名 |
TTY | 启动进程的终端名。不是从终端启动的进程则显示为 ? |
P | 最后使用的CPU,仅在多CPU环境下有意义 |
TIME | 进程使用的CPU时间总计,单位秒 |
nFLT | 页面错误次数 |
nDRT | 最后一次写入到现在,被修改过的页面数。 |
WCHAN | 若该进程在睡眠,则显示睡眠中的系统函数名 |
Flags | 任务标志 |
三、进程的状态:
- R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。
- D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
- Z 是 Zombie 的缩写,它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。
- S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
- I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况。D 状态的进程会导致平均负载升高, I 状态的进程却不会。
四、CPU使用率过高排查思路:
1.使用top命令,然后按P按照CPU使用率降序排序,找到占用CPU过高的进程id
2.使用`ps -mp [进程id] -o THREAD,tid,time | sort -rm`获取线程信息,并找到占用CPU高的线程
3.使用`echo 'obase=16;[线程id]' | bc`或`echo 'obase=16;[线程id]' | printf "%x\n" [线程id]`将线程ID转为16进制
4.使用`jstack 进程id | grep "线程id的16进制" -A 30`打印线程的堆栈信息
5.从堆栈信息中找到是程序中的那几行代码是一直处于running状态的,从而定位问题。
6.定位问题后,将进程kill掉
五、实践
-
编写一个简单的springboot项目,其中编写一个死循环代码,将项目打成jar包上传服务器,并运行,然后调用接口触发死循环。
-
使用top命令查看进程的CPU使用率
发现有一个java项目的CPU使用率很高,接近100%,现在继续排查是什么原因导致的? -
现在知道是哪个进程但是不知道哪个线程导致的,执行如下命令:
ps -mp 82 -o THREAD,tid,time | sort -rm
查看线程信息:
-
拿到线程id,将线程id转为16进制,执行如下命令:
echo ‘obase=16;104’ | printf “%x\n” 104
-
使用jstack打印java虚拟机的堆栈信息,执行如下命令:
jstack 82 | grep “68” -A 30
找到处于正在运行的程序:
-
进入项目中查看,对应位置的代码:
-
找到问题,改掉代码,并kill掉进程
kill -9 82
更多推荐
所有评论(0)