【top 工具】
top 是一个在前台执行的程序,通过交互界面可以实时的获取到进程的状态与系统的信息,在交互界面中可以通过一些指令来操作和筛选。
常用的交互命令有:
q |
退出程序 |
I | 切换显示平均负载和启动时间的信息 |
P | 根据 CPU 使用百分比大小进行排序 |
M | 根据驻留内存大小进行排序 |
i | 开关式命令,忽略闲置和僵死的进程 |
k | 终止一个进程,系统提示输入 PID 及发送的信号值。 一般终止进程用 15 信号,不能正常结束则使用 9 信号。 (安全模式下该命令被屏蔽) |
1)top 中的第一行数据
top |
当前程序的名称 |
18:50:24 | 当前的系统时间 |
up 6 mins | 该机器已经启动了多长时间 |
1 user | 当前系统中用户数量 |
load average: 0.43,0.84,0.47 | 对应第 1、5、15 分钟内 cpu 的平均负载 |
说明:关于 load average
① load average 是对当前 CPU 工作量的度量,是与等待 CPU 的平均进程数相关的一个计算值,也就是运行队列的平均长度。
② 假设我们的系统是单 CPU、单内核的,把它比喻成是一条单向的桥,把 CPU 任务比作汽车,则:
当 load = 0 时,意味着这个桥上并没有车,cpu 没有任何任务;
当 load < 1 时,意味着桥上的车并不多,一切都还是很流畅的,cpu 的任务并不多,资源还很充足;
当 load = 1 时,意味着桥已经被车给占满了,没有一点空隙,cpu 的已经在全力工作,系统资源都被用完了,但还在能力范围之内,只是有点慢而已;
当 load > 1 时,意味着不仅是桥上已经被车占满了,连桥外也被占满了,cpu 已经在全力的工作,系统资源都被用完了,但是还是有大量的进程在请求,在等待运行。
这是单个 CPU 单核的情况,而实际生活中我们需要将得到的这个值除以我们的核数来看。
③ load 的临界值一般为 1 ,但在实际中,有经验的运维或者系统管理员会将临界值定为 0.7。
当 load < 0.7 时,并不会去关注他;
当 0.7< load < 1 时,就需要稍微关注,此时虽然还可以应付,但是这个值已经离临界不远了;
当 load = 1 时,就需要警惕,此时已经没有更多的资源,cpu 已经在全力以赴了;
当 load > 5 时,系统已经快不行了,这个时候就需要系统管理员加班解决问题了
④ 通常来说,我们都会先看 15 分钟的值来看这个大体的趋势,然后再看 5 分钟的值对比来看是否有下降的趋势。
2)top 中的第二行数据
第二行数据,是进程的一个情况统计
Tasks: 245 total |
进程总数 |
1 running | 正在运行的进程数 |
244 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
3)top 中的第三行数据
第三行数据,是对 CPU 的使用情况的统计
5.3 us |
用户空间进程占用 CPU 百分比 |
3.9 sy | 内核空间运行占用 CPU 百分比 |
0.0 ni | 用户进程空间内改变过优先级的进程占用 CPU 百分比 |
90.8 id | 空闲 CPU 百分比 |
0.0 wa | 等待输入输出的 CPU 时间百分比 |
0.0 hi | 硬中断(Hardware IRQ)占用 CPU 的百分比 |
0.0 si | 软中断(Software IRQ)占用 CPU 的百分比 |
0.0 st | Steal time,虚拟服务中,虚拟 CPU 等待实际 CPU 的时间的百分比 |
CPU 利用率是对一个时间段内 CPU 使用状况的统计,通过这个指标可以看出在某一个时间段内 CPU 被占用的情况,而 Load Average 是 CPU 的 Load,它所包含的信息不是 CPU 的使用率状况,而是在一段时间内 CPU 正在处理以及等待 CPU 处理的进程数情况统计信息,这两个指标并不一样。
4)top 中的第四行数据
第四行数据,是对内存的使用情况的统计
3926.1 total | 物理内存总量 |
2004.8 used | 使用的物理内存总量 |
1174.1 free | 空闲内存总量 |
747.1 buff/cache | 用作内核缓存的内存量 |
系统中可用的物理内存最大值并不是 free 这个单一的值,而是 free + buffers + swap 中的 cached 的和。
5)top 中的第五行数据
第五行数据,是对交换区的使用情况的统计
4094.0 total | 交换区总量 |
4094.0 used | 使用的交换区总量 |
0.0 free | 空闲交换区总量 |
2494.0 avail Mem | 缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖 |
6)top 中的第六行至结尾
从第六行到结尾,每一行都是一个进程的情况
PID | 进程 id |
USER | 进程的所属用户 |
PR | 进程执行的优先级 priority 值 |
NI | 进程的 nice 值 |
VIRT | 进程任务所使用的虚拟内存的总数 |
RES | 进程所使用的物理(驻留)内存数 |
SHR | 进程共享内存的大小 |
S | 进程的进程的状态 |
%CPU | 进程 CPU 的利用率 |
%MEM | 进程内存的利用率 |
TIME+ | 进程活跃的总时间 |
COMMAND | 进程运行的名字 |
说明
① NICE 值叫做静态优先级,是用户空间的一个优先级值。其值越小,进程优先级越高;值越大,进程优先级越低。
NICE 值的取值范围是 -20 to +19, 默认值为 0,-20 优先级最高,19 优先级最低。
② PR 值叫做动态优先级,是进程在内核中实际的优先级值,进程优先级的取值范围是通过一个叫做 MAX_PRIO 的宏定义的,它的值为 140。其值越小,进程优先级越高;值越大,进程优先级越低。
Linux 实际上实现了 140 个优先级范围,取值范围是从 0 - 139,而这其中,0 - 99 是实时进程的值,100 - 139 是给用户的。
100 - 139 的值部分,有这么一个对应:PR = 20 + (-20 to +19),这里的 -20 to +19 便是 NICE 值。
因此,NICE 值与 PR 值虽然都是优先级,而且有着千丝万缕的关系,但是他们的值、作用范围并不相同。
③ VIRT 表示进程任务所使用的虚拟内存的总数,其中包含所有的代码,数据,共享库、被换出 swap 空间的页面等所占据空间的总数。
【进程的优先控制】
进程的优先执行顺序是根据该进程的优先级值来判定进程调度的优先级,而优先级的值就是上文所提到的 PR 值与 NICE 值来控制、体现的。
NICE 的值可以通过 nice 命令来修改的,而需要注意的是 nice 值可以调整的范围是 -20 ~ 19,其中 root 用户有着最高权限,既可以调整自己的进程也可以调整其他用户的程序,并且是所有的值都可以用,而普通用户只可以调整属于自己的进程,并且其使用的范围只能是 0 ~ 19,这是系统为了避免一般用户抢占系统资源而设置的一个限制。
nice 命令格式:nice -n 优先级数值 要调整的进程
实例:打开一个程序放在后台,调整优先级后用 ps 命令查看
【ps 命令】
1.ps 命令,是最基本最强大的进程查看命令,可以确定正在运行的进程、运行的状态、进程是否结束、哪些进程占用了过多的资源等。
2.命令格式:ps [选项]
3.常用选项
a | 显示现行终端机下的所有程序,包括其他用户的程序 |
-a | 显示所有终端机下执行的程序,除了阶段作业领导者之外 |
u | 以用户为主的格式来显示程序状况 |
x | 显示所有程序,不以终端机来区分 |
f | 用ASCII字符显示树状结构,表达程序间的相互关系 |
j/-j | 采用工作控制的格式显示程序状况 |
l/-l | 采用详细的格式来显示程序状况 |
-o | 自定义所需要的显示 |
4.输出内容说明
F |
进程的标志 |
USER | 进程的拥有用户 |
PID | 进程的 ID |
PPID | 其父进程的 PID |
SID |
会话的 ID |
TPGID | 前台进程组的 ID |
%CPU | 进程占用的 CPU 百分比 |
%MEM | 占用内存的百分比 |
NI | 进程的 NICE 值 |
VSZ | 进程使用虚拟内存大小 |
RSS | 驻留内存中页的大小 |
TTY | 终端 ID |
S/STAT | 进程状态 |
WCHAN | 正在等待的进程资源 |
START | 启动进程的时间 |
TIME | 进程消耗CPU的时间 |
COMMAND | 命令的名称和参数 |
注:
① F(Flags)栏,当值为 1 时,表示此子程序仅是 fork() 但没有执行 exec();当值为 4 时,表示此程序使用超级管理员 root 权限
② TPGID 栏写着 -1 的都是没有控制终端的进程,即守护进程
③ S/STAT 栏表示进程的状态,常见状态如下
R | Running.运行中 |
S | Interruptible Sleep.等待调用 |
D | Uninterruptible Sleep.不可中断睡眠 |
T | Stoped.暂停或者跟踪状态 |
X |
Dead.即将被撤销 |
Z | Zombie.僵尸进程 |
W | Paging.内存交换 |
N | 优先级低的进程 |
< | 优先级高的进程 |
s | 进程的领导者 |
L | 锁定状态 |
l | 多线程状态 |
+ | 前台进程 |
5.常用查询命令
1)罗列出所有的进程信息:ps aux
2)查找某个进程,还可以配合 grep 与正则表达式一起使用:ps | grep 进程名
3)将连同部分的进程呈树状显示出来:ps axjf
4)自定义所需要的显示:ps -afxo user,ppid,pid,pgid,command...
【pgrep 命令】
1.作用:以名称为依据从运行进程队列中查找进程,并显示查找到的进程 pid,一般用来判断程序是否正在运行。
2.命令格式:pgrep [选项] 进程名
注:pgrep 命令支持 grep 命令的匹配模式
3.常见选项:
-o |
仅显示找到的最小(起始)进程号 |
-n | 仅显示找到的最大(结束)进程号 |
-l | 显示进程名称 |
-P | 指定父进程号 |
-g | 指定进程组 |
-t | 指定开启进程的终端 |
-u | 指定进程的有效用户ID |
4.实例:
【pstree 命令】
1.作用:直接的看到相同的进程数量,最主要的还可以看到所有进程之间的相关性。
2.命令格式:pstree [选项]
3.常见选项:
-a | 显示完整指令 |
-p | 显示PID |
-u | 显示用户名称 |
-n | 以程序识别码排序(默认是以程序名称排序) |
4.实例: