省流:
用一张图来解释top
命令,它就是:
解释
Top
命令用于显示Linux的运行状态,它提供了一个动态的,实时的系统监控视图。
一般情况下,这个命令会展示系统运行状态和各线程任务运行状态。
在这篇博客中,我将逐条解释其中的对应信息。
输入
top
后,会进入交互式命令模式。
按下q
退出。
上述内容:
top - 09:25:41 up 1 min, 3 users, load average: 0.27, 0.11, 0.04
Tasks: 127 total, 1 running, 126 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995488 total, 465908 free, 360852 used, 168728 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 488308 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 193552 6664 4160 S 0.0 0.7 0:01.78 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
5 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kworker/u256:0
6 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.04 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:00.17 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
12 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/1
13 root rt 0 0 0 0 S 0.0 0.0 0:00.01 migration/1
14 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/1
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
18 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kdevtmpfs
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
25 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
26 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
27 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
前五行是系统运行信息,后面是具体线程信息。
系统信息
第一行
top - 09:25:41 up 1 min, 3 users, load average: 0.27, 0.11, 0.04
09:25:41
:系统时间。
up 1 min
:系统运行不到一分钟。
up 70 days, 16:44
:系统运行70天又16小时44分钟。
3 users
:3个用户登录系统。
load average:0.27,0.11,0.04
:系统1min,5min,15min的负载状况。
如果值大于5
,则系统可能过载运行。
第二行
Tasks: 127 total, 1 running, 126 sleeping, 0 stopped, 0 zombie
总共运行了127个命令:1个运行中、126个休眠中、0个已结束和0个僵尸进程。
第三行
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
0.0 us
:用户空间占用CPU百分比。
0.0 sy
:内核空间占用CPU百分比。
0.0ni
:用户进程内改变过优先级的进程占用CPU百分比。
100.0 id
:空闲CPU百分比。
我的CPU大部分处于空闲,因为我没有运行任何高CPU负载的任务。
0.0 wa
:等待中CPU百分比(如果为高,则CPU正在等待I/O)。
0.0 hi
:硬中断(Hardware IRQ)占用CPU的百分比。
0.0 si
:软中断(Software Interrupts)占用CPU的百分比。
0.0 st
:等待访问物理CPU的虚拟CPU时间百分比。
最后两行
KiB Mem : 995488 total, 465908 free, 360852 used, 168728 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 488308 avail Mem
KiB Mem
9955488 total
:已消耗内存。
465908 free
:可用内存。
360852 used
:已消耗内存。
168728 buff/cache
:要写入的缓冲信息量。
KiB Swap
2097148 total
:交换空间内存总数。
2097148 free
:可用交换空间内存。
==0 used
:已使用交换空间内存。==
我们需要特别注意交换空间的已用内存(高亮部分)。
如果这个值不断变化,则证明内核和交换空间在不断交换内存,表明内存不足。
还需要注意KiB Mem中的free表示的是==未纳入内核管理的内存==,而不是实际空闲内存。
任务管理
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 193552 6664 4160 S 0.0 0.7 0:01.78 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
......
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
命令名/命令行
进程状态
R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。
D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
Z 是 Zombie 的缩写,它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。
S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发 生时,它会被唤醒并进入 R 状态。
I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况。D 状态的进程会导致平均负载升高, I 状态的进程却不会。
参数选项
top -d 3
设置更新时间为3秒(默认为5秒)。
top -n 2
最多显示两次刷新。
top -P
命令模式下的按键命令:
以下命令严格区分大小写。
?
:显示在top当中可以输入的命令
P
:以CPU的使用资源降序排序显示,默认
M
:以内存的使用资源降序排序显示
N
:以pid降序排序显示
T
:由进程使用的时间累计排序显示
k
:给某一个pid一个信号。可以用来杀死进程
r
:给某个pid重新定制一个nice值(即优先级)
q
:退出top(用ctrl+c也可以退出top)。
1
:数字1,可以查看CPU核心的个数及详细信息。
排查高CPU占用基本思路(Java为例)
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.定位问题后,将进程结束。
学无止境。
标签:20,0.0,TOP,命令,Linux,进程,00.00,root,CPU From: https://blog.51cto.com/ErickRen/8727960