Linux工具-top
参考文献
top
命令说明
1 | top - 16:30:42 up 308 days, 19:08, 1 user, load average: 0.00, 0.02, 0.00 |
第一行
- 16:30:42: 系统当前时间
- up 308 days, 19:08: 系统开机到现在经过了多少时间
- 1 user: 当前2用户在线
- load average: 0.00, 0.02, 0.00: 系统1分钟、5分钟、15分钟的CPU负载信息
第二行
- Tasks: 任务
- 120 total: 很好理解,就是当前有120个任务,也就是120个进程
- 1 running: 1个进程正在运行
- 119 sleeping: 119个进程睡眠
- 0 stopped: 停止的进程数
- 0 zombie: 僵死的进程数
第三行
- %Cpu(s): 表示这一行显示CPU总体信息
- 0.5%us (user): 用户态进程占用CPU时间百分比,不包含renice值为负的任务占用的CPU的时间.
- 1.0%sy (system): 内核占用CPU时间百分比
- 0.0%ni (nice): 改变过优先级的进程占用CPU的百分比
- 98.2%id (idle): 空闲CPU时间百分比
- 0.0%wa (iowait): 等待I/O的CPU时间百分比
- 0.3%hi (hard interrupt): CPU硬中断时间百分比
- 0.0%si (soft interrupt): CPU软中断时间百分比
- 0.0%st (steal): 表示当前系统运行在虚拟机中的时候,被其他虚拟机占用的CPU时间比例
- 注: 这里显示数据是所有cpu的平均值,如果想看每一个cpu的处理情况,按1即可;折叠,再次按1;
类型 | 含义 | 异常/正常说明 |
---|---|---|
us |
CPU执行用户代码消耗的CPU时间比例,这个比例越高,就说明CPU的利用率越好,因为我们的目的就是为了让CPU将更多的时间用在执行用户代码上.如果这一项过高引起了你的业务抖动,那你就需要去分析你的业务代码了 | 比例越高越好 |
sys |
CPU执行内核代码消耗的CPU时间比例,这个比例越低越好.因为CPU不应该把时间浪费在执行内核函数上,如果在内核函数里浪费了很多时间,那说明内核可能需要优化了. | 比例越低越好 |
ni |
Nice值被调大的线程执行用户代码消耗的CPU百分比. | |
id |
这个指标表示CPU空闲时间,通常说的整体CPU利用率(100-idl)这个值,也就是其他几项的之和.为了提示系统的资源利用率,我们的目标就是尽量降低idl . |
不影响业务正常运行下,尽量降低idl |
wa |
这个指标表示CPU阻塞在I/O 上的时间,比如说CPU 从磁盘读取文件内容时,由于磁盘I/O 太慢,导致CPU不得不等待数据就绪,然后才能继续执行下一步操作,这就是wait 时间. |
这个值越高,说明I/O 处理能力出了问题 |
hi |
CPU小号在硬中断里的时间,正常情况下这个值都很低,因为中断处理是很快的,即使有大量硬件中断,也不会消耗很多CPU时间 | |
si |
Soft irq,处理软中断的时间,这个时间不计入进程CPU时间.系统中常见的软中断有网络收发包的软中断,写文件落盘产生的软中断等.在网络吞吐量较高的系统中,这个值也会高一点. | |
st |
Steal, 表示同一个宿主机上的其他虚拟机抢走的CPU时间 |
第四行
- MiB Mem: 内存的意思,单位是MiB
- 3591.0 total: 物理内存总量
- 158.4 free: 空闲的物理内存量
- 2741.9 used: 使用的物理内存量
- 690.7 buff/cache: 用作内核缓存的物理内存量
第五行
- MiB Swap: 交换空间
- 0.0 total: 交换区总量
- 0.0 free: 使用的交换区量
- 0.0 used: 空闲的交换区量
- Swap total表示能用的swap总量,swap free表示剩余,used表示已经使用的.这三个值都为0表示系统关闭了swap功能
- 565.8 avail Mem:
第六行
1 | PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND |
-
PID 进程ID
-
USER 进程所有者的用户名,例如root
-
PR 进程调度优先级
-
NI 进程nice值(优先级),越小的值代表越高的优先级
-
VIRT 进程使用的虚拟内存
-
RES 进程使用的物理内存(不包括共享内存)
-
SHR 进程使用的共享内存
-
S 列(也就是 Status 列)表示进程的状态
- R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行.
- D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断.
- Z 是 Zombie 的缩写,如果你玩过“植物大战僵尸”这款游戏,应该知道它的意思.它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等).
- S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起.当进程等待的事件发生时,它会被唤醒并进入 R 状态.
- I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上.前面说了,硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况.要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会.
- 上面的示例并没有包括进程的所有状态.除了以上 5 个状态,进程还包括下面这 2 个状态
-
T 或者 t,也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态
-
向一个进程发送 SIGSTOP 信号,它就会因响应这个信号变成暂停状态(Stopped);再向它发送 SIGCONT 信号,进程又会恢复运行(如果进程是终端里直接启动的,则需要你用 fg 命令,恢复到前台运行).
-
而当你用调试器(如 gdb)调试一个进程时,在使用断点中断进程后,进程就会变成跟踪状态,这其实也是一种特殊的暂停状态,只不过你可以用调试器来跟踪并按需要控制进程的运行.
-
X,也就是 Dead 的缩写,表示进程已经消亡,所以不会在 top 或者 ps 命令中看到它.
-
线程状态 描述 S
SLEEPING
R、R+
RUNNABLE
D
UNINTR_SLEEP
T
STOPPED
t
DEBUG
Z
ZOMBIE
X
EXIT_DEAD
x
TASK_DEAD
K
WAKE_KILL
W
WAKING
D
K
D
W
-
CPU 进程使用的CPU占比
-
MEM 进程使用的内存占比
-
TIME 进程启动后到现在所用的全部CPU时间
-
COMMAND 进程的启动命令(默认只显示二进制,top -c能够显示命令行和启动参数)
使用示例
top
过滤进程名
-
直接在 top 命令行中使用进程名过滤
-
可以通过 top 命令的 -p 参数指定要监视的进程 ID 或者进程名称,例如:
1
top -p $PID
-
-
通过管道符结合 grep 命令过滤进程名
-
可以使用管道符将 top 命令的输出传递给 grep 命令,使用 grep 命令来过滤进程名.例如:
1
top -b -n 1 | grep process_name
- 这里的 process_name 是您想要过滤的进程名,-b 和 -n 参数是让 top 命令在批处理模式下运行,并仅运行一次.
-
只查找由特定用户启动的进程
-
可以使用以下 -u 选项获取该信息
1
top -u 'root'
要获取系统上的空闲进程列表
-
使用以下
-i
选项1
top -i
更新间隔设置为以秒为单位的任意值
1 | # 将间隔时间改为5秒一次 默认为3秒 |
将迭代次数设置为两次,然后退出
1 | top -n 2 |
查看内存情况
-
打开
top
后,然后按g
再输入3
,从而进入内存模式就可以了.在内存模式中,我们可以看到各个进程内存的%MEM、VIRT、RES、CODE、DATA、SHR、nMaj、nDRT
nMaj
(Major Page Fault
, 主缺页中断,指内容不在内存中然后从磁盘中来读取的页数)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18top - 10:12:20 up 11 days, 16:18, 4 users, load average: 0.01, 0.05, 0.01
Tasks: 752 total, 1 running, 537 sleeping, 2 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 98597184 total, 14083688 free, 41466956 used, 43046540 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 56285348 avail Mem
PID %MEM VIRT RES CODE DATA SHR nMaj nDRT %CPU COMMAND
40807 10.0 36.897g 9.395g 2088 12.478g 934008 0 0 1.3 python
1974 7.3 33.379g 6.831g 2088 9.875g 949952 829 0 0.3 python
9112 6.8 8835072 6.400g 62856 7608920 13224 588 0 1.0 mongod
11357 5.8 6622784 5.473g 79456 5846672 36500 383 0 0.0 node
7155 2.7 15.591g 2.496g 4 5304604 14728 15k 0 0.0 java
16416 1.3 2106536 1.180g 79456 1233764 36892 0 0 0.0 node
1800 1.1 37.409g 1.075g 4 1475280 20396 6825 0 0.3 java
7467 0.9 2008528 876672 8 1269340 15556 511 0 0.3 java
5718 0.8 14.575g 833952 8 1302464 15944 2104 0 0.3 java
12975 0.6 1383980 588368 79456 601368 38324 7 0 0.0 node
// 略
top
交互
1 | s:设置刷新时间间隔 |
用top
定位一个进程
- 按
Shift+L
按名称查找进程.这会在粗体表标题行上方创建一个提示.输入您要查找的进程的名称,然后按Enter
或Return
以查看在新排序的进程列表中高亮显示该进程的实例.
原理
- 内核源码版本
v6.8-5202-g9187210eee7d
1 | /* |
1 | /* |
1 | /* |
1 | /* |
- 用户态消耗时间,包括
user
和nice
.如果想看用户态的消耗,要将user和nice加起来看才对. - 内核态消耗时间,包括
irq、softirq
和system
. - 空闲时间,包括
io_wait
和idle
.其中io_wait
也是cpu
的空闲状态,只不过是在等io
完成而已.如果只是想看cpu
到底有多闲,应该把io_wait
和idle
加起来才对.