一、top命令简介
top命令是动态查看进程变化,监控linux的系统状况;它是常用的性能分析工具,能够实时显示系统资源各个进程占用状况,类似windows的任务管理器。
1.1 命令使用
top 命令格式:
top [-] [d] [q] [c] [S] [s] [i] [n] [b] [v] [h] [H] [p] [u]
示例: [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: 显示帮助或者版本信息
-
-b: 批次档模式,搭配 “n” 参数一起使用,可以用来将 top 的结果输出到档案内
-
-c: 命令行列显示程序名以及参数
-
-d: 启动时设置刷新时间间隔
-
-H: 设置线程模式
-
-i: 只显示活跃进程
-
-n: 显示指定数量的进程
-
-p: 显示指定PID的进程
-
-u: 显示指定用户的进程
-
-q: 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
-
-S: 安全模式,将交互式指令取消, 避免潜在的危机
1.2 top视图界面中交互命令
[root@www ~]# top
![image-20201108183722278](https://gitee.com/dbaobao/blogimage/raw/master/img/image-20201108183722278.png)
top 运行中可以通过top 的内部命令对进程的显示方式进行控制。在top的视图中大概分为 上面的 统计区域+下面的进程区域 两部分命令/按键也不一样,内部交互命令如下:
内部交互命令杂乱表
命令/按键 | 说明 |
---|---|
h / ? | 显示帮助画面,给出一些简短的命令总结说明 |
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文件中。这是写top配置文件的推荐方法 |
1. 全局命令(针对top视图界面 )
Enter/Space:刷新视图。
h:帮助信息,查询各个交互命令的含义。
O:是否展示进程区域中的0值,比如%CPU是0的将全部隐藏。
A:在全屏模式和多窗口选择模式中切换。
d:设置刷新时间间隔。
E:切换内存和交换区单位。
H:开启/关闭线程模式,以线程的方式展示。
k:杀掉指定进程或线程。
Z:改变颜色配置。
q:退出。
2. 概要区域
- 1:显示CPU平均状态/分开显示各个逻辑CPU状态。
- m:切换显示内存统计的数据。
3. 进程区域
- x:打开或关闭排序列的高亮效果。
- z:切换颜色。
- b:打开或关闭运行中进程的高亮效果。
- c:切换显示命令/程序名和参数。
- f:显示field管理。
- u:按照执行用户显示进程。
- i:显示所有进程或活跃的进程。
- n:设置显示的进程数。
- shift +>或shift +<可以向右或左改变排序列
f键,可以进入编辑要显示字段的视图,有*
号的字段会显示,无*
号不显示,可根据页面提示选择或取消字段比如按 空格键 选择。
1.3 top常用场景
top -H -p pid # 显示某个进程所有活跃的线程消耗情况。
常用操作命令
命令 | 说明 |
---|---|
top | 每隔5秒显式所有进程的资源占用情况 |
top -d 2 | 每隔2秒显式所有进程的资源占用情况 |
top -c | 每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名) |
top -p 12345 -p 6789 | 每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况 |
top -d 2 -c -p 123456 | 每隔2秒显示pid是12345的进程的资源使用情况,并显示该进程启动的命令行参数 |
二、top视图参数含义:
[root@www ~]# top
top - 20:29:20 up 1:24, 2 users, load average: 0.00, 0.01, 0.02
Tasks: 179 total, 1 running, 178 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995712 total, 252208 free, 404372 used, 339132 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 431828 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
61 root 20 0 0 0 0 S 0.3 0.0 0:02.84 kworker/0:1
1817 root 20 0 162124 2320 1592 R 0.3 0.2 0:05.52 top
1 root 20 0 191116 4120 2612 S 0.0 0.4 0:01.12 systemd
从上面的结果可以看出,top视图分为两部分:操作系统资源概况信息和进程信息。首先是分析资源概况中各个参数含义,再来分析进程信息中各个参数含义。
我们先利用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 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
1、系统信息统计
前五行是系统整体状态的统计信息展示区域。下面分别介绍每一行中的内容:
1.第一行显示服务器概况
如下所示,第一行列出了服务器运行了多长时间,当前有多少个用户登录,服务器的负荷情况等,使用uptime命令能获得同样的结果。
top - 20:29:20 up 1:24, 2 users, load average: 0.00, 0.01, 0.02
当前时间 运行时长 当前登录用户数 平均负载(1分钟、5分钟、15分钟)
==========>平均负载的三个数值我们该关注哪一个?三个值相当于三个样本,我们应该统筹地看
1、如果1分钟,5分钟,15分钟的负载数值相差不大,代表系统的负载很'稳定′。
2、如果1分钟的值,远小于15分钟的值,那么证明系统的平均负载逐渐降低,即我们的系统刚刚经历过大风浪,但目前已逐渐趋于平均。至于15分钟区间内,系统负载上升的原因,还需要我们认真查明3、如果15分钟的值,远小于1分钟的值,那么证明系统的平均负载逐渐升高,有可能是临时的也有可能持续上升,需要观察
4、一旦1分钟的平均负载接近或超过了CPU的个数,就意味着,系统正在发生过载的问题,这时候就得分析问题了,并且要想办法优化。
5、对于只有单核cpu的系统,1.0是该系统所能承受负荷的边界值,大于1.0则有处理需要等待。
一个单核cpu的系统,平均负载的合适值是o.7以下。如果负载长期徘徊在1.0,则需要考虑马上处理了。超过1.0的负载,可能会带来非常严重的后果。
当然,多核cpu的系统是在前述值的基础上乘以cpu内核的个数。如对于多核cpu的系统,有N个核则所能承受的边界值为N.0。
Load Average
平均负载 (load average) 是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数。通过系统命令”w” 或”top”可以查看当前 load average 情况。
第一位:表示最近1分钟平均负载;
第二位:表示最近5分钟平均负载;
第三位:表示最近15分钟平均负载。
假设我们的系统是单CPU单内核的,把它比喻成是一条单向马路,把CPU任务比作汽车。当车不多的时候,load < 1;当车占满整个马路的时候 load = 1;当马路都站满了,而且马路外还堆满了汽车的时候,load > 1。
我们经常会发现服务器Load > 1但是运行仍然不错,那是因为服务器是多核处理器。假设我们服务器CPU是2核,那么将意味我们拥有2条马路,我们的Load = 2时,所有马路都跑满车辆。
0.7 < load < 1:此时是不错的状态,如果进来更多的汽车,你的马路仍然可以应付;
load = 1:你的马路即将拥堵,而且没有更多的资源额外的任务,赶紧看看发生了什么吧;
load > 5:非常严重拥堵,我们的马路非常繁忙,每辆车都无法很快的运行。
通常我们先看15分钟load,如果load很高,再看1分钟和5分钟负载,查看是否有下降趋势。1分钟负载值 > 1,那么我们不用担心,但是如果15分钟负载都超过1,我们要赶紧看看发生了什么事情。所以我们要根据实际情况查看这三个值。
可以使用如下命令来查看每个处理器的信息:
cat / proc/ cpuinfo
如果只想计算有多少个cpu内核,可以使用如下命令:
cat / proc / cpuinfo l grep 'model name' / wc -l
2.第二行Tasks任务运行概况:
Tasks: 178 total, 1 running, 177 sleeping, 0 stopped, 0 zombie
-
total #任务数量总计
-
running #正在运行的
-
sleeping #睡眠状态的
-
stopped #停止的
-
zombie #僵尸进程
3.第三行 CPU概览: %Cpu(s) 表示CPU使用百分比,按照时间占用计算,单位s
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
us #用户态进程占用cpu时间的百分比
sy #内核态进程占用cpu时间的百分比
ni #代表优先被调度的进程占cpu时间的百分比
id #cpu空闲的百分比
wa #cpu等待io的百分比
hi #硬件中断,处理硬件中断所占用CPU的时间
si #软件中断,处理软件中断所占用CPu的时间
st #被偷走的cpu,虚拟机占用物理机CPU的百分比
4.第四行 KiB Mem内存概览(KB):
KiB Mem : 995712 total, 252208 free, 404372 used, 339132 buff/cache
total #物理内存总量
used #使用的物理内存总量
free #空闲内存总量
buff/cache #用作内核缓存的内存量
5.第五行 KiB Swap缓存区概况(KB):
KiB Swap: 2097148 total, 2097148 free, 0 used. 431828 avail Mem
total #交换区总量
used #使用的虚拟缓存交换区总量
free #空闲交换区总量
avail Mem #有效的
cached Mem #缓冲的交换区总量。
2、进程(任务)区域状态监控
第七行及以下显示了各进程(任务)的 状态监控。常用重要的列所代表的含义如下:
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 进程名称(命令名/命令行)
进程信息区统计信息区域的下方显示了各个进程的详细信息含义。
序号 | 列名 | 含义 |
---|---|---|
1 | PID | 进程id |
2 | PPID | 父进程id |
3 | RUSER | 真正的用户名 |
4 | UID | 进程所有者的用户id |
5 | USER | 进程所有者的用户名 |
6 | GROUP | 进程所有者的组名 |
7 | TTY | 启动进程的终端名。不是从终端启动的进程则显示为 ? |
8 | PR | 优先级 |
9 | NI | nice值。负值表示高优先级,正值表示低优先级 |
10 | P | 最后使用的CPU,仅在多CPU环境下有意义 |
11 | %CPU | 上次更新到现在的CPU时间占用百分比 |
12 | TIME | 进程使用的CPU时间总计,单位秒 |
13 | TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
14 | %MEM | 进程使用的物理内存百分比 |
15 | VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
16 | SWAP | 进程使用的虚拟内存中,被换出的大小,单位kb。 |
17 | RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
18 | CODE | 可执行代码占用的物理内存大小,单位kb |
19 | DATA | 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb |
20 | SHR | 共享内存大小,单位kb |
21 | nFLT | 页面错误次数 |
22 | nDRT | 最后一次写入到现在,被修改过的页面数。 |
23 | S | 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程) |
24 | COMMAND | 命令名/命令行 |
25 | WCHAN | 若该进程在睡眠,则显示睡眠中的系统函数名 |
26 | Flags | 任务标志,参考 sched.h |