一 介绍
top命令是动态查看进程变化,监控linux的系统状况;它是常用的性能分析工具,能够实时显示系统资源各个进程占用状况,类似windows的任务管理器。
二 语法
[root@192 ~]# top -h
procps-ng version 3.3.10
Usage:
top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]
-h | -v: 显示帮助或者版本信息
-c: 命令行列显示程序名以及参数
-d: 启动时设置刷新时间间隔(当然用户可以使用s交互命令来改变之)
-H: 设置线程模式
-i: 只显示活跃进程
-n: 显示指定数量的进程
-p: 显示指定PID的进程
-u: 显示指定用户的进程
-q:该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
-S:指定累计模式。
-s:使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
常用命令说明
Ctrl+L:擦除并且重写屏幕
K: 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
i: 忽略闲置和僵死进程。这是一个开关式命令。
q: 退出程序
r: 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
S: 切换到累计模式。
s: 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
f或者F:从当前显示中添加或者删除项目。
o或者O: 改变显示项目的顺序
l: 切换显示平均负载和启动时间信息。
m: 切换显示内存信息。
t: 切换显示进程和CPU状态信息。
c: 切换显示命令名称和完整命令行。
M: 根据驻留内存大小进行排序。
P: 根据CPU使用百分比大小进行排序。
T: 根据时间/累计时间进行排序。
W: 将当前设置写入~/.toprc文件中。
三 视图参数
[root@192 ~]# top
top - 10:37:53 up 3:12, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 188 total, 1 running, 187 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 1.6 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 4026164 total, 3024444 free, 482124 used, 519596 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 3293896 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 191272 4200 2588 S 0.0 0.1 0:02.61 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.11 kthreadd
4 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:00.02 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.04 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 0:02.70 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
从上面的结果可以看出,top视图分为两部分:操作系统资源概况信息和进程信息。首先是分析资源概况中各个参数含义,再来分析进程信息中各个参数含义。
1 视图参数详解
(1)第一行,任务队列信息,同 uptime 命令的执行结果
top - 10:37:53 up 3:12, 3 users, load average: 0.00, 0.01, 0.05
- 10:37:53:当前系统时间。
- up 3:12,:操作系统从开机后运行的时间,运行天时分。
- users:当前系统三个用户登录在线。
- load average:1,5,15min的系统平均负载。如果第四组数字,分母表示系统进程总数,分子表示正在运行的进程数;最后一个数字表示最近运行的进程ID。
监控项名称 | 监控项含义 | 单位 |
---|---|---|
Host.load1 | 过去1分钟的系统平均负载 | 无 |
Host.load5 | 过去5分钟的系统平均负载 | 无 |
Host.load15 | 过去15分钟的系统平均负载 | 无 |
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了
(2)第二行,Tasks — 任务(进程)
Tasks: 188 total, 1 running, 187 sleeping, 0 stopped, 0 zombie
- total:系统当前运行进程数。
- running:当前运行的进程数。
- sleeping:睡眠中的进程数。
- stopped:停止
- zombie:僵尸进程
(3)第三行,cpu状态信息
%Cpu(s): 0.0 us, 1.6 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- us:用户空间占用cpu时间百分比,如果是多核,这个数值表示占用的平均百分比,可以按1进行多核统计和平均统计切换。
- sy:内核空间占用cpu时间百分比,后续同上。
- ni:用户空间改变过优先级的进程占用cpu时间百分比。
- id:空闲时间占用cpu的百分比。
- wa:等待输入输出占用cpu时间百分比。
- hi:硬中断占用cpu时间百分比。
- si:软中断占用cpu时间百分比。
- st:实时
监控项名称 | 监控项含义 | 单位 | 说明 |
---|---|---|---|
Host.cpu.idle | 当前空闲CPU百分比 | % | 当前CPU处于空闲状态的百分比 |
Host.cpu.system | 当前内核空间占用CPU百分比 | % | 指系统上下文切换的消耗,该监控项数值比较高,说明服务器开了太多的进程或者线程 |
Host.cpu.user | 当前用户空间占用CPU百分比 | % | 用户进程对CPU的消耗 |
Host.cpu.iowait | 当前等待IO操作的CPU百分比 | % | 该项数值比较高说明有很频繁的IO操作 |
Host.cpu.other | 其他占用CPU百分比 | % | 其他消耗,计算方式为(Nice + SoftIrq + Irq + Stolen)的消耗 |
Host.cpu.totalUsed | 当前消耗的总CPU百分比 | % | 指以上各项CPU消耗的总和,通常用于报警 |
什么是软中断呢?
软中断和硬中断都有一个共同的特点,都会中断当前操作,但是呢又有所区别,软中断当在进行一个任务的时候来了一个新的任务,就将先停止当前的任务,然后立马将新的任务放入内存当中,延迟处理新任务,最后此 任务交由线程来进行处理。
为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断 (softirq)来完成。什么是硬中断呢
同样在执行一个进程的时候,又有新的任务请求访问,cpu会立马对当前进程进行处理,但是呢新的进程只能处于等待,等待上进程结束之后,才能对新进程进行处理
由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统,系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。
(4)第四行,内存状态(KB)
KiB Mem : 4026164 total, 3024444 free, 482124 used, 519596 buff/cache
- total:内存总量。
- free:内存剩余总量。
- used:内存使用数量。
- buff/cached:用于缓冲的内存数量。buff和cache的区别详见这里
(5)swap交换分区信息(KB)
KiB Swap: 4063228 total, 4063228 free, 0 used. 3293896 avail Mem
- total:交换区总量。
- free:空闲交换区数量。
- used:使用交换区数量。
- cached:缓冲的交换区总量(示例中没开启,意会意会)
备注:
可用内存=free + buffer + cached
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,
第四行中空闲内存总量(free)是内核还未纳入其管控范围的数量。
纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
(6)空行
(7)第七行以下:各进程(任务)的状态监控
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 191272 4200 2588 S 0.0 0.1 0:02.61 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.11 kthreadd
4 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:00.02 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.04 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 0:02.70 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
- PID — 进程id
- USER — 进程所有者
- PR — 进程优先级
- NI — nice值。负值表示高优先级,正值表示低优先级
- VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
- RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
- SHR — 共享内存大小,单位kb
- S —进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
- %CPU — 上次更新到现在的CPU时间占用百分比
- %MEM — 进程使用的物理内存百分比
- TIME+ — 进程使用的CPU时间总计,单位1/100秒
- COMMAND — 进程名称(命令名/命令行)
详解
VIRT:virtual memory usage 虚拟内存
- 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
- 假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量
RES:resident memory usage 常驻内存
- 进程当前使用的内存大小,但不包括swap out
- 包含其他进程的共享
- 如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
- 关于库占用内存的情况,它只统计加载的库文件所占内存大小
SHR:shared memory 共享内存
- 除了自身进程的共享内存,也包括其他进程的共享内存
- 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
- 计算某个进程所占的物理内存大小公式:RES – SHR
- swap out后,它将会降下来
DATA
- 数据占用的内存。如果top没有显示,按f键可以显示出来。
- 真正的该程序要求的数据空间,是真正在运行中要使用的。
(8)全称信息查看
用
top
命令进入视图,f
键可查看全称信息,再按q可
退出回到top视图。
# f键看下全称信息,q退出回到top视图。
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 USED = Res+Swap Size (KiB)
* USER = Effective User Name nsIPC = IPC namespace Inode
* PR = Priority nsMNT = MNT namespace Inode
* NI = Nice Value nsNET = NET namespace Inode
* VIRT = Virtual Image (KiB) nsPID = PID namespace Inode
* RES = Resident Size (KiB) nsUSER = USER namespace Inode
* SHR = Shared Memory (KiB) nsUTS = UTS namespace Inode
* 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