• 前言
  • 一.top命令格式说明
  • 1.1 top命令输入时参数介绍
  • 1.2 top运行时交互命令介绍
  • 1.3 top命令结果显示介绍
  • 1.3.1 统计信息区
  • 1.3.2 进程(任务)状态监控信息区
  • 二.使用示例
  • 1.显示进程完整命令
  • 2.以批处理模式显示程序信息
  • 3.以累积模式显示程序信息
  • 4.设置信息更新次数
  • 5.设置信息更新时间
  • 6.显示指定进程的信息
  • 7.显示指定用户的进程信息
  • 三.实用技巧
  • 四.总结


前言

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

一.top命令格式说明


1.1 top命令输入时参数介绍

1.命令格式:

    top [参数]

2.命令功能:

    显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等

3.命令参数:

    -c 显示完整的治命令

    -I 忽略失效过程

    -s 保密模式

    -S 累积模式

    -i 不显示闲置或者僵死进程

    -u <用户名> 指定用户名

    -p <进程号> 指定进程,例如:top -p 1

    -n <次数> 循环显示的次数

    -h:help表示显示帮助的意思

    -v:version显示版本的意思,和-h的功能一样

    -d <时间> :delay进入top后,top会定时刷新状态,这个值就是设置几秒刷新一次

    -b:批处理(Batch mode),top刷新状态默认是在原数据上刷新,使用这个参数后,会一屏一屏的显示数据。结合重定向功能和计划任务,这个参数在记录服务器运行状态时非常有用。

1.2 top运行时交互命令介绍

在top 命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了s (保密模式)选项, 其中一些命令可能会被屏蔽。

h 显示帮助画面,给出一些简短的命令总结说明

k 终止一个进程。

i 忽略闲置和僵死进程。这是一个开关式命令。

q 退出程序

r 重新安排一个进程的优先级别

S 切换到累计模式

s 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s

f或者F 从当前显示中添加或者删除项目

o或者O 改变显示项目的顺序

l 切换显示平均负载和启动时间信息

m 切换显示内存信息

t 切换显示进程和CPU状态信息

c 切换显示命令名称和完整命令行

M 根据驻留内存大小进行排序

P 根据CPU使用百分比大小进行排序

T 根据时间/累计时间进行排序

W 将当前设置写入~/.toprc文件中 



c: 显示完整的命令
d: 更改刷新频率
f: 增加或减少要显示的列(选中的会变成大写并加*号)
F: 选择排序的列
h: 显示帮助画面
H: 显示线程
i: 忽略闲置和僵死进程
k: 通过给予一个PID和一个signal来终止一个进程。(默认signal为15。在安全模式中此命令被屏蔽)
l:  显示平均负载以及启动时间(即显示影藏第一行)
m: 显示内存信息
M: 根据内存资源使用大小进行排序
N: 按PID由高到低排列
o: 改变列显示的顺序
O: 选择排序的列,与F完全相同
P: 根据CPU资源使用大小进行排序
q: 退出top命令
r: 修改进程的nice值(优先级)。优先级默认为10,正值使优先级降低,反之则提高的优先级
s: 设置刷新频率(默认单位为秒,如有小数则换算成ms)。默认值是5s,输入0值则系统将不断刷新
S: 累计模式(把已完成或退出的子进程占用的CPU时间累计到父进程的MITE+ )
T: 根据进程使用CPU的累积时间排序
t: 显示进程和CPU状态信息(即显示影藏CPU行)
u: 指定用户进程
W: 将当前设置写入~/.toprc文件,下次启动自动调用toprc文件的设置
<: 向前翻页
>: 向后翻页
?: 显示帮助画面
1(数字1): 显示每个CPU的详细情况
<Space>:立即刷新

1.3 top命令结果显示介绍

当我们在shell中输入命令top可以看到所有的进程信息结果:

top - 09:56:45 up 2 days, 19:29,  1 user,  load average: 0.07, 0.03, 0.05
Tasks:  65 total,   2 running,  63 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 :  1016124 total,    64100 free,   386400 used,   565624 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   475136 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                                        
 1394 root      20   0 2347964 211592  15180 S  1.0 20.8   6:19.68 java                                                                                                                                                           
    1 root      20   0   43288   3676   2504 S  0.0  0.4   0:02.63 systemd                                                                                                                                                        
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.02 kthreadd                                                                                                                                                       
    3 root      20   0       0      0      0 S  0.0  0.0   0:00.90 ksoftirqd/0                                                                                                                                                    
    5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H                                                                                                                                                   
    7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 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:08.68 rcu_sched                                                                                                                                                      
   10 root      rt   0       0      0      0 S  0.0  0.0   0:01.20 watchdog/0                                                                                                                                                     
   12 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs                                                                                                                                                      
   13 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 netns

这里就来讲解一下这些结果的含义,上述中的返回结果包括两个部分: 统计信息区进程(任务)状态监控信息区

1.3.1 统计信息区

top - 09:56:45 up 2 days, 19:29,  1 user,  load average: 0.07, 0.03, 0.05
Tasks:  65 total,   2 running,  63 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 :  1016124 total,    64100 free,   386400 used,   565624 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   475136 avail Mem

数据结果中的前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。
第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:

top - 09:56:45 up 2 days, 19:29,  1 user,  load average: 0.07, 0.03, 0.05
09:56:45                            系统当前时间

up 2 days, 19:29                    系统运行时间,格式为时:分

1 user                              当前登录用户数

load average: 0.07, 0.03, 0.05      系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

平均负载的值越小代表系统压力越小,越大则代表系统压力越大。通常,我们会以最后一个数值,也就是15分钟内的平均负载作为参考来评估系统的负载情况。
对于只有单核cpu的系统1.0是该系统所能承受负荷的边界值,大于1.0则有处理需要等待。

一个单核cpu的系统,平均负载的合适值是0.7以下。如果负载长期徘徊在1.0,则需要考虑马上处理了。超过1.0的负载,可能会带来非常严重的后果。
当然,多核cpu的系统是在前述值的基础上乘以cpu内核的个数。如对于多核cpu的系统,有N个核则所能承受的边界值为N.0.

可以使用如下命令来查看每个处理器的信息:cat /proc/cpuinfo

查看CPU个数方式cat /proc/cpuinfo | grep 'model name' | wc -l 或者在Top命令交互时,按下数字键1来查看显示的具体CPU信息.

第二行是进程信息.

Tasks:  65 total,   2 running,  63 sleeping,   0 stopped,   0 zombie
            /          \               \             \            \
        进程总数  正在运行的进程数  睡眠的进程数   停止的进程数   僵尸进程数

第三行是CPU信息,当有多个CPU时,这些内容可能会超过两行。内容如下:

%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.0 ni          用户进程空间内改变过优先级的进程占用CPU百分比

100.0 id        空闲CPU百分比

0.0 wa          等待输入输出的CPU时间百分比

0.0 hi          硬件CPU中断占用百分比

0.0 si          软中断占用百分比

0.0 st          虚拟机占用百分比

最后两行为内存信息。内容如下:

KiB Mem :  1016124 total,    64100 free,   386400 used,   565624 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   475136 avail Mem
KiB Mem :           单位(KB)
1016124 total       物理内存总量    

64100 free          空闲内存总量

386400 used         使用的物理内存总量

565624 buff/cache   用作内核缓存的内存量


KiB Swap:           单位(KB)     
0 total,            交换区总量

0 free,             空闲交换区总量

0 used.             使用的交换区总量

475136 avail Mem    交换区可用内存空间

1.3.2 进程(任务)状态监控信息区

注意,在统计信息区和状态监控信息区域之间有一个空白行.

PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                                        
 1394 root      20   0 2347964 211592  15180 S  1.0 20.8   6:19.68 java                                                                                                                                                           
    1 root      20   0   43288   3676   2504 S  0.0  0.4   0:02.63 systemd                                                                                                                                                        
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.02 kthreadd                                                                                                                                                       
    3 root      20   0       0      0      0 S  0.0  0.0   0:00.90 ksoftirqd/0

当然在与top命令交互时,我们是可以通过f键来定制监控信息显示那些具体的列项.在定制界面中可以使用空格键来勾选或取消需要定制的类,设置完成后按下ESC退出既可,下面是所有的列项对应的含义:

* PID     = Process Id                      进程id
* USER    = Effective User Name             进程所有者
* PR      = Priority                        进程优先级
* NI      = Nice Value                      nice值。负值表示高优先级,正值表示低优先级                           
* VIRT    = Virtual Image (KiB)             进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
* RES     = Resident Size (KiB)             进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
* SHR     = Shared Memory (KiB)             共享内存大小,单位kb
* S       = Process Status                  进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
* %CPU    = CPU Usage                       上次更新到现在的CPU时间占用百分比
* %MEM    = Memory Usage (RES)              进程使用的物理内存百分比
* TIME+   = CPU Time, hundredths            进程使用的CPU时间总计,单位1/100秒
* COMMAND = Command Name/Line               进程名称(命令名/命令行)
  PPID    = Parent Process pid  
  UID     = Effective User Id   
  RUID    = Real User Id        
  RUSER   = Real User Name      
  SUID    = Saved User Id       
  SUSER   = Saved User Name     
  GID     = Group Id            
  GROUP   = Group Name          
  PGRP    = Process Group Id    
  TTY     = Controlling Tty     
  TPGID   = Tty Process Grp Id  
  SID     = Session Id          
  nTH     = Number of Threads   
  P       = Last Used Cpu (SMP) 
  TIME    = CPU Time            
  SWAP    = Swapped Size (KiB)  
  CODE    = Code Size (KiB)     
  DATA    = Data+Stack (KiB)    
  nMaj    = Major Page Faults   
  nMin    = Minor Page Faults   
  nDRT    = Dirty Pages Count   
  WCHAN   = Sleeping in Function
  Flags   = Task Flags <sched.h>
  CGROUPS = Control Groups      
  SUPGIDS = Supp Groups IDs     
  SUPGRPS = Supp Groups Names   
  TGID    = Thread Group Id     
  ENVIRON = Environment vars    
  vMj     = Major Faults delta  
  vMn     = Minor Faults delta  
  USED    = Res+Swap Size (KiB) 
  nsIPC   = IPC namespace Inode 
  nsMNT   = MNT namespace Inode 
  nsNET   = NET namespace Inode 
  nsPID   = PID namespace Inode 
  nsUSER  = USER namespace Inode
  nsUTS   = UTS namespace Inode 


中文含义:
    序号  列名    含义
    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

二.使用示例


1.显示进程完整命令

命令:

top -c

输出:

PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                                        
 1022 root      20   0  129680  12564   8324 S  0.3  1.2   7:48.39 /usr/local/aegis/aegis_client/aegis_10_47/AliYunDun                                                                                                            
 1394 root      20   0 2347964 211592  15180 S  0.3 20.8   6:39.40 /root/jdk1.8.0/bin/java -Djava.util.logging.config.file=.//conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls+
    1 root      20   0   43288   3676   2504 S  0.0  0.4   0:02.73 /usr/lib/systemd/systemd --switched-root --system --deserialize 21

说明:
可以看到COMMAND列显示的是完整的命令,在与top命令交互时,按下c可以进行显示命令或命令行的切换.

2.以批处理模式显示程序信息

命令:

top -b

输出:
显示格式效果与top命令一致,只是结果刷新不是在原数据上刷新,而是另外另外一屏一屏的显示数据.

说明:
Batch mode,top刷新状态默认是在原数据上刷新,使用这个参数后,会一屏一屏的显示数据。结合重定向功能和计划任务,这个参数在记录服务器运行状态时非常有用。比如我们可以使用top -b > top.result将结果保存在top.result文件中.

3.以累积模式显示程序信息

命令:

top -S

输出:
显示格式效果与top命令一致.

说明:
累计模式(把已完成或退出的子进程占用的CPU时间累计到父进程的MITE+ )

4.设置信息更新次数

命令:

top -n 2

输出:
显示格式效果与top命令一致.

说明:
表示数据更新2次后终止更新显示

5.设置信息更新时间

命令:

top -d 3

输出:
显示格式效果与top命令一致.

说明:
表示更新周期为3秒

6.显示指定进程的信息

命令:

top -p 1394

输出:

top - 14:27:48 up 3 days, 0 min,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1016124 total,    93808 free,   389444 used,   532872 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   471832 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                                        
 1394 root      20   0 2347964 211592  15180 S  0.3 20.8   6:41.85 java

说明:
显示指定的进程信息,这里注意看统计信息区中Tasks是只会显示关于指定进程的信息,而不是整个系统的信息.
同时监控多个进程时候可以使用top -p pid1 -p pid2.

7.显示指定用户的进程信息

命令:

top -u mysql

top -U mysql

输出:

top - 14:43:19 up 3 days, 15 min,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:  67 total,   1 running,  66 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 :  1016124 total,    78552 free,   388804 used,   548768 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   467728 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                                        
  822 mysql     20   0  113264   1608   1304 S  0.0  0.2   0:00.02 mysqld_safe                                                                                                                                                    
 1063 mysql     20   0  983696 119448   6764 S  0.0 11.8   2:12.27 mysqld

说明:
根据指定的用户名显示进程信息,这里注意看统计信息区中Tasks是只会显示关于指定进程的信息,而不是整个系统的信息,注意参数u和p不能同时使用.

三.实用技巧


1.查看多核CPU信息
在top基本视图中,按键盘数字“1”,可监控或关闭每个逻辑CPU的状况.(这里监控的是逻辑CPU信息)

查看物理CPU的个数(也就是实际CPU个数):
cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
查看逻辑CPU的个数(比如某给物理CPU是多核心的):
cat /proc/cpuinfo |grep "processor"|wc -l
查看CPU是几核(显示该机器上所有处理器存在的核心数)
cat /proc/cpuinfo |grep "cores"| uniq

2.高亮显示当前运行进程
top交互时候,敲击键盘b(打开/关闭加亮效果),我们发现进程id为2570的进程被加亮了,top进程就是视图第二行显示的唯一的运行态(runing)的那个进程,可以通过敲击y键关闭或打开运行态进程的加亮效果。

3.默认进入top时,各进程是按照CPU的占用量来排序的,在下图中进程ID为28894的java进程排在第一(cpu占用142%),进程ID为574的java进程排在第二(cpu占用16%)。
敲击键盘x(打开/关闭排序列的加亮效果),top的视图变化如下:
可以看到,top默认的排序列是%CPU

4.top交互时候,通过shift + >shift + <可以向右或左改变排序列

5.top交互时候,立即刷新:ENTER 或者SPACE

6.top交互时候,R反向排序.

7.top交互时候,i切换显示空闲任务

四.总结


top -b -n 60 -d 60 > /home/cpu.txt

该命令(-d 60)每隔60秒会将服务器运行状态保存到一个文本文件,共运行(-n 60)60次,其实就是将服务器1个小时的运行状态保存起来。使用这个命令,可以记录服务器在繁忙时的负载情况,例如设置到晚上8点到9点之间,这样就可以根据服务器状态作出调整,而不是等服务器挂了才来处理。