详解top命令

379 阅读13分钟

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

命令格式:

top [参数]

命令功能:

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

命令参数:

-b 批处理-c 显示完整的命令-I 忽略失效过程-s 保密模式-S 累积模式-i<时间> 设置间隔时间-u<用户名> 指定用户名-p<进程号> 指定进程-n<次数> 循环显示的次数

top交互命令

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

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

1、系统状态

top - 11:41:23 up 138 days, 22 min,  1 user,  load average: 0.01, 0.04, 0.05
  • top - 11:41:23 :系统当前时间
  • up 138 days,22 min :系统到目前为止已运行的时间
  • 1 user :当前登录系统的用户数量
  • load average: 0.01, 0.04 0.05 :系统负载(任务队列的平均长度),3个数值分别为1分钟、5分钟、15分钟前到现在的平均值

2、Task 进程状态信息

Tasks: 127 total,   2 running, 125 sleeping,   0 stopped,   0 zombie

显示的是进程状态信息的汇总,分别对应:所有启动的进程数、正在运行的进程数、挂起的进程数、停止的进程数、僵尸进程数。

在linux操作系统中,一般有以下5种状态的进程信息:D:不可中断睡眠态(通常出现在IO阻塞)、R:运行态、S:睡眠态、T:已停止、z:僵尸态

3、Cpu

%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
  • 0.0%us :用户空间占用CPU百分比
  • 0.1%sy :内核空间占用CPU百分比 
  • 0.0%ni :用户进程空间内改变过优先级的进程占用CPU百分比 
  • 99.8%id :空闲CPU百分比 
  • 0.0%wa :等待输入输入的CPU百分比 
  • 0.0%hi :硬中断占用CPU百分比 
  • 0.0%si :软中断CPU百分比 
  • 0.0%st :虚拟CPU等待实际CPU的时间的百分比。

一般我们关注多的是us、sy、id、wa、hi、wi这个6个数值,在这里我们需要注意的指标如下:

**CPU(s):**表示当前CPU的平均值,默认top命令配置显示的是平均的CPU使用情况,如果按下键盘1可以显示各颗逻辑CPU的使用情况,如下图所示:

top - 11:55:18 up 76 days,  1:12,  1 user,  load average: 0.02, 0.02, 0.05
Tasks: 173 total,   1 running, 172 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu4  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu6  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu7  :  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 : 16453492 total,   113620 free,  1208504 used, 15131368 buff/cache
KiB Swap:  4063228 total,  3934532 free,   128696 used. 15019632 avail Mem
  • 统计空闲的CPU id我们直接统计%id的计数即可,当id持续过低的时候,表示系统迫切需要解决CPU资源问题。
  • 统计使用的是CPU需要用1-%id获取。或者us+sy+si.
  • wa:使用率过高的时候,我们需要考虑IO的性能是否有瓶颈,可以在使用iostat、sar等命令做进一步分析;
  • hi:使用率过高时,表示当前硬件中断占用很大的百分比。一般硬件中断我们可以分析文件/proc/interrupts、/proc/irq/pid/smp_affinity、服务irqbalance是否配置,以及CPU的频率设置,通过这些可以帮系统打散优化系统的硬件中断。
  • si:Linux kernel通过用一种软件的方法(可延迟函数)来模拟硬件的中断模式,通常叫做软中断。常见的软件中断一般都是和网络有关。从网卡到IP层的数据报文收发都是si处理的,长时间写日志也可能产生软件中断。
  • 当软中断出现瓶颈的时候,系统有个进行叫ksoftirqd,每个CPU都有自己对应的ksoftirqd/n(n为CPU的逻辑ID),每个ksoftirqd的内核线程都会去运行对应的ksoftirqd(函数)来处理自己的中断队列上的软件中断。所以,当网络出现阻塞的时候,软件中断程序ksoftirqd肯定会出现瓶颈。此时我们可以通过ps aux|grep ksoftirqd查看ksoftirqd的瓶颈。
  • Ni:优先级(priority)为操作系统用来决定CPU分类的参数,Linux使用(round-robin)的算法来做CPU排程,优先序越高,有可能获得的CPU时间就越多。但是我们可以通过nice命令以更改过的优先序来执行程序,如果未制定程序,则会打印出目前的排程优先序,内定的adjustment为10,范围为-20(最高优先序)到19(最低优先序)。

4、内存

KiB Mem : 16453492 total,   113620 free,  1208504 used, 15131368 buff/cache
KiB Swap:  4063228 total,  3934532 free,   128696 used. 15019632 avail Mem

**

  • Mem内存信息(物理内存)

**

物理内存总量、已经使用的物理内存、空闲物理内存、内核缓存内存量。

**

  • Swap交换内存(虚拟内存)

**

交换区总量、已使用交互区总量、空闲交换区总量、缓冲的交换区总量。

有以下结论可以帮助内存分析

buffer和cache的作用是所用I/O系统调用的时间,比如读写等。一般一个系统而言,如果cache的值很大,说明cache住的文件多。如果频繁访问文件都能被命中,很明显会比读取磁盘调用快,磁盘的IO必定会减小。

注意:cache的命中率很关键,如果频繁访问的文件不能被命中,对于cache而言是个比较的大的资源浪费,此时应考虑drop cache并提升对应的cache的命中率。

从字段的意义上来说mem.free表示的是空闲内存总量,但是需要注意的是,虽然buffer/cache会占用一定的物理内存,但是当系统需要内存的时候,这些内存立即释放出来,也就是说buffer/cache可以看成可用内存。

物理内存总数
Mem_total= Mem_used+Mem_free
实际使用的物理内存数
-buffers/cache =used-buffers-cache
实际可用的物理内存数
+buffers/cache = free+buffers+cache
交换分区对应的内存总数
Swap_total= swap_used+swap_free

5、进程信息

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0  191000   3288   2092 S   2.0  0.1   6141:25 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:02.18 kthreadd
    3 root      20   0       0      0      0 S   0.0  0.0   3:42.33 ksoftirqd/0
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
    6 root      20   0       0      0      0 S   0.0  0.0   0:51.59 kworker/u176:0
    7 root      rt   0       0      0      0 S   0.0  0.0   3:57.32 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 155:10.58 rcu_schedd
  • PID :进程ID 
  • USER :进程所有者 
  • PR :优先级 
  • NI :nice值,负值表示高优先级,正值表示低优先级
  • VIRT :进程使用的虚拟内存总量,单位kb,VIRT=SWAP+RES
  • RES :进程使用的、未被换出的物理内存大小,单位kb,RES=CODE+DATA
  • SHR :共享内存大小,单位kb
  • %CPU :上传更新到现在的CPU时间占用百分比
  • %MEM :进程使用的物理内存百分比
  • TIME+ :进程使用的CPU时间总计,单位1/100秒
  • COMMAND :命令名/命令行

注意如下:

  1. 在top命令中,第六、七行显示的是所有进程相关的信息,它默认显示的是进程的信息,如果要显示线程级的信息,可以通过ps命令获取。

  2. 进程实际使用的内容可以看RES那一列的信息,VIRT表示进程使用的是虚拟内存数据,SHR表示共享内存的数据。

  3. TIME+表示是进程使用的CPU时间总计,而非进程的存活时间。且TIME+默认精确到1/100秒。由于TIME+显示的是CPU时间,所以可能存在TIME+大于程序运行时间,也可能小于程序运行时间,这两没有必然的关系,无安全取决于该程序所能分配到的CPU时间而定。

  4. %CPU标识进程所占CPU的百分比,通过这个可以得出CPU利用率;

  5. 默认情况下系统不会显示进程分布在哪几颗逻辑CPU上,如果想分析各颗CPU对应的应用程序,可以修改top的默认配置,添加字段Last used CPU 即可。

  6. 默认的top命令配置并不能满足我们的日常需求时,我们可以自定义一些top配置,来更好的分析系统。用户输入top命令后,按下H键可以看到一应的top配置帮助页面:

    Help for Interactive Commands - procps-ng version 3.3.10 Window 1:Def: Cumulative mode Off. System: Delay 3.0 secs; Secure mode Off.

    Z,B,E,e Global: 'Z' colors; 'B' bold; 'E'/'e' summary/task memory scale l,t,m Toggle Summary: 'l' load avg; 't' task/cpu stats; 'm' memory info 0,1,2,3,I Toggle: '0' zeros; '1/2/3' cpus or numa node views; 'I' Irix mode f,F,X Fields: 'f'/'F' add/remove/order/sort; 'X' increase fixed-width

    L,&,<,> . Locate: 'L'/'&' find/again; Move sort column: '<'/'>' left/right R,H,V,J . Toggle: 'R' Sort; 'H' Threads; 'V' Forest view; 'J' Num justify c,i,S,j . Toggle: 'c' Cmd name/line; 'i' Idle; 'S' Time; 'j' Str justify x,y . Toggle highlights: 'x' sort field; 'y' running tasks z,b . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y') u,U,o,O . Filter by: 'u'/'U' effective/any user; 'o'/'O' other criteria n,#,^O . Set: 'n'/'#' max tasks displayed; Show: Ctrl+'O' other filter(s) C,... . Toggle scroll coordinates msg for: up,down,left,right,home,end

    k,r Manipulate tasks: 'k' kill; 'r' renice d or s Set update interval W,Y Write configuration file 'W'; Inspect other output 'Y' q Quit ( commands shown with '.' require a visible task display window ) Press 'h' or '?' for help with Windows, Type 'q' or to continue

常用的top修改配置如下:修改刷新间隔时间,添加字段、删除字段、排序、保存等:

Top间隔刷新:

在top命令后,按下字母d进入间隔刷新配置,输入间隔秒数即可。

Change delay from 3.0 to
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0  191000   3288   2092 S   3.2  0.1   6141:40 systemd

添加进程字段显示列:

在top命令后,按下字母f,进入列配置页面。

Fields Management for window 1:Def, whose current sort field is %CPU
   Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,
   'd' or <Space> toggles display, 's' sets sort.  Use 'q' or <Esc> to end!

* PID     = Process Id
* USER    = Effective User Name
* PR      = Priority
* NI      = Nice Value
* VIRT    = Virtual Image (KiB)
* RES     = Resident Size (KiB)
* SHR     = Shared Memory (KiB)
* S       = Process Status
* %CPU    = CPU Usage
* %MEM    = Memory Usage (RES)
* TIME+   = CPU Time, hundredths
* 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

按↑↓键,选中需要展示的选项按下空格,该列内容即可展示。

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND P
    1 root      20   0  191000   3288   2092 S   4.7  0.1   6141:53 systemd 3

显示平均/各颗CPU的利用率信息:

进入top命令后,输入数字1;再次按下数字1后,又恢复原来的平均的CPU信息。

top - 11:55:18 up 76 days,  1:12,  1 user,  load average: 0.02, 0.02, 0.05
Tasks: 173 total,   1 running, 172 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu4  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu6  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu7  :  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 : 16453492 total,   113620 free,  1208504 used, 15131368 buff/cache
KiB Swap:  4063228 total,  3934532 free,   128696 used. 15019632 avail Mem

进程字段排序:

默认进入top时,各进程是按照CPU的占用量来排序的,敲击键盘“x”(打开/关闭排序列的加亮效果),通过”shift + >”或”shift + <”可以向右或左改变排序列

需要注意的是,上面几种技巧因为没有加W保存,所以当用户退出top交互界面后,下次登录又会重新加载,,如果需要则输入W保存。