当前页面: 首页 > SEO优化 > SEO培训 >

Linux进程管理教程

2020-11-30 14:30:13

通过本教程我们将掌握一些Linux所提供的工具来进行进程的查看与控制,掌握这些工具让我们在某些进程出现异常的时候及时查看相关的指标,从而解决问题。

一、进程的查看

不管在测试的时候、在实际的生产环境中,还是自己的使用过程中,难免会遇到一些进程异常的情况,所以Linux为我们提供了一些工具来查看进程的状态信息。我们可以通过top实时的查看进程的状态,以及系统的一些信息(如CPU、内存信息等),我们还可以通过ps来静态查看当前的进程信息,同时我们还可以使用pstree来查看当前活跃进程的树形结构。

1.1 top工具的使用

top工具是我们常用的一个查看工具,能实时查看我们系统的一些关键信息的变化:

top

top是一个在前台执行的程序,所以执行后便进入到这样的一个交互界面,正是因为交互界面我们才可以实时的获取到系统与进程的信息。在交互界面中我们可以通过一些指令来操作和筛选。在此之前我们先来了解显示了哪些信息。

我们看到top显示的第一排:

内容 解释
top 表示当前程序的名称
13:52:52 表示当前系统的时间
up 186 days,9:38 表示该机器已经启动了多长时间
1 user 表示当前系统只有一个用户
load average:0.07,0.16,0.16 分别对应1、5、15分钟内cpu的平均负载

load average 在 wikipedia 中的解释是 the system load is a measure of th amount of work that a computer system is doing 也就是对当前的CPU工具量的度量,具体来说也就是指运行队列的平均长度,也就是等待CPU平均进程数相关的一个计算值。

我们该如何看待load average 数据呢?

假如我们的系统是单CPU、单内核的,把它比如成一条单向的桥,把CPU任务比作汽车。

  • load = 0的时候以为着这个桥上没有车,cpu没有任何任务。

  • load < 1的时候意味着桥上的车并不多,一切都还是很流畅,cpu的任务并不多,资源还很充足;

  • load = 1的时候就意味着桥已经被车占满了,没有一点空隙,cpu已经在全力工作了,所有资源都被用完了,当然还好,这还在能力范围内,只是有点慢而已;

  • load>1的时候就以为着不仅仅是桥上已经被车占满了,就连桥外都被占满了,cpu已经在全力工作,系统资源用完了,但是还有大量的进程在请求,在等待。如果这个值大于2、大于3,表示进程请求超过CPU工作能力的2-3倍。如果这个值>5说明系统已经在超负荷运作了。

这是单个CPU单核的情况,而实际生活中我们需要将得到的这个值除以我们的核数来看。我们可以通过以下命令来查看cpu的个数和核心数

#查看物理CPU的个数
# cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l

#每个cpu的核心数
cat /proc/cpuinfo |grep "physical id"|grep "0"|wc -l

通过上面的指数我们可以得知load的临界值为1,但是在实际生活中,比较有经验的运维或者系统管理员会将临街值定为0.7.这里的指数都是除以核心数以后的值,不要混淆了

  • 如果是load<0.7并不会去关注他;

  • 如果是0.7<load<1的时候我们就需要稍微关注一下了,虽然可以应付但是这个值已经离临界不远了;

  • 如果是load=1的时候我们就需要警惕了,因为这个时候已经没有更多的资源的了,已经在全力以赴了;

  • 如果是load>5的时候系统已经快不行了,这个时候你需要加班解决问题了...

通常我们都会先看15分钟的值来看这个大体的趋势,然后再看5分钟的值对比来看是否有下降的趋势。

查看busybox的代码可以知道,数据每5秒钟就检查一次活跃的进程数,然后计算出该值,然后load从 /proc/loadavg 中读取的,而这个load值是如何计算的呢,这是load的计算的源码

#define FSHIFT      11          /* nr of bits of precision */
#define FIXED_1     (1<<FSHIFT) /* 1.0 as fixed-point(定点) */
#define LOAD_FREQ   (5*HZ)      /* 5 sec intervals,每隔5秒计算一次平均负载值 */
#define CALC_LOAD(load, exp, n)     
         load *= exp;               
         load += n*(FIXED_1 - exp); 
         load >>= FSHIFT;

unsigned long avenrun[3];

EXPORT_SYMBOL(avenrun);

/*
* calc_load - given tick count, update the avenrun load estimates.
* This is called while holding a write_lock on xtime_lock.
*/
static inline void calc_load(unsigned long ticks)
{
        unsigned long active_tasks; /* fixed-point */
        static int count = LOAD_FREQ;
        count -= ticks;
        if (count < 0) {
                count += LOAD_FREQ;
                active_tasks = count_active_tasks();
                CALC_LOAD(avenrun[0], EXP_1, active_tasks);
                CALC_LOAD(avenrun[1], EXP_5, active_tasks);
                CALC_LOAD(avenrun[2], EXP_15, active_tasks);
        }
}

有兴趣的朋友可以研究一下,是如何计算的,代码的后面这部分相当于它的计算公式

我们回归正题,来看top的第二行数据,基本上第二行是进程的一个情况统计

内容 解释
Tasks: 27 total 进程总数
1 running 1个正在运行的进程数
26 sleeping 26个睡眠的进程数
0 stopped 没有停止的进程数
0 zombie 没有僵尸进程数

来看下top的第三行数据,这一行基本上是CPU的一个使用情况的统计了

内容 解释
Cpu(s):2.7% us 用户空间进程占用CPU百分比
1.1% sy 内核空间运行占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
95.3% id 空闲CPU百分比
0.6% 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的第四行数据,这一行基本上是内存的一个使用情况的统计了:

内容 解释
16425212 total 物理内存总量
2716992 used 使用的物理内存总量
5168948 free 空闲内存总量
8539272 buff/cache 用作内核缓存的内存量

注意:系统中可用的物理内存最大值并不是free这个单一的值,而是free+buffers+swap 中的 cached的和

来看top的第五行数据,这一行基本上就是交换区的一个使用情况的统计了

内容 解释
total 交换区总量
used 使用的交换区总量
free 空闲交换区总量
cached 缓冲的交换区总量,内存中的内容被换到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖

再下面就是进程的一个情况了

列名 解释
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 退出程序
I 切换显示平均负载和启动时间的信息
p 根据CPU使用百分比大小进行排序
M 根据驻留内存大小进行排序
i 忽略闲置和僵死的进程,这是一个开关式命令
k 终止一个进程,系统提示输入PID及发送的信号值。一般终止进程用15信号,不能正常结束则使用9信号。安全模式下该命令被屏蔽。

好好的利用top能够很有效的帮助我们观察到系统的瓶颈所在,或者是系统的问题所在。

1.2ps工具的使用

ps也是我们最常用的查看进程的工具之一,我们通过这样的一个命令来了解一下,他能给我带来哪些信息:

ps aux

ps axjf

我们来总体了解下会出现哪些信息给我们,这些信息又代表着什么(更多的keywords大家可以通过man ps了解)

TPGID栏写着-1的都是没有控制终端的进程,也是守护进程

STAT表示进程的状态,而进程的状态有很多,如下表所示

其中的D是不能被中断睡眠的状态,处在这种状态的进程不接受外来的任何signal,所以无法使用kill命令杀掉处于D状态的进程,无论是kill,kill -9还是kill -15,一般处于这种状态可能是金宠I/O的时候出问题了。

ps工具有许多的参数,下面给大家解释部分常用的参数

使用-l参数可以显示自己这次登录的bash相关的进程信息罗列出来

ps -l

相对来说我们更加常用下面这个命令,他会罗列出所有的进程信息

如果是查找其中的某个进程的话,我们还可以配合着grep和正则表达式一起使用

ps aux | grep zsh

此处我们还可以查看时,将连同部分的进程呈树状显示出来

ps axjf

当然如果你觉得使用这样的没有把你想要的信息放在一起,我们也可以是用这样的命令,来自定义我们所需要的参数显示

ps -afxo user,ppid,pid,pgid,command

这是一个简单而实用的工具,想要更灵活的使用,想要知道更多的参数我们可以使用man来获取更多相关的信息。

1.3 pstree工具的使用

通过pstree可以很直接的看到相同的进程数量,最重要的还是我们可以看到所有进程之间的相关性

pstree

pstree -up

#参数选择
#-A :各程序树之间以ASCII字元来连接;
#-p :同时列出每个process的PID;
#-u :同时列出每个process的所属账户名称。

二、进程的管理

接下来将为大家介绍如何去管理进程的。

2.1 kill命令的掌握

我们知道,当一个进程结束的时候或者要异常结束的时候,会向其父进程返回一个或者接受一个SIGHUP信号而做出的结束进程或者其他的操作,这个SIGHUP信号不仅可以由系统发送,我们可以使用kill来发送这个信号来操作进程的结束或者重启等等。

接下来,我们将尝试用kill来操作下一些不属于job范畴的进程,直接对pid下手

#首先我们使用图形界面打开 gedit、gvim ,用ps可以查看到
ps aux

#使用9这个信号强制结束gedit进程
kill -9 1608

#我们再查找这个进程的时候就找不到了
ps aux | grep gedit

2.2 进程的执行顺序

我们在使用ps命令的时候可以看到大部分的进程都处于休眠的状态,如果这些进程都被唤醒,那么谁先享受CPU的服务呢?后面的进程又该是一个什么样的顺序呢?进程调度的队列又该如何去排列呢?

当然就是靠该进程的优先级值来判定进程调度的优先级,而优先级的值就是上文所提到的PR与nice来控制与体现了。

而nice的值我们是可以通过nice命令来修改的,而需要注意的是nice值可以调整范围是-20 ~ 19,其中root有着至高无上的权利,既可以调整自己的进程也可以调整其他用户的程序,并且所有的值都可以用,而普通用户只可以调属于自己的进程,并且其使用的范围只能是0 ~ 19,因为系统为了避免一般用户抢占系统资源而设置的一个限制。

三、总结

通过本教程我们学会了进程的查看命令ps,pstree,top,以及使用这些命令时所得到的信息含义,从而获取我们需要的信息,同时我们学会了进程的管理命令kill,nice,renice

linux教程

用户评价:Linux进程管理教程



seo