Linux面试指南之shell篇 top命令

1,595 阅读8分钟

top命令

top命令可以实时动态查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的使用工具。通过top命令所提供的互动式界面,用热键可以管理。

语法

top [option]

选项

-b: 以批处理模式操作;
-c: 显示完整的执行命令
-d: 屏幕刷新画间隔时间<Hot>
-I: 忽略失效过程
-s: 保密模式
-S: 累积模式
-i<时间>: 设置间隔时间
-u<用户名>: 指定用户名<Hot>
-p<进程号>: 指定进程号<Hot>
-n<次数>: 循环显示的次数

交互命令

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

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

翻译:

Z:改变颜色;B:加粗

t:显示和隐藏任务/cpu信息;m:内存信息

1:监控每个逻辑CPU的状况;

f:进入字段显示配置模式,可增加或者移除显示字段,按相应的字母新增或去除;o:进入字段顺序设置模式,可配置显示位置顺序,按相应的字母往下移动,按“shift+相应的字母”往上移动 

F:进入字段排序配置模式,可设置排序的字段;

R:正常排序/反向排序;

s:设置刷新的时间

u:输入用户,显示用户的任务

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

r:重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。

c:切换显示命令名称和完整命令行<Hot>

M:根据驻留内存大小进行排序。<Hot>

P:根据CPU使用百分比大小进行排序<Hot>

H:显示线程, 设置线程模式下:第二行的tasks指的是线程个数<Hot>

实例

top - 22:45:16 up 53 days,  4:09,  2 users,  load average: 3.55, 3.03, 3.04
Tasks: 365 total,   2 running, 358 sleeping,   0 stopped,   5 zombie
%Cpu(s): 14.2 us,  2.9 sy,  0.0 ni, 82.5 id,  0.0 wa,  0.0 hi,  0.3 si,  0.1 st
KiB Mem : 32950148 total,   359760 free, 32085804 used,   504584 buff/cache
KiB Swap:  2097148 total,        0 free,  2097148 used.   180136 avail Mem 


PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND         
12133 txm       20   0 1219768 1.021g   5456 S  26.8  3.2   2339:04 Game0[main]  
  • 第一行:系统运行时间和平均负载
    • top - 22:45:16[当前系统时间],
    • 53 days[系统已经运行了53天],
    • 2 user[个用户当前登录],
    • load average: 3.53, 3.03, 3.04[系统负载,即任务队列的平均长度, 最近5、10、15分钟内的平均负载]
  • 第二行:任务
    • Tasks: 365 total[总进程数]
    • 2 running[正在运行的进程数]
    • 358 sleeping[睡眠的进程数]
    • 0 stopped[停止的进程数]
    • 5 zombie[冻结进程数]
  • 第三行:cpu状态
    • Cpu(s): 14.2% us[用户空间占用CPU百分比],
    • 2.9% sy[内核空间占用CPU百分比],
    • 0.0% ni[用户进程空间内改变过优先级的进程占用CPU百分比],
    • 82.5% id[空闲CPU百分比], 0.0%wa[等待输入输出的CPU时间百分比],
    • 0.0% wa [IO wait: 用于等待IO完成的CPU时间]
    • 0.0% hi[处理硬件中断的CPU时间],
    • 0.3 si[处理软件中断的CPU时间]
    • 0.0% st[如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的]
  • 第四行:内存
    • Mem: 32950148 total[物理内存总量],
    • 32085804k used[使用的物理内存总量],
    • 359760k free[空闲内存总量],
    • 504584K buffers[用作内核缓存的内存量]
  • 第五行:swap
    • Swap: 2097148k total[交换区总量],
    • 2097148k used[使用的交换区总量],
    • 0k free[空闲交换区总量],
    • 180136k avail Mem 可用的交换区总量
  • 第七行至N行:各进程任务的的状态监控
    • PID 进程ID,进程的唯一标识符

    • USER 进程所有者的实际用户名

    • PR 进程的调度优先级。这个字段的一些值是'rt'。这意味这这些进程运行在实时态。

    • NI 进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级

    • VIRT virtual memory usage 虚拟内存,进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

      • 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
      • 假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量
    • RES resident memory usage 常驻内存,驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

      • 进程当前使用的内存大小,但不包括swap out
      • 包含其他进程的共享
      • 如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
      • 关于库占用内存的情况,它只统计加载的库文件所占内存大小
    • SHR SHR:shared memory 共享内存

      • 除了自身进程的共享内存,也包括其他进程的共享内存
      • 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
      • 计算某个进程所占的物理内存大小公式:RES – SHR
      • swap out后,它将会降下来
    • S 这个是进程的状态。它有以下不同的值:

      • D - 不可中断的睡眠态。
      • R – 运行态
      • S – 睡眠态
      • T – 被跟踪或已停止
      • Z – 僵尸态
    • %CPU 自从上一次更新时到现在任务所使用的CPU时间百分比。%CPU显示的是进程占用一个核的百分比,而不是整个cpu(N核)的百分比,有时候可能大于100,那是因为该进程启用了多线程占用了多个核心,所以有时候我们看该值得时候会超过100%,但不会超过总核数*100

    • %MEM 进程使用的可用物理内存百分比

    • TIME+ 任务启动后到现在所使用的全部CPU时间,精确到百分之一秒

    • COMMAND 运行进程所使用的命令。进程名称(命令名/命令行)

应用案例

  • 查消耗Cpu最高的进程PID
    • 执行top -c ,显示进程运行信息列表。按下P,进程按照Cpu使用率排序
  • 根据Pid查出消耗Cpu最高的线程号
    • top -Hp pid ,显示一个进程的线程运行信息列表。按下P,进程按照Cpu使用率排序
  • 根据对应语言的工具查看调用栈
    • java
      • pid十进制的数据,转成十六进制为0X***
      • 根据线程号查出对应的java线程,进行处理 jstack -l pid > ./pid.stack
      • grep命令,cat pid.stack |grep '***' -C 8
    • C++
      • 用过GTrace,利用采样的原理,获取栈的具体调用情况
      • 还有其他的获取调用栈的工具,后续可以补充

说明

<Hot>注明表示比较重要,面试中可能会被问到的概率很大。