我们将学习一些 Linux 所提供的工具来进行进程的查看与控制,掌握这些工具让我们能在某些进程出现异常的时候及时查看相关的指标,从而解决问题。
进程查看
不管在测试的时候、在实际的生产环境中,还是自己的使用过程中,难免会遇到一些进程异常的情况,所以 Linux 为我们提供了一些工具来查看进程的状态信息。我们可以通过top
实时的查看进程的状态,以及系统的一些信息(如 CPU、内存信息等),我们还可以通过ps
来静态查看当前的进程信息,同时我们还可以使用 pstree
来查看当前活跃进程的树形结构。
top工具使用
实时的查看我们系统的一些关键信息的变化:
top
top
是一个在前台执行的程序,所以执行后便进入到这样的一个交互界面,正是因为交互界面我们才可以实时的获取到系统与进程的信息。在交互界面中我们可以通过一些指令来操作和筛选。在此之前我们先来了解显示了哪些信息。
我们看到 top 显示的第一排:
load average:
也就是对当前 CPU 工作量的度量,具体来说也就是指运行队列的平均长度(也是等待CPU的平均进程数)。
假设我们的系统是单 CPU、单内核的,把它比喻成是一条单向的桥,把CPU任务比作汽车。
load = 0
的时候意味着这个桥上并没有车,cpu 没有任何任务;load < 1
的时候意味着桥上的车并不多,一切都还是很流畅的,cpu 的任务并不多,资源还很充足;load = 1
的时候就意味着桥已经被车给占满了,没有一点空隙,cpu 的已经在全力工作了,所有的资源都被用完了,当然还好,这还在能力范围之内,只是有点慢而已;load > 1
的时候就意味着不仅仅是桥上已经被车占满了,就连桥外都被占满了,cpu 已经在全力工作,系统资源的用完了,但是还是有大量的进程在请求,在等待。若是这个值大于2、大于3,表示进程请求超过 CPU 工作能力的 2 到 3 倍。而若是这个值 > 5 说明系统已经在超负荷运作了。
这是单个 CPU 单核的情况,而实际生活中我们需要将得到的这个值除以我们的核数来看。我们可以通过以下的命令来查看 CPU 的个数与核心数
通过上面的指数我们可以得知 load 的临界值为 1
(单CPU,CPU单内核) ,但是在实际生活中,比较有经验的运维或者系统管理员会将临界值定为0.7
,这个数是除以核心数以后的值。
- 若是
load < 0.7
并不会去关注他; - 若是
0.7< load < 1
的时候我们就需要稍微关注一下了,虽然还可以应付但是这个值已经离临界不远了; - 若是
load = 1
的时候我们就需要警惕了,因为这个时候已经没有更多的资源的了,已经在全力以赴了; - 若是
load > 5
的时候系统已经快不行了,这个时候你需要加班解决问题了
通常我们都会先看 15 分钟的值来看这个大体的趋势,然后再看 5 分钟的值对比来看是否有下降的趋势。
查看 busybox
的代码可以知道,数据是每 5 秒钟就检查一次活跃的进程数,然后计算出该值,然后 load 从 /proc/loadavg
中读取的。而这个 load 的值是如何计算的呢,load 的源码中有相应的计算公式。
来看 top 的第二行数据,第二行是进程的一个情况统计:
来看 top 的第三行数据,这一行是 CPU 的一个使用情况的统计:
CPU 利用率是对一个时间段内 CPU 使用状况的统计,通过这个指标可以看出在某一个时间段内 CPU 被占用的情况,而 Load Average
是 CPU 的 Load,它所包含的信息不是 CPU 的使用率状况,而是在一段时间内 CPU 正在处理以及等待 CPU 处理的进程数情况统计信息,这两个指标并不一样。
来看 top 的第四行数据,这一行是内存的一个使用情况的统计:
注意:系统中可用的物理内存最大值并不是 free 这个单一的值,而是 free + buffers + swap
中的cached
的和。
来看 top 的第五行数据,这一行是交换区的一个使用情况的统计:
再下面就是进程的一个情况了
注意:
NICE
值(显示的为NI
)叫做静态优先级,是用户空间的一个优先级值,其取值范围是-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 是一个前台程序,所以是一个可以交互的:
好好的利用 top 能够很有效的帮助我们观察到系统的瓶颈所在,或者是系统的问题所在。
ps工具的使用
ps
也是我们最常用的查看进程的工具之一
ps aux
ps axjf
这些信息的代表的含义:
TPGID
栏写着-1
的都是没有控制终端的进程,也就是守护进程
STAT
表示进程的状态,而进程的状态有很多,如下表所示
其中的D
是不能被中断睡眠的状态(一直睡眠),处在这种状态的进程不接受外来的任何 signal,所以无法使用kill
命令杀掉处于D状态的进程,无论是 kill,kill -9 还是 kill -15,一般处于这种状态可能是进程 I/O 的时候出问题了。
ps
命令有很多参数,使用 -l
参数可以显示自己这次登陆的 bash 相关的进程信息罗列出来
ps -l
更常用下面这个命令,他会罗列出所有的进程信息
ps aux
若是查找其中的某个进程的话,我们还可以配合着 grep
和正则表达式一起使用
ps aux | grep zsh
此外我们还可以查看时,将连同部分的进程呈树状显示出来
ps axjf
当然如果你觉得使用这样的此时没有把你想要的信息放在一起,我们也可以使用这样的命令,来自定义我们所需要的参数显示:
ps -afxo user,ppid,pid,pgid,command
pstree工具的使用
pstree
pstree -up
#参数选择:
#-A :各程序树之间以 ASCII 字元来连接;
#-p :同时列出每个 process 的 PID;
#-u :同时列出每个 process 的所属账户名称。
kill命令的掌握
当一个进程结束的时候或者要异常结束的时候,会向其父进程返回一个或者接收一个 SIGHUP 信号而做出的结束进程或者其他的操作,这个SIGHUP 信号不仅可以由系统发送,我们可以使用 kill 来发送这个信号来操作进程的结束或者重启等等。另外我们使用的 kill 命令不光可以管理我们的 job也可以直接对 pid 下手。
#首先我们使用图形界面打开了 gedit、gvim,用 ps 可以查看到
ps aux
#使用9这个信号强制结束 gedit 进程
kill -9 1608
#我们再查找这个进程的时候就找不到了
ps aux | grep gedit
进程的执行顺序
我们在使用 ps 命令的时候可以看到大部分的进程都是处于休眠的状态,如果这些进程都被唤醒,那么该谁最先享受 CPU 的服务,后面的进程又该是一个什么样的顺序呢?进程调度的队列又该如何去排列呢?
当然就是靠该进程的优先级值来判定进程调度的优先级,而优先级的值就是上文所提到的 PR 与 nice 来控制与体现了。
而 nice 的值我们是可以通过 nice 命令来修改的,而需要注意的是 nice 值可以调整的范围是 -20 ~ 19,其中 root 有着至高无上的权力,既可以调整自己的进程也可以调整其他用户的程序,并且是所有的值都可以用,而普通用户只可以调制属于自己的进程,并且其使用的范围只能是 0 ~ 19,因为系统为了避免一般用户抢占系统资源而设置的一个限制(值越小,优先级越高)。
#打开一个程序放在后台,或者用图形界面打开
nice -n -5 vim &
#用 ps 查看其优先级
ps -afxo user,ppid,pid,stat,pri,ni,time,command | grep vim
我们还可以用 renice
来修改已经存在的进程的优先级
renice -5 pid
more
关于Load Average的博客:
https://scoutapp.com/blog/understanding-load-averages