资讯

展开

第十五章·Linux系统管理-进程管理

作者:快盘下载 人气:
进程基本概述监控进程状态 动态监控进程进程的优先级[进阶]企业案例,Linux假死是怎么回事后台进程管理系统平均负载[进阶]

-曾老湿, 江湖人称曾老大。

进程基本概述

什么是进程

比如:windows上安装的QQ,我们会将其称为QQ程序,那么当QQ运行之后,在任务管理器中,我们可以看到QQ程序在运行着,此时,我们称其为:QQ进程。

言简意赅总结:当我们运行一个程序,那么我们将该程序叫进程

注意: 1.当程序运行为进程后,系统会为该进程分配内存,以及运行的身份和权限。 2.在进程运行的过程中,服务器上回有各种状态来表示当前进程的指标信息。

进程是已启动的可执行程序的运行实例,进程有以下组成部分:

分配内存, 已分配内存的地址空间 安全属性, 进程的运行身份和权限 进程代码, 运行一个或多个的线程 进程状态, 进程运行后的多种状态 静态程序, 二进制文件, 静态/bin/ls, /usr/sbin/sshd 动态进程, 程序运行的过程, 有生命周期及运行状态

进程的运行环境,包括以下几个部分:

局部和全局变量 当前的调度上下文 分配给进程使用的系统资源,例如文件描述符、网络端口等 给进程分配对应的pid,ppid

监控进程状态

第十五章·Linux系统管理-进程管理

动态监控进程

ssh

进程的优先级[进阶]

什么是优先级

优先级指的是优先享受资源,生活中的例子,比如...算了,太多了。

企业案例,Linux假死是怎么回事

什么是假死

所谓假死,就是能ping通,但是ssh不上去;任何其他操作也都没反应,包括上面部署的nginx也打不开页面。

后台进程管理

什么是后台进程?

通常进程都会在终端前台运行,但是一旦关闭终端,进程也会随着结束,那么此时我们就希望进程能在后台运行,就是将在前台运行的进程放到后台运行,这样即使我们关闭了终端也不影响进程的正常运行。

系统平均负载[进阶]

每次发现系统变慢时,我们通常做的第一件事,就是执行top或者uptime命令,来了解系统的负载情况。

[root@zls ~]# uptime
 20:45:42 up  8:56,  3 users,  load average: 0.01, 0.03, 0.05
#我们已经比较熟悉前面几个例子,他们分别是当前时间,系统运行时间,以及正在登陆用户数

#后面三个数依次是:过去1分钟,5分钟,15分钟的平均负载(Load Average)

什么是平均负载

平均负载不就是单位时间内,CPU的使用率嘛?上面的,0.01不就是CPU的使用率是1% emmmmm...

如果这么理解的话,我还讲他干啥...

那到底如何理解平均负载:平均负载是指,单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数

PS:平均负载与CPU使用率并没有直接关系。


可运行状态和不可中断状态是什么?

1.可运行状态进程,是指正在使用CPU或者正在等待CPU的进程,也就是我们用PS命令看的处于R状态的进程

2.不可中断进程,(你在做什么事情的时候是不能被打断的呢?...不可描述)系统中最常见的是等待硬件设备的IO相应,也就是我们PS命令中看到的D状态(也成为Disk Sleep)的进程。

例如:当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,他是不能被其他进程或者中断程序打断的,这个是后续的进程就处于不可中断的状态,如果此时进程强制被打断,kill -9 ... perfect准备好护照吧,有多远,走多远,千万别回来了。不可中断状态实际上是系统对进程和硬件设备的一种保护机制

因此,可以简单理解为,平均负载其实就是单位时间内的活跃进程数。


平均负载多少时合理?

最理想的状态是每个CPU上都刚还运行着一个进程,这样每个CPU都得到了充分利用。所以在评判负载时,首先你要知道系统有几个CPU,这可以通过top命令获取,或grep 'model name' /proc/cpuinfo

例1: 架设现在在4,2,1核的CPU上,如果平均负载为2时,意味着什么呢? 1.在4个CPU的系统上,意味着CPU有50%空闲。 2.在2个CPU的系统上,以为这所有的CPU都刚好完全被占用。 3.在1个CPU的系统上,则意味着有一半的进程竞争不到CPU。

那么...平均负载有三个数值,我们应该关注哪个呢?

实际上,我们都需要关注,就好比北京5月份的天气,如果只看晚上天气,感觉在过冬天,但是你结合了早上,中午,晚上三个时间点的温度来看,基本就可以全方位的了解这一天的天气情况了。

1.如果1分钟,5分钟,15分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。 2.如果1分钟的值远小于15分钟的值,就说明系统像最近1分钟的负载在减少,而过去15分钟内却有很大的负载。 3.反过来,如果1分钟的大于15分钟,就说明最近1分钟的负载在增加,这种增加有可能只是临时的,也有可能还会持续上升...说的跟股票似的。所以要持续观察。(emmmm...一旦K线下降,就拋,割肉) 4.一旦1分钟的平均负载接近或超过了CPU的个数,就意味着,系统正在发生过载的问题,这时候就得分析问题了,并且要想办法优化。

架设我们在有2个CPU系统上看到平均负载为2.73,6.90,12.98那么说明在过去1分钟内,系统有136%的超载(2.73/2*100%=136%) 5分钟:(6.90/2*100%=345%) 15分钟:(12.98/2*100%=649%) 但整体趋势来看,系统负载是在逐步降低。


企业中平均负载多高需要重点关注呢?

当平均负载高于CPU数量70%的时候,你就应该分析排查负载高的问题了,一旦负载过高,就可能导致进程相应变慢,进而影响服务的正常功能。 但70%这个数字并不是绝对的,最推荐的方法,还是把系统的平均负载监控起来,然后根据更多的历史数据,判断负载的变化趋势,当发现负载有明显升高的趋势时,比如说负载翻倍了,你再去做分析和调查。


平均负载与CPU的使用率有什么关系

在十几工作中,我们经常容易把平均负载和CPU使用率混淆,所以在这里,我也做一个区分,可能你会感觉到疑惑,既然平均负载代表的是活跃进程数,那平均负载搞了,不就意味着CPU使用率高嘛?

我们还是要回到平均负载的含义上来,平均负载指的是每单位时间内,处于可运行状态和不可中断状态的进程数,所以,它不仅包括了正在使用CPU的进程数,还包括等待CPU和等待IO的进程数。

而CPU的使用率是单位时间内,CPU繁忙情况的统计,跟平均浮现在并不一定完全对应。 比如:

CPU密集型进程,使用大量的CPU会导致平均负载升高,此时这两者是一致的。 IO密集型进程,等待IO也会导致平均负载升高,但CPU使用率不一定很高。

大量等待CPU的进程调度也会导致平均负载升高,此时的CPU使用率也会比较高。

但是CPU的种类也分两种: CPU密集型 IO密集型

例如mysql服务器,就需要尽量选择使用IO密集型CPU

----

平均负载案例分析实战

下面我们以三个示例分别来看这三中情况,并用:stress、mpstat、pidstat等工具找出平均负载升高的根源

stress是Linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。

mpstat是多核CPU性能分析工具,用来实时检查每个CPU的性能指标,以及所有CPU的平均指标。

pidstat是一个常用的进程性能分析工具,用来实时查看进程的CPU,内存,IO,以及上下文切换等性能指标。

#安装stress命令
[root@zls ~]# yum install -y stress

案例一:CPU密集型

我们在第一个中断运行stress命令,模拟一个CPU使用率100%的场景:

#第一个终端执行
[root@zls ~]# stress --cpu 1 --timeout 600

#第二个终端查看
[root@zls ~]# uptime
 22:04:12 up 10:15,  4 users,  load average: 1.98, 0.57, 0.22
 
#高亮显示变化区域
[root@zls ~]# watch -d uptime
Every 2.0s: uptime                                                                                                                                                                                                                                      Sun Jul 14 22:05:16 2019

 22:05:16 up 10:16,  4 users,  load average: 2.84, 1.05, 0.41

使用mpstat查看CPU使用率的变化情况

[root@zls ~]# mpstat -P ALL 5
Linux 3.10.0-862.el7.x86_64 (zls)   2019年07月14日     _x86_64_    (1 CPU)

22时08分51秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
22时08分56秒  all   99.20    0.00    0.80    0.00    0.00    0.00    0.00    0.00    0.00    0.00
22时08分56秒    0   99.20    0.00    0.80    0.00    0.00    0.00    0.00    0.00    0.00    0.00

22时08分56秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
22时09分01秒  all   99.60    0.00    0.40    0.00    0.00    0.00    0.00    0.00    0.00    0.00
22时09分01秒    0   99.60    0.00    0.40    0.00    0.00    0.00    0.00    0.00    0.00    0.00

从终端2可以看到,1分钟平均负载会慢慢增加到2.00,而从终端三中还可以看到,正好有一个CPU的使用率为100%,但他的IOwait只有0,这说明平均负载的升高正式由于CPU使用率为100%,那么到底哪个进程导致CPU使用率为100%呢?可以使用pidstat来查询

#间隔5秒输出一组数据
[root@zls ~]# pidstat -u 5 1
Linux 3.10.0-862.el7.x86_64 (zls)   2019年07月14日     _x86_64_    (1 CPU)

22时14分00秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
22时14分05秒     0      8349    0.00    0.20    0.00    0.20     0  kworker/0:3
22时14分05秒     0      9903   99.60    0.00    0.00   99.60     0  stress

平均时间:   UID       PID    %usr %system  %guest    %CPU   CPU  Command
平均时间:     0      8349    0.00    0.20    0.00    0.20     -  kworker/0:3
平均时间:     0      9903   99.60    0.00    0.00   99.60     -  stress

案例二:I/O密集型

还是使用stress命令,但是这次模拟IO的压力

[root@zls ~]# stress --io 1 --timeout 600s

在第二个终端运行uptime查看平均负载的变化情况

[root@zls ~]# watch -d uptime
Every 2.0s: uptime                                                                                                                                                                                                                                      Sun Jul 14 22:17:38 2019

 22:17:38 up 10:28,  4 users,  load average: 2.47, 2.25, 1.61

在第三个终端运行mpstat查看CPU使用率的变化情况

[root@zls ~]# mpstat -P ALL 5
Linux 3.10.0-862.el7.x86_64 (zls)   2019年07月14日     _x86_64_    (1 CPU)

22时19分32秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
22时19分37秒  all    2.78    0.00   97.22    0.00    0.00    0.00    0.00    0.00    0.00    0.00
22时19分37秒    0    2.78    0.00   97.22    0.00    0.00    0.00    0.00    0.00    0.00    0.00

22时19分37秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
22时19分42秒  all    3.01    0.00   96.99    0.00    0.00    0.00    0.00    0.00    0.00    0.00
22时19分42秒    0    3.01    0.00   96.99    0.00    0.00    0.00    0.00    0.00    0.00    0.00

#发现CPU与内核打交道的sys占用非常高

那么到底哪个进程导致iowait这么高呢?

[root@zls ~]# pidstat -u 5 1
Linux 3.10.0-862.el7.x86_64 (zls)   2019年07月14日     _x86_64_    (1 CPU)

22时20分59秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
22时21分04秒     0      6900    0.00    0.20    0.00    0.20     0  kworker/0:0
22时21分04秒     0     10104    2.76   83.07    0.00   85.83     0  stress
22时21分04秒     0     10105    0.00   10.63    0.00   10.63     0  kworker/u256:2


平均时间:   UID       PID    %usr %system  %guest    %CPU   CPU  Command
平均时间:     0      6900    0.00    0.20    0.00    0.20     -  kworker/0:0
平均时间:     0     10104    2.76   83.07    0.00   85.83     -  stress
平均时间:     0     10105    0.00   10.63    0.00   10.63     -  kworker/u256:2

这时候发现看到的数据比较少,需要更新一下命令:

#下载新版本的包
[root@zls ~]# wget http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm

#升级到新版本
[root@zls ~]# rpm -Uvh sysstat-11.7.3-1.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:sysstat-11.7.3-1                 ################################# [ 50%]
正在清理/删除...
   2:sysstat-10.1.5-17.el7            ################################# [100%]

然后再次查看结果,明显显示的数据多了

[root@zls ~]# pidstat -u 5 1
Linux 3.10.0-862.el7.x86_64 (zls)   2019年07月14日     _x86_64_    (1 CPU)

22时24分40秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
22时24分45秒     0       281    0.00    0.20    0.00    0.40    0.20     0  xfsaild/sda3
22时24分45秒     0     10104    2.99   82.67    0.00    0.00   85.66     0  stress
22时24分45秒     0     10105    0.00    8.76    0.00   92.43    8.76     0  kworker/u256:2
22时24分45秒     0     10118    0.20    0.40    0.00    0.00    0.60     0  watch
22时24分45秒     0     10439    0.00    3.98    0.00   94.82    3.98     0  kworker/u256:3
22时24分45秒     0     11007    0.00    0.20    0.00    0.00    0.20     0  pidstat

平均时间:   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
平均时间:     0       281    0.00    0.20    0.00    0.40    0.20     -  xfsaild/sda3
平均时间:     0     10104    2.99   82.67    0.00    0.00   85.66     -  stress
平均时间:     0     10105    0.00    8.76    0.00   92.43    8.76     -  kworker/u256:2
平均时间:     0     10118    0.20    0.40    0.00    0.00    0.60     -  watch
平均时间:     0     10439    0.00    3.98    0.00   94.82    3.98     -  kworker/u256:3
平均时间:     0     11007    0.00    0.20    0.00    0.00    0.20     -  pidstat

案例三:大量进程的场景

当系统运行进程超出CPU运行能力时,就会出现等待CPU的进程。

1.首先,我们还是使用stress命令,模拟的是多个进程

[root@zls ~]# stress -c 4 --timeout 600

2.由于系统只有一个CPU,明显比4个进程要少的多。因此,系统的CPU处于严重过载状态

[root@zls ~]#
Every 2.0s: uptime                                                                                                                                                                                                                                      Sun Jul 14 22:28:50 2019

 22:28:50 up 10:39,  4 users,  load average: 3.96, 3.89, 3.00

3.在运行pidstat命令来查看一下进程的情况

[root@zls ~]# pidstat -u 5 1
Linux 3.10.0-862.el7.x86_64 (zls)   2019年07月14日     _x86_64_    (1 CPU)

22时31分12秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
22时31分17秒     0     11317   24.75    0.00    0.00   75.05   24.75     0  stress
22时31分17秒     0     11318   24.95    0.00    0.00   75.45   24.95     0  stress
22时31分17秒     0     11319   24.75    0.00    0.00   75.25   24.75     0  stress
22时31分17秒     0     11320   24.75    0.00    0.00   75.45   24.75     0  stress
22时31分17秒     0     11381    0.20    0.40    0.00    0.00    0.60     0  watch
22时31分17秒     0     11665    0.00    0.20    0.00    0.00    0.20     0  pidstat

平均时间:   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
平均时间:     0     11317   24.75    0.00    0.00   75.05   24.75     -  stress
平均时间:     0     11318   24.95    0.00    0.00   75.45   24.95     -  stress
平均时间:     0     11319   24.75    0.00    0.00   75.25   24.75     -  stress
平均时间:     0     11320   24.75    0.00    0.00   75.45   24.75     -  stress
平均时间:     0     11381    0.20    0.40    0.00    0.00    0.60     -  watch
平均时间:     0     11665    0.00    0.20    0.00    0.00    0.20     -  pidstat

总结:

1.平均负载高有可能是CPU密集型进程导致的 2.平均负载高并不一定代表CPU的使用率就一定高,还有可能是I/O繁忙 3.当发现负载高时,可以使用mpstat、pidstat等工具,快速定位到,负载高的原因,从而做出处理

加载全部内容

相关教程
猜你喜欢
用户评论
快盘暂不提供评论功能!