动态监控进程
动态监控进程
top
top
与ps
命令很相似。它们都用来显示正在执行的进程。top
与ps
最大的不同之处,在于top
在执行一段时间可以更新正在运行的的进程。
Linux top 命令用于实时显示 process 的动态。类似于 Windows 的任务管理器。
top 命令的参数不多,真正好用的是它的交互菜单,一般我们不带参数直接使用top
命令
……
现在我们来逐行分析页面中的信息
前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。
第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:
-
17:15:44 — 当前系统时间
-
up 49 min— 系统已经运行了 49 分钟(在这期间系统没有重启过)
-
2 users — 当前有 2 个用户登录系统
-
load average: 0.00, 0.01, 0.05 — load average 后面的三个数分别是 1 分钟、5 分钟、15 分钟的负载情况。
-
load average 数据是每隔 5 秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑 CPU 的数量,结果高于 5 的时候就表明系统在超负荷运转了。
第二行,Tasks — 任务(进程),具体信息说明如下:
系统现在共有 178 个进程,其中处于运行中的有 1 个,177 个在休眠(sleep),stoped 状态的有 0 个,zombie 状态(僵尸进程,进程已经死掉,但是内存空间没有释放)的有 0 个。
第三行,CPU 状态信息,
具体属性说明如下:
-
0.0% us
— user 用户空间占用 CPU 的百分比。 -
0.1% sy
— system 内核空间占用 CPU 的百分比。 -
0.0% ni
— nice 改变过优先级的进程占用 CPU 的百分比 -
99.9% id
— idle 空闲 CPU 百分比 -
0.0% wa
— IO 等待占用 CPU 的百分比 -
0.0% hi
— 硬中断(Hardware IRQ)占用 CPU 的百分比 -
0.0% si
— 软中断(Software Interrupts)占用 CPU 的百分比
备注:在这里 CPU 的使用比率和 windows 概念不同,需要理解 linux 系统用户空间和内核空间的相关知识!
此外,这里的指标展示的是所有 CPU 的平均值。按数字 1,可以展示每一个 CPU 的情况:
可以看到当前系统有 8 个核心,如果是用虚拟机创建的系统,那么这跟我们在确定虚拟机硬件的时候选择的 CPU 核心数应该是一样的。
第四行,内存状态,单位是字节(Kbyte),具体信息如下:
-
4026384 total — 物理内存总量(3.8GB)
-
392340 used — 使用中的内存总量(383M)
-
3197800 free — 空闲内存总量(3GB)
-
436244 buffers — 缓存的内存量(426M)
第五行,swap 交换分区信息(Kbyte),具体信息说明如下:
-
2097148 total — 交换区总量(2GB)
-
0 used — 使用的交换区总量(0K)
-
2097148 free — 空闲交换区总量(2GB)
-
0 cached — 缓冲的交换区总量(0GB)
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到 free 中去,因此在 linux 上 free 内存会越来越少,但不用为此担心。
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的 free + 第四行的 buffers + 第五行的 cached,按这个公式此台服务器的可用内存:436244 +3197800 +392340 = 3.8GB 左右。
对于内存监控,在 top 里我们要时刻监控第五行 swap 交换分区的 used,如果这个数值在不断的变化,说明内核在不断进行内存和 swap 的数据交换,这是真正的内存不够用了。
第六行,空行。
前 5 行,统计信息区显示完毕,接下来开始显示进程信息
第七行以下:各进程(任务)的状态监控,项目列信息说明如下:
-
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 — 进程名称(命令名/命令行)
重点关注字段: RES
、%MEM
、%CPU
交互式菜单
按 h 进入帮助菜单
功能菜单:
-
Sihft + V
:切换视图,是树形图,还是列表,感觉还是列表直观些。 -
i:切换显示所有进程还是隐藏闲置或者僵死进程
-
z:切换配色风格
-
d:设置更新时间,默认 3 秒
-
n:只显示多少行进程
-
Shift + <
、Shift + >
:翻页 -
Shift + l
(L 的小写):高亮特定字段,查询字段 -
u 按用户进行筛选
-
Shift +P
:直接以 cpu 进行排序,常用 -
Shift +M
:以内存使用率进行排序,常用 -
Shift +N
:以 PID 进行排序 -
Shift +T
:以 PID 根据时间/累计时间进行排序 -
f:按 f 进入字段管理,选择任何一个字段,按 d 控制显隐,按 s 控制是否以其排序,只能设置一个排序字段
-
Sihft + R
:切换正序倒序排序 -
x:切换是否高亮排序列
-
Sihft + J
:切换数字对齐方式,左对齐或者右对齐 -
j:切换文字对齐方式,左对齐或者右对齐
-
c:切换 cmd 命令名称还是 cmd 详情
-
k:输入进程 ID 杀死进程
-
m:切换统计信息区的第四行和第五行的内存信息的显示内容
-
q:退出
top 常用参数
-
-H
:指示top
显示单个线程。如果没有这个命令行选项,将显示每个进程中所有线程的总和。稍后,可以使用H
交互式命令更改此设置。 -
-p
:仅监控具有指定进程号的进程,进程 ID 可以指定多个。最多可以指定 20 次,或者您可以提供一个以逗号分隔的列表,最多可以使用 20 个 pid。允许将两种方法混合使用。此时,pid 那一列展示的是线程 id(注意,这个线程 id 是十进制的,但是在 Java 虚拟机中,线程 id 都是 16 进制的,以 0x 开头,因此,我们需要通过echo "obase=16;number" | bc
来讲十进制数转化为 16 进制数)
常用 top -Hp pid
来查看指定 pid 下的所有线程。这样我们看到哪个线程占用 CPU 或者内存最高,然后通过打印调用栈定位到代码。解决问题。
top 命令结果分析
TODO