重点说明

top命令非常强大,也非常复杂,很难面面俱到,也没有必要,这篇文章的目的是介绍重点,授人以渔,希望帮助朋友们以后遇到文中没有介绍的知识点也能举一反三。

本文内容也比较多,重点关注下面的内容即可,其他的需要了再回过头来看也不迟。

  1. 理解系统负载load average
  2. 理解VIRT、RES、%Mem内存
  3. 理解%Cpu参数
  4. 知道怎么添加删除参数(F、f)
  5. 了解几个常用的交互命令(M、P、H、m、u、o、n、d等)
  6. 了解man top,对top有一定了解了,查看对应文档就更轻松了,可以确定不同系统的具体细节

学习是为了应用,先看一个最常用的简单例子,如何找到占用cpu最多的线程?

  1. 执行top
  2. 输入交互命令H,进入线程模式
  3. 输入交互命令P,按CPU使用率排序

找线程
线程模式下,PID就是线程id。通过线程id,在结合线程dump我们就可以定位对应的线程代码了。

基本信息

top命令

含义
13:54:09 当前时间
up 110days,34min 系统运行时间
1 user 当前登录用户数
load average: 0.24, 0.05, 0.02 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值

这里面最重要的信息就是load average,平均负载,大致意思就是逻辑cpu上等待执行的task队列数量。

如何判断负载高呢?

通常模式下,load average统计的是所有task队列的数量,所有,需要除以逻辑CPU的数量,如果这个值大于等于3就说明负载偏高。

例如:load average的值为6,逻辑cpu的核心数为4,6/4=1.5,小于3,说明cpu负载正常,瓶颈不在CPU上。

可以通过下面命令,查看cpu相关信息。

cat /proc/cpuinfo

# 查看cpu物理核数
cat /proc/cpuinfo | grep "physical id" | sort | uniq|wc -l

# 查看cpu逻辑核心数
cat /proc/cpuinfo | grep "processor" |wc -l
# 查看cpu核心数
cat /proc/cpuinfo | grep "cores"|uniq
# 查看cpu型号
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

可以通过交互命令l(小写L)来显示隐藏该行信息。

进程(任务)信息

含义
total 进程总数
running 正在运行的进程数,R
sleeping 睡眠的进程数,S
stopped 停止的进程数,T
zombie 僵尸进程数,Z

cpu占用信息%Cpu(s)

含义
0.5 us 用户空间占用CPU百分比
1.4 sy 内核空间占用CPU百分比
0.0 ni 用户进程空间内改变过优先级的进程占用CPU百分比
98.1 id 空闲CPU百分比
0.0 wa 等待输入输出的CPU时间百分比
0.0 hi 硬件CPU中断占用百分比
0.0 si 软中断占用百分比
0.0 st 虚拟机占用百分比

在交互模式下,我们可以通过数字1来显示每一个逻辑cpu的信息。

每个cpu信息

内存信息

含义
4002264 total 物理内存总量
1213228 free 空闲内存总量
1703096 used 使用的物理内存总量
1085940 buff/cache 用作内核缓存的内存量

buffer缓冲区,通常是文件的meta信息,cache是缓存,通常是内存页page。

可以通过下面命令查看内存具体信息:

# 查看内存信息
cat /proc/meminfo

free -h

可以通过交互命令m切换显示内存信息的格式。

切换进度条模式显示

交换内存信息

参数 含义
1942896 total 交换区总量
1942896 free 空闲交换区总量
92.2 used 使用的交换区总量
1992616 avail Mem 可用交换区总量

每列含义说明

参数 含义
PID 进程id
USER 进程所有者
PR 进程优先级,PR = 20 + NI,[-20,19] ,默认20
NI nice好人值,值越大,越容易被插队,优先级越低和PR相反,[-20,19],默认0
VIRT 进程使用的虚拟内存总量,VIRT=SWAP+RES
RES 进程使用的、未被换出的物理内存大小,RES=CODE+DATA,和%MEM对应
SHR 共享内存大小
S 进程状态,D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 I=空闲进程
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的CPU时间总计,精度1/100秒
COMMAND 进程名称(命令名/命令行),可以通过交互命令c来切换查看完整命令行

有几个参数重点说一下:

  1. %CPU:普通模式下,可以大于100%,表示有多线程利用了多个cpu,比如4个逻辑cpu最多能跑到400%,表示4个逻辑CPU都跑满了
  2. VIRT:进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间,如申请100M,就算只使用1M,这个值也是100M
  3. RES:进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间(不包括swap out),申请100M,使用1M,这个值就是1M

上面这些参数不是全部的参数,可以通过交互命令F或者f添加删除参数。

设置参数

有4个窗口,默认只有一个Def窗口:

  1. Def:按 %CPU 排序
  2. Job:按PID排序
  3. Mem:按 %MEM 排序
  4. Usr:按用户字段排序

设置命令:

  1. 带星号的表示当前要显示的参数
  2. 可以通过上下箭头(↑↓)控制选中
  3. 可以通过d或者space(空格)设置是否显示
  4. 可以通过s设置排序字段
  5. 可以通过左右箭头(← →)设置选中整行,然后通过上下箭头(↑↓)调整参数显示顺序
  6. 可以通过q或者esc退出设置
  7. 可以通过a(下一个窗口)或w(下一个窗口)设置要设置的窗口

交互命令

top有大量交互命令,前面我们也介绍了一些,我们可以在top命令下通过h或者?来查看这些交互命令:

top交互命令

参数 含义
k 终止一个进程,默认使用15信号,如果不能正常结束那就使用信号9强制结束该进程,在安全模式中此命令被屏蔽
r 设置nice值
i 忽略闲置和僵死进程
q 退出程序
S 切换到累计模式
d或s 改变两次刷新之间的延迟时间,单位为秒
f或者F 从当前显示中添加或者删除参数
o或者O 设置过滤条件,o不区分大小写,O区分大小写
u或者U 根据用户过滤,u不区分大小写,U区分大小写
n或# 设置显示的进程数量,通常我们只关心占用资源最多的几个,所以可以修改为3或者5
l(小L) 切换显示平均负载和启动时间信息
m 切换显示内存信息,可以切换为进度条模式,能直观看出内存占比
t 切换显示进程和CPU状态信息
c 切换显示命令名称和完整命令行
x 高亮排序字段
y 高亮运行中任务Running任务
M 根据驻留内存大小进行排序
P 根据CPU使用百分比大小进行排序
T 根据时间/累计时间进行排序
W 将当前设置写入~/.toprc文件中
A 多窗口模式
R 反向排序
H 线程模式,列表是线程,而不是进程
V 显示进程父子关系
Z 颜色配置
Ctrl+L 擦除并且重写屏幕
Ctrl+o 查看当前过滤条件

多窗口模式

前面我们已经介绍了,top有4个窗口

  1. Def:按 %CPU 排序
  2. Job:按PID排序
  3. Mem:按 %MEM 排序
  4. Usr:按用户字段排序

默认使用Def窗口全屏显示模式,我们可以是用命令A切换到多窗口模式。

可以通过:a、w控制窗口,g输入窗口号选择窗口:

多窗口模式

颜色配置

颜色配置

颜色设置也可以根据不同窗口(Def、Job、Mem、Usr)设置。

  1. S = Summary Data:S设置汇总区域颜色
  2. M = Messages/Prompts:M设置交互提示信息区域颜色
  3. H = Column Heads:H设置参数头区域颜色
  4. T = Task Information:T设置信息body区域颜色

可以通过a或者w切换窗口(Def、Job、Mem、Usr),设置完成回车保存退出,q放弃退出。

当然要每次进入生效,还得W就修改保存到配置文件。

命令参数

除了使用交互命令模式,我们可以直接在top执行的时候指定参数:

参数 含义
-c 显示完整的命令行
-b 以批处理模式显示程序信息,结合重定向可以输出到文件
-S 以累积模式显示程序信息
-H 以线程模式显示
-n 2 表示更新两次后终止更新显示
-d 3 设置信息更新周期为3秒
-p pid 显示进程号为139的进程信息,CPU、内存占用率等
-o %CPU 设置排序字段
# 每10秒刷新一次,刷新5次,输出pid为119的top信息
top -d 10 -b -n 5 -p 119 >> top-info.txt
Logo

2万人民币佣金等你来拿,中德社区发起者X.Lab,联合德国优秀企业对接开发项目,领取项目得佣金!!!

更多推荐