本文转载来源:https://www.jianshu.com/p/8a6754f919c5 感谢作者@道无虚
top命令是动态查看进程变化,监控linux的系统状况;它是常用的性能分析工具,能够实时显示系统资源各个进程占用状况,类是windows的任务管理器。
[root@localhost ~]# 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: 启动时设置刷新时间间隔
-H: 设置线程模式
-i: 只显示活跃进程
-n: 显示指定数量的进程
-p: 显示指定PID的进程
-u: 显示指定用户的进程
[root@localhost ~]# top
top - 09:56:25 up 49 days, 15:19, 1 user, load average: 0.01, 0.05, 0.05
Tasks: 147 total, 1 running, 146 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.8 sy, 0.0 ni, 99.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 32781220 total, 9375268 free, 10749464 used, 12656488 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 21365776 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7150 root 20 0 157724 2156 1480 R 6.2 0.0 0:00.01 top
1 root 20 0 43320 3604 2308 S 0.0 0.0 1:33.24 systemd
从上面的结果可以看出,top视图分为两部分:操作系统资源概况信息和进程信息。首先是分析资源概况中各个参数含义,再来分析进程信息中各个参数含义。
我们先利用top命令进入视图,再f键看下全称信息,再q退出回到top视图。
注意:可以通过输入 ‘d’ 选择想要在top界面显示的项目,比如PPID也可以显示在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 TGID = Thread Group Id
* USER = Effective User Name ENVIRON = Environment vars
* PR = Priority vMj = Major Faults delta
* NI = Nice Value vMn = Minor Faults delta
* VIRT = Virtual Image (KiB) USED = Res+Swap Size (KiB)
* RES = Resident Size (KiB) nsIPC = IPC namespace Inode
* SHR = Shared Memory (KiB) nsMNT = MNT namespace Inode
* S = Process Status nsNET = NET namespace Inode
* %CPU = CPU Usage nsPID = PID namespace Inode
* %MEM = Memory Usage (RES) nsUSER = USER namespace Inode
* TIME+ = CPU Time, hundredths nsUTS = UTS namespace Inode
* 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
a、操作系统时间、登录用户、负载情况 - top
top - 09:56:25 up 49 days, 15:19, 1 user, load average: 0.01, 0.05, 0.05
09:56:25:当前系统时间。
up 49 days, 15:19:操作系统从开机后运行的时间,运行天时分。
users:当前系统三个用户登录在线。
load average:1,5,15min的系统平均负载。
1. load average 定义
linux系统中的Load对当前CPU工作量的度量。简单的说是进程队列的长度。
Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均 Load 。
通过系统命令"w"查看当前load average情况
admin@-VirtualBox:~$ w
13:52:12 up 1 day, 12:40, 1 user, load average: 0.00, 0.02, 0.00
上边0.00, 0.02, 0.00表示
第一位0.00:表示最近1分钟平均负载
第二位0.02:表示最近5分钟平均负载
第三位0.00:表示最近15分钟平均负载
注:linux系统是5秒钟进行一次Load采样
2. load average值的含义
1) 单核处理器
假设我们的系统是单CPU单内核的,把它比喻成是一条单向马路,把CPU任务比作汽车。当车不多的时候,load <1;当车占满整个马路的时候 load=1;当马路都站满了,而且马路外还堆满了汽车的时候,load>1
2) 多核处理器
我们经常会发现服务器Load > 1但是运行仍然不错,那是因为服务器是多核处理器(Multi-core)。
假设我们服务器CPU是2核,那么将意味我们拥有2条马路,我们的Load = 2时,所有马路都跑满车辆。
注:查看cpu 核数命令:
grep 'model name' /proc/cpuinfo | wc -l
admin@-VirtualBox:~$ grep 'model name' /proc/cpuinfo | wc -l
4
3. 什么样的Load average值要提高警惕(针对单核或者平均单核值)
0.7 < load < 1: 此时是不错的状态,如果进来更多的汽车,你的马路仍然可以应付。
load = 1: 你的马路即将拥堵,而且没有更多的资源额外的任务,赶紧看看发生了什么吧。
load > 5: 非常严重拥堵,我们的马路非常繁忙,每辆车都无法很快的运行
4. 三种Load值,应该看哪个
通常我们先看15分钟load,如果load很高,再看1分钟和5分钟负载,查看是否有下降趋势。
1分钟负载值 > 1,那么我们不用担心,但是如果15分钟负载都超过1,我们要赶紧看看发生了什么事情。所以我们要根据实际情况查看这三个值。
b、运行任务概况 - tasks
Tasks: 147 total, 1 running, 146 sleeping, 0 stopped, 0 zombie
total:系统当前运行进程数。
running:当前运行的进程数。
sleeping:睡眠中的进程数。
c、CPU概览: %Cpu(s) 表示CPU使用百分比,按照时间占用计算,单位s
%Cpu(s): 0.0 us, 0.8 sy, 0.0 ni, 99.2 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时间百分比。
时间占用百分比=该种类型操作消耗cpu时间/top刷新间隔时间。top每3s刷新一次,用户空间进程在这3秒内试用了cpu时间1.5s,那么us为50%=1.5s/3s。
扩展:linux cpu %us,Linux top里面%CPU和us%的解释https://blog.csdn.net/weixin_34180452/article/details/116870925
我们有时会把%CPU和us%搞晕,也就是下图所示在top的时候查看cpu的信息。
top - 10:55:03 up 1 day, 9:42, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 235 total, 2 running, 232 sleeping, 0 stopped, 1 zombie
%Cpu(s): 3.3 us, 1.3 sy, 0.0 ni, 95.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 4935.2 total, 122.0 free, 2721.4 used, 2091.9 buff/cache
MiB Swap: 2048.0 total, 1326.0 free, 722.0 used. 1865.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1970 admin 20 0 4813416 230828 62516 S 9.3 4.6 79:11.58 gnome-shell
这时有人会问:这两个CPU到底哪个是对的。
其实都是对的,只是表达的意思不一样。
官方解释如下
Cpu(s):34.0% us: 用户空间占用CPU百分比
%CPU:上次更新到现在的CPU时间占用百分比
读到这里我也不是十分理解他们俩的关系,我一直以为%CPU是每个进程占用的cpu百分比,按理来说所有进程的该值加在一起应该等于us.
但事实并非如此,此时我们可以在top界面按一下1
top - 10:56:26 up 1 day, 9:44, 1 user, load average: 0.02, 0.01, 0.00
Tasks: 234 total, 1 running, 232 sleeping, 0 stopped, 1 zombie
%Cpu0 : 3.4 us, 1.0 sy, 0.0 ni, 95.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 7.8 us, 1.7 sy, 0.0 ni, 90.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 6.1 us, 1.7 sy, 0.0 ni, 92.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 6.3 us, 2.5 sy, 0.0 ni, 91.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 4935.2 total, 138.6 free, 2704.5 used, 2092.1 buff/cache
MiB Swap: 2048.0 total, 1326.0 free, 722.0 used. 1882.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1970 admin 20 0 4813416 230576 62552 S 20.7 4.6 79:16.94 gnome-shell
这时候我们可以清晰得看到每个cpu的运行状态。
通过上面的显示我们发现Cpu(s)表示的是 所有用户进程占用整个cpu的平均值,由于每个核心占用的百分比不同,所以按平均值来算比较有参考意义。而%CPU显示的是进程占用一个核的百分比,而不是整个cpu(12核)的百分比,有时候可能大于100,那是因为该进程启用了多线程占用了多个核心,所以有时候我们看该值得时候会超过100%,但不会超过总核数*100。
d、内存概览(KB)
KiB Mem : 32781220 total, 9375268 free, 10749464 used, 12656488 buff/cache
total:内存总量。
free:内存剩余总量。
used:内存使用数量。
buff/cached:用于缓冲的内存数量。
e、缓存区概况(KB)
KiB Swap: 0 total, 0 free, 0 used. 21365776 avail Mem
total:交换区总量。
free:空闲交换区数量。
used:使用交换区数量。
进程概况的统计是从多个维度进行展示的,其中几个计较重要的参数如下:
PID:进程ID,唯一标识。
USER:进程所属用户。
%CPU:自上一次top刷新该进程的cpu占用时间百分比。
%MEM:进程消耗内存百分比。
TIME+:自进程开始以来,消耗CPU时间,单位1/100s。
其它参数可以在上面f键视图的全称中了解。
1.3 top视图中交互命令
1、全局
Enter/Space:刷新视图。
h:帮助信息,查询各个交互命令的含义。
O:是否展示进程区域中的0值,比如%CPU是0的将全部隐藏。
A:在全屏模式和多窗口选择模式中切换。
d:设置刷新时间间隔。
E:切换内存和交换区单位。
H:开启/关闭线程模式,以线程的方式展示。
k:杀掉指定进程或线程。
Z:改变颜色配置。
q:退出。
2、概要区域
1:显示CPU平均状态/分开显示各个逻辑CPU状态。
```bash
top - 10:49:14 up 1 day, 9:37, 1 user, load average: 0.08, 0.02, 0.00
Tasks: 233 total, 1 running, 231 sleeping, 0 stopped, 1 zombie
%Cpu0 : 8.1 us, 2.0 sy, 0.0 ni, 89.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 6.8 us, 1.4 sy, 0.0 ni, 91.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 2.3 us, 0.7 sy, 0.0 ni, 97.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 3.5 us, 0.7 sy, 0.0 ni, 95.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 4935.2 total, 144.2 free, 2701.4 used, 2089.7 buff/cache
MiB Swap: 2048.0 total, 1325.7 free, 722.3 used. 1884.9 avail Mem
m:切换显示内存统计的数据。
3、进程区域
```clike
x:切换高亮行的排序位置。
z:切换颜色。
b:块状标记高亮行。
c:切换显示命令/程序名和参数。(显示启动命令)
f:显示field管理。
u:按照执行用户显示进程。
i:显示所有进程或活跃的进程。
n:设置显示的进程数。
1.4 top常用场景 -H thread-model
top -H -p pid # 显示某个进程所有活跃的线程消耗情况。
后面几列:TIME+ nMaj nMin nDRT vMj vMn就是通过 ‘d’ 选择显示列
top - 10:32:14 up 1 day, 9:20, 1 user, load average: 0.08, 0.06, 0.01
Threads: 18 total, 0 running, 18 sleeping, 0 stopped, 0 zombie
%Cpu(s): 7.8 us, 1.6 sy, 0.0 ni, 90.5 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 4935.2 total, 141.8 free, 2702.8 used, 2090.6 buff/cache
MiB Swap: 2048.0 total, 1325.2 free, 722.8 used. 1883.2 avail Mem
PID USER NI VIRT PR RES SHR S %CPU %MEM COMMAND PPID TIME+ nMaj nMin nDRT vMj vMn
1970 admin 0 4813608 20 230332 62580 S 14.3 4.6 gnome-shell 1278 24:58.37 150k 624k 0 48 94
下面列举一下 -H 参数的说明:
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 nDRT = Dirty Pages Count
* USER = Effective User Name WCHAN = Sleeping in Function
* PR = Priority Flags = Task Flags <sched.h>
* NI = Nice Value CGROUPS = Control Groups
* VIRT = Virtual Image (KiB) SUPGIDS = Supp Groups IDs
* RES = Resident Size (KiB) SUPGRPS = Supp Groups Names
* SHR = Shared Memory (KiB) TGID = Thread Group Id
* S = Process Status OOMa = OOMEM Adjustment
* %CPU = CPU Usage OOMs = OOMEM Score current
* %MEM = Memory Usage (RES) ENVIRON = Environment vars
* TIME+ = CPU Time, hundredths vMj = Major Faults delta
* COMMAND = Command Name/Line vMn = Minor Faults delta
PPID = Parent Process pid USED = Res+Swap Size (KiB)
UID = Effective User Id nsIPC = IPC namespace Inode
RUID = Real User Id nsMNT = MNT namespace Inode
RUSER = Real User Name nsNET = NET namespace Inode
SUID = Saved User Id nsPID = PID namespace Inode
SUSER = Saved User Name nsUSER = USER namespace Inode
GID = Group Id nsUTS = UTS namespace Inode
GROUP = Group Name LXC = LXC container name
PGRP = Process Group Id RSan = RES Anonymous (KiB)
TTY = Controlling Tty RSfd = RES File-based (KiB)
TPGID = Tty Process Grp Id RSlk = RES Locked (KiB)
SID = Session Id RSsh = RES Shared (KiB)
nTH = Number of Threads CGNAME = Control Group name
P = Last Used Cpu (SMP) NU = Last Used NUMA node
TIME = CPU Time
SWAP = Swapped Size (KiB)
CODE = Code Size (KiB)
DATA = Data+Stack (KiB)
nMaj = Major Page Faults
nMin = Minor Page Faults