top命令

简介

    top命令能够实时地对CPU的状态进行监视,可以按CPU使用、内存使用和执行时间对任务进行排序。用户可以通过按键来实时刷新当前的状态。
top.png

显示含义

1
2
3
4
5
top - 15:10:45 up 318 days, 19:44,  1 user,  load average: 0.00, 0.02, 0.05
Tasks: 86 total, 1 running, 85 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 0.3 sy, 0.0 ni, 98.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1883492 total, 74140 free, 1494716 used, 314636 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 216132 avail Mem

    上面这部分内容代表了系统的整体运行情况。

  • 第一行是任务队列信息,同uptime命令的执行结果一致。
1
2
3
4
15:10:45       #当前时间 
up 318 days #系统已经运行时间
1 user #当前登录用户数
load average: 0.00, 0.02, 0.05 #系统负载,即任务队列的平均长度。三个数值分别为1分钟、5分钟、15分钟前到现在的平均值。
  • 第二、三行代表进程和CPU的信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Tasks:  
86 total #进程总数
1 running #正在运行的进程数
85 sleeping #睡眠的进程数
0 stopped #停止的进程数
0 zombie #僵尸进程数
%Cpu(s):
0.7 us #运行用户进程占用的CPU百分比
0.3 sy #运行系统进程占用的CPU百分比
0.0 ni #运行已调整优先级的用户进程的CPU百分比
98.7 id #空闲CPU百分比
0.3 wa #等待IO完成的CPU百分比
0.0 hi #处理硬中断占用百分比
0.0 si #处理软中断占用百分比
0.0 st #虚拟机占用CPU百分比

    当us值过高时,表示运行的应用消耗大量的CPU。java应用造成us高的原因主要是线程一直处于可运行(Runnable)状态,通常这些线程在执行无阻塞、循环、正则或纯粹的计算等任务造成的;另外一个可能也会造成us高的原因是频繁GC。

    当sy值高时,表示linux花费了更多的时间在进行java线程切换。java应用造成这种现象的主要原因是启动的线程比较多,且这些线程多数处于不断的阻塞(例如锁等待,IO等待状态)和执行状态的变化过程中,这就导致了操作系统要不断地切换执行的线程,产生大量的线程上下文切换。

  • 第四、五行为内存和交换区(类似于windows的虚拟内存,Linux才有的概念)信息
1
2
3
4
5
6
7
8
9
10
KiB Mem : 
1883492 total #物理总内存
74140 free #空闲的物理内存
1494716 used #已使用物理内存
314636 buff/cache #系统的page cache和buffer使用到的内存
KiB Swap:
0 total #交换区总量
0 free #空闲的交换区总量
0 used #已使用交换区的总量
216132 avail Mem #可用的交换区总量

    对于buff/cache的占用过高的解决可以看下Linux中buff-cache占用过高解决手段

    默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。下面是他们的含义

1
2
3
4
5
6
7
8
9
10
11
12
PID         #进程ID
USER     #进程所有者ID
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 #命令名/命令行

命令使用格式

1
top [-] [d] [p] [q] [c] [C] [S] [s]  [n]

参数说明

  • d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
  • p 通过指定监控进程ID来仅仅监控某个进程的状态。
  • q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
  • S 指定累计模式
  • s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
  • i 使top不显示任何闲置或者僵死进程。
  • c 显示整个命令行而不只是显示命令名

常用操作

1
2
3
4
5
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命令,可以直接键入以下命令,动态显示结果。如果在命令中使用了s选项,其中一些命令可能会被屏蔽。

  • h 显示帮助画面,给出一些简短的命令总结说明
  • k 终止一个进程。
  • i 忽略闲置和僵死进程。这是一个开关式命令。
  • q 退出程序
  • r 重新安排一个进程的优先级别
  • S 切换到累计模式
  • s 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5 s
  • f或者F 从当前显示中添加或者删除项目
  • o或者O 改变显示项目的顺序
  • l 切换显示平均负载和启动时间信息
  • m 切换显示内存信息
  • t 切换显示进程和CPU状态信息
  • c 切换显示命令名称和完整命令行
  • M 根据驻留内存大小进行排序
  • P 根据CPU使用百分比大小进行排序
  • T 根据时间/累计时间进行排序
  • W 将当前设置写入~/.toprc文件中

参考资料