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,利用采样的原理,获取栈的具体调用情况
- 还有其他的获取调用栈的工具,后续可以补充
- java
说明
<Hot>注明表示比较重要,面试中可能会被问到的概率很大。