Linux 之 进程管理 -- 进程观察
学习进程管理的原因(~就是要学会解决下面的👇问题啊~)
- 在当整个系统资源快要被使用光时,能够找出最耗系统的那个进程,然后删除该进程,让系统恢复正常。
- 此外,如果由于某个程序写的不好,导致产生一个有问题的进程在内存中,你又如何找出他,然后将他移除?
- 如何同时有五六项任务在系统当中运作,但其中只有一项任务才是最重要的,该如何让那一项重要的任务被最优先执行呢?
发现问题是解决问题的第一步~通过 进程观察 来寻找问题~
原本是想要把进程观察和进程管理写在一起,但是内容有点多,本着偷懒原则,一篇文章可以分两篇来发,何乐不为?
这篇文章主要通过3个方向来观察和寻找问题:
一、ps
撷取和观察 某个时间点 的进程运作情况;
二、top
持续 侦测进程运作 的状态;
三、pstree
查找进程相关性(查找父进程)
1. ps
将某个时间点的进程运作情况撷取下来
这里只记两个常用的ps指令 ps -l
和 ps aux
1.1 ps -l
仅观察自己的bash相关进程
通过ps -l
我们可以获取哪些信息呢?还是借用鸟哥的图
这串串密密麻麻的字母和数字是什么意思呢?
解释一下图中 ps -l 的第三行:
bash的程序属于UID为0的使用者,状态为睡眠(sleep),之所以为睡眠是因为他触发了ps(状态为run)的原因。此进程的PID为14836,优先执行顺序为80,下达bash所取得的终端接口为pts/0,运作状态为等待(wait)
下面就依据👆图片,从左到右的顺序,啰嗦一下吧
- F(process flags)代表进程旗标
说明这个进程的总权限,常见的号码含义:
-- 若为4 表示此进程的权限为root
-- 若为1则表示此进程仅进行复制(fork)而没有实际执行(exec)
-- 若为其他数字,既不是fork之后未执行的进程,也不是使用的超级用户权限 - S (STAT)代表这个进程的状态
主要的状态有
-- R(running): 该程序正在运作中
-- S(Sleep): 该程序目前正在睡眠状态(idle),但可以被唤醒(signal)
-- D: 不可被唤醒的睡眠状态,通常这支程序可能在等待I/O的情况(I/O是电脑的接口,I/O接口的功能是负责实现CPU通过系统总线把I/O电路和 外围设备联系在一起)
-- T: 停止状态(stop),可能是在工作控制(背景暂停)或除错(traced)状态
-- Z(Zombie): 僵尸状态,进程已经终止但无法被移除至内存外 - UID/PID/PPID
代表此进程被该UID所拥有/进程的PID号码/此进程的父进程PID号码 - C:代表CPU使用率,单位为百分比
- PRI/NI(Priority/Nice)
代表此进程被CPU所执行的优先级,数值越小代表该进程越快被CPU执行 - ADDR/SZ/WCHAN (都与内存有关)
-- ADDR(kernel function) 指出该进程在内存的哪个部分,如果是running的进程,一般 就会显示-
-- SZ 代表此进程用掉多少内存
-- WCHAN 表示目前进程是否运作中,-
表示正在运作中 - TTY
登入者的终端机位置,若为远程登陆则使用动态终端接口(pts/n) - TIME
使用掉的CPU时间,注意,是进程实际花费CPU运作的时间,不是系统时间 - CMD
就是command的缩写,即造成此进程的触发程序的指令
1.2 ps aux
观察系统所有的进程
ps aux 观察系统所有进程-1
ps aux 观察系统所有进程-2
ps -l 和 ps aux显示的项目并不相同
- USER 该process 属于哪个使用者账号
- PID 该process的进程标识符
- %CPU 该process使用掉的CPU资源百分比
- %MEM 该process所占用的物理内存百分比
- VSZ 该process使用掉的虚拟内存量(Kbytes)
- RSS 该process占用的固定的内存量(Kbytes)
- TTY 该process是在哪个终端机上面运作,若与终端机无关则显示?,另外,tty1-tty6是本机上面的登入者,若为pts/0等等的,则表示为网络连接进主机的进程
- STAT 该进程目前的状态,状态显示与ps -l的S旗标相同(R/S/T/Z)
- START 该process被触发启动的时间
- TIME 该process实际使用CPU运作的时间
- COMMAND 该进程额实际指令为何
一般来说,ps aux
会依照PID的顺序来排序显示,我们选择其中PID 14836来解释:root 执行的 bash PID 为14836,占用了0.1%的内存容量百分比,状态为休眠(S),该进程启动的时间为8月4号,因为启动太久了,所以没有列出实际的时间点。且取得的终端机环境为pts/1。
1.3 简单认识ps
的其他操作 ps -lA
和 ps axjf
这里小小解释一下,ps -lA
和 ps -l
的输出形式相同,都是F、S、UID、PID等等依次向右排开的,但是ps -lA
明显信息量比ps -l
多好多,因为 ps -lA
显示的是系统所有的进程。(ps -l
仅显示自己bash相关进程)
ps axjf
形成了一个进程树,各进程之间的关系更加直观了(其实和pstree的功能类似,下面第3部分会详细提到)。
这里插入一个小知识点😁~
看看 僵尸进程 长什么样子
僵尸进程
通常,造成僵尸进程的成因是因为该进程应该已经执行完毕,或者是因故应该要终止了。但是该进程个的父进程却无法完整的将该进程结束掉,而造成那个进程一直存在内存当中。如果你发现在某个进程的CMD后面还接上<defunct>时,就代表该进程是僵尸进程。
僵尸进程的出现是因为程序写的不好或者使用者的操作习惯不良等等造成的。当发现系统中有很多僵尸进程时,记得找出该进程的父进程,然后追踪,最后好好的进行主机的环境优化。(有时需要透过reboot的方式来将僵尸进程抹去,reboot是啥?-- 重启计算机~)
2 top
动态观察进程的变化
将
top
和ps
对比着理解:ps
是撷取一个时间点的进程状态,top
则可以持续侦测进程运作的状态
2.1 top的工作模式
工作模式: top [-d 数字] | top [-bnp]
-
-d
后面可以接秒数,就是整个进程画面更新的秒数,预设是5秒 -
-b
以批次的方式执行top,通常会搭配数据流重导向来将批次的结果输出成为文件 -
-n
与-b
搭配,即需要进行几次top的输出结果
(eg:top -b -n 2 > /tmp/top.txt
top信息进行两次,结果输出到/tmp/top.txt) -
-p
指定某些个PID来进行观察监测而已
使用了top之后,一直有数据霸占着屏幕,你将看不到命令行了。
有必要了解以下几个按键指令:在top执行过程中可以使用的按键指令
?
:显示在top当中可以输入的按键指令
P
:以CPU使用的资源排序显示
M
:以Memory 的使用资源排序显示
N
:以PID来排序
T
:由该Process使用的CPU时间累积(TIME+)排序
k
:给予某个PID一个讯号(signal)
r
:给予某个PID重新制定一个nice值
q
:离开top软件的按键
top也可以用来查看自己本机的运行状态,windows可以用putty,MAC可以用terminal,在命令行中输入top...
2.2 认识top提供的信息
下面👇是top动态观察进程变化的截图(来自鸟哥)
top 动态观察进程的变化
top主要分为两个画面:上面6行为整个系统的资源使用状态;下面是每个process使用资源情况
(1) top画面之 系统资源使用状态
上面的画面为整个系统的资源使用状态,基本上总共有六行,显示的内容依次是:
-
第一行 (top):开机时间;已经登入系统的用户人数;系统的平均工作负载
目前的时间 :开机到目前为止所经过的时间(6:07 六小时零七分钟);
已经登入系统的用户人数:(3 users)
load average:系统在1,5,15分钟的平均工作负载(系统平均要负责运作几个进程的意思),数值越小表示系统越闲置,若高于1就要注意你的系统进程是否太过繁复了(CPU的工作负载越大,就代表着,CPU在不同的工作之间进行工作切换越频繁,从而系统越忙碌) -
第二行(Tasks):显示的是目前进程的总量与个别进程在什么状态
(running,sleeping,stopped,zombie),需要注意的是zombie的数值,如果不是0,就要好好看看是哪个process变成僵尸了。 -
第三行(%Cpus):显示的是CPU的整体负载,每个项目可使用
?
查阅。
需要注意的是wa项目,它代表的是I/O wait,通常系统变慢都是I/O产生的问题比较大。如果是多核心的设备,可以按下数字键‘1'来切换成不同CPU的负载率 -
第四行与第五行:表示目前的物理内存与虚拟内存(Mem/Swap)的使用情况。
需要注意的是,swap的使用量要尽量的少,如果swap被使用的很大量,表示系统的物理内存实在不足。 - 第六行:当top程序中输入指令时,显示状态的地方
(2) top画面之 process使用的资源情况
top 下半部分的画面
-
PID
每个process的ID -
USER
该process所属的使用者 -
PR
Priority 的缩写,进程的优先执行顺序,越小越早被执行 -
NI
Nice 的简写,与Priority有关,也是越小越早被执行 -
%CPU
CPU的使用率 -
%MEM
内存的使用率 -
TIME+
CPU使用时间的累加
top预设使用CPU使用率(%CPU)作为排序的重点
- 按指令键
M
使用内存(%MEM)使用率排序,- 按指令键
P
恢复最初的排序- 按指令键
Q
离开top
2.3 通过top仅观察一个已知ID的进程
前面我们知道,top预设是使用CPU使用率作为排序的重点,如果我想要查看的进程CPU使用率不高,排在后面不方便查看怎么办?就可以通过这种方式查看指定的进程。(前提是你要知道进程的PID是啥)
我们以自己登入系统的bash为例吧👇
首先通过echo $$
获得自己bash的PID,再通过top -d -p 14836
查看
top观察自己登入系统的bash进程-2
~更改
NI
的小插曲~
从上面我们可以看到 PID为14836的这支进程NI为0,我想要更改为10怎么办?
- 1.在top画面中直接按下
r
键,top上画面的第六行就会如此显示PID to renice [default pid = 14836]
- 2.直接输入你要更改的PID号码
14836
,第六行显示:Renice PID 14836 to value
3.最后输入10就可以了
更改NI后的图
3 pstree
查找进程之间的相关性
直接在命令行中输入pstree
便可以查到进程相关性,还会使用线段将相关性进程连结起来。不过为了能够让进程树更清晰易懂,还是要加上参数~
工作模式
pstree [-AIU] [-up]
- A
:各进程树之间的连接以ASCII字符来连结- U
:各进程树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误-p
:并同时列出每个process的PID-u
:并同时列出每个process的所属账号名称
-
pstree -A
为了防止语系问题造成乱码问题,经常加上 -A 选项来克服此类线段乱码问题。 -
pstree -Aup
如果还想知道PID与所属使用者,加上-u及-p两个参数即可(帮助寻找父进程)
pstree -A 与 pstree -Aup