Linux 进程管理
不管在测试的时候、在实际的生产环境中,还是自己的使用过程中,难免会遇到一些进程异常的情况,所以 Linux 为我们提供了一些工具来查看进程的状态信息。我们可以通过 top 实时的查看进程的状态,以及系统的一些信息(如 CPU、内存信息等),我们还可以通过 ps 来静态查看当前的进程信息,同时我们还可以使用 pstree 来查看当前活跃进程的树形结构。
top 工具的使用
top 工具是我们常用的一个查看工具,能实时的查看我们系统的一些关键信息的变化。
top 显示的第一排的含义
内容 | 解释 |
---|---|
top | 表示当前程序的名称 |
22:06:28 | 表示当前的系统的时间 |
up 22 days, 22:58 | 表示该机器已经启动了多长时间 |
1 user | 表示当前系统中只有一个用户 |
load average:0.48,0.49,0.50 | 分别对应 1、5、15 分钟内 cpu 的平均负载 |
比较有经验的运维或者系统管理员会将临界值定为 0.7,load小于0.7的时候并不会去关注;若是 0.7 < load < 1 的时候我们就需要稍微关注一下了,虽然还可以应付但是这个值已经离临界不远了;若是 load = 1 的时候我们就需要警惕了,因为这个时候已经没有更多的资源的了,已经在全力以赴了;若是 load > 5 的时候系统已经快不行了,这个时候你需要加班解决问题了。
#查看物理 CPU 的个数
cat /proc/cpuinfo | grep "physical id" | sort | uniq |wc -l
#每个 cpu 的核心数
cat /proc/cpuinfo | grep "physical id" | grep "0" | wc -l
top 显示的第二排的含义
内容 | 解释 |
---|---|
Tasks: 26 total | 进程总数 |
1 running | 1 个正在运行的进程数 |
25 sleeping | 25 个睡眠的进程数 |
0 stopped | 没有停止的进程数 |
0 zombie | 没有僵尸进程数 |
top 显示的第三排的含义
内容 | 解释 |
---|---|
Cpu(s): 2.7%us | 用户空间进程占用 CPU 百分比 |
1.2% sy | 内核空间运行占用 CPU 百分比 |
0.0%ni | 用户进程空间内改变过优先级的进程占用 CPU 百分比 |
96.1%id | 空闲 CPU 百分比 |
0.0%wa | 等待输入输出的 CPU 时间百分比 |
0.0%hi | 硬中断(Hardware IRQ)占用 CPU 的百分比 |
0.1%si | 软中断(Software IRQ)占用 CPU 的百分比 |
0.0%st | (Steal time) 是 hypervisor 等虚拟服务中,虚拟 CPU 等待实际 CPU 的时间的百分比 |
CPU 利用率是对一个时间段内 CPU 使用状况的统计,通过这个指标可以看出在某一个时间段内 CPU 被占用的情况,而 Load Average 是 CPU 的 Load,它所包含的信息不是 CPU 的使用率状况,而是在一段时间内 CPU 正在处理以及等待 CPU 处理的进程数情况统计信息,这两个指标并不一样。
top 显示的第四排的含义
内容 | 解释 |
---|---|
total | 物理内存总量 |
free | 空闲内存总量 |
used | 使用的物理内存总量 |
buff | 用作内核缓存的内存量 |
系统中可用的物理内存最大值并不是 free 这个单一的值,而是 free + buffers + swap 中的 cached 的和。
top 显示的第五排的含义
内容 | 解释 |
---|---|
total | 交换区总量 |
free | 空闲交换区总量 |
used | 使用的交换区总量 |
avail | 缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖 |
top 最下方进程管理
内容 | 解释 |
---|---|
PID | 进程 id |
USER | 该进程的所属用户 |
PR | 该进程执行的优先级 priority 值 |
NI | 该进程的 nice 值 |
VIRT | 该进程任务所使用的虚拟内存的总数 |
RES | 该进程所使用的物理内存数,也称之为驻留内存数该进程共享内存的大小 |
SHR | 该进程共享内存的大小 |
S | 该进程进程的状态: S=sleep R=running Z=zombie |
%CPU | 该进程 CPU 的利用率 |
%MEM | 该进程内存的利用率 |
TIME+ | 该进程活跃的总时间 |
COMMAND | 该进程运行的名字 |
-
NICE 值:静态优先级,是用户空间的一个优先级值,其取值范围是 -20 至 19。这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。nice 值中的 -20 到 19,中 -20 优先级最高, 0 是默认的值,而 19 优先级最低。
-
PR 值:表示 Priority 值叫动态优先级,是进程在内核中实际的优先级值,进程优先级的取值范围是通过一个宏定义的,这个宏的名称是 MAX_PRIO,它的值为 140。Linux 实际上实现了 140 个优先级范围,取值范围是从 0-139,这个值越小,优先级越高。而这其中的 0-99 是实时进程的值,而 100-139 是给用户的。其中 PR 中的 100 to 139 值部分有这么一个对应 PR = 20 + (-20 to +19),这里的 -20 to +19 便是 nice 值,所以说两个虽然都是优先级,而且有千丝万缕的关系,但是他们的值,他们的作用范围并不相同。
-
VIRT :任务所使用的虚拟内存的总数,其中包含所有的代码,数据,共享库和被换出 swap 空间的页面等所占据空间的总数。
top 常用交互命令
常用交互命令 | 解释 |
---|---|
q | 退出程序 |
l | 切换显示平均负载和启动时间的信息 |
P | 根据 CPU 使用百分比大小进行排序 |
M | 根据驻留内存大小进行排序 |
i | 忽略闲置和僵死的进程,这是一个开关式命令 |
k | 终止一个进程,系统提示输入 PID 及发送的信号值。一般终止进程用 15 信号,不能正常结束则使用 9 信号。安全模式下该命令被屏蔽 |
ps 工具的使用
ps 也是我们最常用的查看进程的工具之一,通过 ps aux
能显示进程的详细信息。
此外也可以通过 ps axjf
将连同部分的进程呈树状显示出来。
若是查找其中的某个进程的话,我们还可以配合着 grep
和正则表达式一起使用。
内容 | 解释 |
---|---|
F | 进程的标志(process flags),当 flags 值为 1 则表示此子程序只是 fork 但没有执行 exec,为 4 表示此程序使用超级管理员 root 权限 |
USER | 进程的拥有用户 |
PID | 进程的ID |
PPID | 父进程的ID |
SID | session的ID |
TPGID | 前台进程组的ID |
%CPU | 进程占用的CPU百分比 |
%MEM | 占用内存的百分比 |
NI | 进程的NICE值 |
VSZ | 进程使用虚拟内存大小 |
RSS | 驻留内存中页的大小 |
TTY | 终端ID |
S or STAT | 进程状态 |
WCHAN | 正在等待的进程资源 |
START | 启动进程的时间 |
TIME | 进程消耗CPU的时间 |
COMMAND | 命令的名称和参数 |
TPGID栏写着-1 的都是没有控制终端的进程,也就是守护进程
STAT表示进程的状态,而进程的状态有很多,如下表所示:
状态 | 解释 |
---|---|
R | Running.运行中 |
S | Interruptible Sleep.等待调用 |
D | Uninterruptible Sleep.不可中断睡眠 |
T | Stoped.暂停或者跟踪状态 |
X | Dead.即将被撤销 |
Z | Zombie.僵尸进程 |
W | Paging.内存交换 |
N | 优先级低的进程 |
< | 优先级高的进程 |
s | 进程的领导者 |
L | 锁定状态 |
l | 多线程状态 |
+ | 前台进程 |
其中的 D 是不能被中断睡眠的状态,处在这种状态的进程不接受外来的任何 signal,所以无法使用 kill 命令杀掉处于 D 状态的进程,无论是 kill,kill -9 还是 kill -15,一般处于这种状态可能是进程 I/O 的时候出问题了。
pstree 工具的使用
通过 pstree 可以很直接的看到相同的进程数量,最主要的还是我们可以看到所有进程之间的相关性。
参数选择 | 解释 |
---|---|
-A | 程序树之间以ASCII字符连接 |
-p | 同时列出每个process的PID |
-u | 同时列出每个process的所属账户名称 |
kill 工具的使用
信号值 | 作用 |
---|---|
-1 | 重新读取参数运行,类似于restart |
-2 | 如同ctrl+c的操作退出 |
-9 | 强制终止该进程 |
-15 | 正常的方式终止该进程 |
若是在使用 kill +信号值然后直接加 pid,你将会对 pid 对应的进程进行操作。