1.什么是进程

进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。一般来说,Linux系统会在进程之间共享程序代码和系统函数库,所以在任何时刻内存中都只有代码的一份拷贝
比如: 开发写的代码我们称为程序,那么将开发的代码运行起来。我们称为进程。
总结一句话就是: 当我们运行一个程序,那么我们将运行的程序叫进程。
PS1: 当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限。
PS2: 在进程运行的过程中,系统会有各种指标来表示当前运行的状态。

2.程序和进程的区别

1.程序是数据和指令的集合,是一个静态的概念。比如/bin/ls、/bin/cp等二进制文件。同时程序可以长期存在系统中。
2.进程是程序运行的过程,是一个动态的概念。进程是存在生命周期的概念的,也就是说进程会随着程序的终止而销毁,不会永久存在系统中。

3.进程生命周期

当父进程接收到任务调度时,会通过fork派生子进程来处理,那么子进程会继承父进程属性。
进程正常处理流程:
1.子进程在处理任务代码时,父进程会进入等待状态中…
2.子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源。
3.如果子进程在处理任务过程中异常退出,而父进程没有回收子进程的资源,会导致子进程虽然运行实体已经消失,但仍然在内核中的进程表中占据一条记录,长期下去对系统中资源是一个浪费.(僵尸进程)
4.如果子进程在处理任务过程中,父进程退出了,子进程没有退出,那么子进程就没有父进程来管理了,由系统的system进程管理(孤儿进程).
PS: 每个进程都父进程的PPID,子进程则叫PID。

4.linux 进程扩展的6个状态

1.僵尸态:子进程退出后,所有资源都消失了,只剩下 task_struct,父进程在 wait 函数中可以得到子进程的死亡原因。在 wait 之前子进程的状态就是僵尸态。
2.深度睡眠:等待资源到位后才醒过来
3.浅度睡眠:等待资源到位或收到信号后都会醒过来
4.暂停:stop 状态是被外部命令作业控制等强制进程进入的状态。
5.就绪:未占用 CPU,等待调度算法调度到运行态的进程
6.运行:占有 CPU,正在运行的线程。

5.监控和管理进程

在多任务处理操作系统中,每个CPU(或核心)在一个时间点上只能处理一个进程。
在进程运行时,它对 CPU 时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变。
程序在运行后,我们需要了解进程的运行状态。查看进程的状态分为: 静态和动态两种方式、

静态监控进程

1. 静态查看进程通常使用 ps aux 命令

-a:显示所有终端机下执行的进程 
a:显示现行终端机下的所有进程
-A:显示所有进程
-c:显示PID、CLS、PRI、TTY、TIME、CMD栏位
c:列出进程时,显示每个进程真正的指令名称
-f:显示UID、PID、PPID、C、STIME、TTY、TIME、CMD栏位
u:以用户为主的格式来显示进程状况
x:显示所有进程

查看进程 用户、PID、占用cpu百分比、占用内存百分比、状态、执行的命令等

状态 描述
USER 启动进程的用户
PID 进程运行的ID号
%CPU 进程占用CPU百分比
%MEM 进程占用内存百分比
VSZ 进程占用虚拟内存大小 (单位KB)
RSS 进程占用物理内存实际大小 (单位KB)
TTY 进程是由哪个终端运行启动的tty1、pts/0等 ?表示内核程序与终端无关
STAT 进程运行过程中的状态 man ps (/STATE)
START 进程的启动时间
TIME 进程占用 CPU 的总时间(为0表示还没超过秒)
COMMAND 程序的运行指令,[ 方括号 ] 属于内核态的进程。 没有 [ ]的是用户态进程

 

2.STAT状态的S、Ss、S+、R、R、S+等等,都是什么意思?

STAT基本状态 描述 STAT状态+符号 描述
R 进程运行 s 进程是控制进程, Ss进程的领导者,父进程
S 可中断进程(可以随时停止) < 进程运行在高优先级上,S<优先级较高的进程
T 进程被暂停(挂起) N 进程运行在低优先级上,SN优先级较低的进程
D 不可中断进程(IO) + 当前进程运行在前台,R+该表示进程在前台运行
Z 僵尸进程 l(小写L) 进程是多线程的,Sl表示进程是以线程方式运行

 

动态监控进程

top常见指令(这是使用top命令进入里头使用的)

h:查看帮出 
z:以彩色信息展示
1:显示所有CPU的负载
s:设置刷新时间
b:高亮现实处于R状态的进程
M:按内存使用百分比排序输出
P:按CPU使用百分比排序输出
R:对排序进行反转
f:自定义显示字段
k:kill掉指定PID进程
W:保存top环境设置 ~/.toprc
q:退出

top常见指令

-b:以批处理模式显示程序信息 
-S:以累积模式显示程序信息
-n 2:设置信息更新次数,表示更新2次后终止更新显示
-d -3:设置信息更新时间,表示更新周期为3秒
-p 12138:显示进程号为12138的进程信息,CPU、内存占用率等

top命令每行解释

[root@dmxsp ~]# top 
top - 14:07:51 up 23:56, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995684 total, 256856 free, 119032 used, 619796 buff/cache
KiB Swap: 2097148 total, 2096884 free, 264 used. 721072 avail Mem

第一行

top - 14:07:51 up 23:56, 1 user, load average: 0.00, 0.01, 0.05 
14:07:51:当前时间
up 23:56:系统运行时间,格式为时:分
1 user:当前登录用户数
load average: 0.00, 0.01, 0.05:系统负载,即任务队列的平均长度,三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值

第二行

Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie 
95 total:进程总数
1 running:正在运行的进程数
94 sleeping:睡眠的进程数
0 stopped:停止的进程数
0 zombie:僵尸进程数

第三行

%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 0.3 
us:用户空间占用CPU使用率
0.3 sy:内核空间占用CPU百分比
0.0 ni:用户进程空间内改变过优先级的进程占用CPU百分比
99.3 id:空闲CPU百分比
0.0 wa:等待输入输出的CPU时间百分比
0.0 hi:处理硬件中断的CPU时间
0.0 si:处理软件中断的CPU时间
0.0 st:这个虚拟机被hypervisor偷去的CPU时间(译注:如果当前处于一个hypervisor下的vm,
实际上hypervisor也是要消耗一部分CPU处理时间的)

第四行

KiB Mem : 995684 total, 256856 free, 119032 used, 619796 buff/cache 
995684total:物理内存总量
256856 free:空闲内存总量
119032 used:使用的物理内存总量
619796 buff/cache:用作内核缓存的内存量

第五行

KiB Swap: 2097148 total, 2096884 free, 264 used. 721072 avail Mem 
2097148 total:交换区总量
2096884 free:空闲交换区总量
264 used:使用的交换区总量
721072 avail Mem:缓冲的交换区总量

top进程信息区

PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 
PID:进程id
USER:进程所有者
PR:进程优先级
NI:nice值。负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES:进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR:共享内存大小,单位kb
S:进程状态。
D:不可中断的睡眠状态
R:运行
S:睡眠
T:跟踪/停止
Z:僵尸进程
%CPU:上次更新到现在的CPU时间占用百分比
%MEM:进程使用的物理内存百分比
TIME+:进程使用的CPU时间总计,单位1/100秒
COMMAND:进程名称(命令名/命令行)

6.关闭进程

kill、pkill、killall:使用kill、pkill、killall命令发送信号与进程通信定义守护进程的角色结束用户会话和进程
kill:通过pid和信号杀掉进程
pkill:通过进程名字,容易误杀
killall:通过进程名称(完整名称)

kill:列出所有信号名称

[root@dmxsp ~]# kill -l
1) SIGHUP           2) SIGINT           3) SIGQUIT           4) SIGILL               5) SIGTRAP
6) SIGABRT         7) SIGBUS           8) SIGFPE             9) SIGKILL            10) SIGUSR1
11) SIGSEGV       12) SIGUSR2      13) SIGPIPE           14) SIGALRM       15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD      18) SIGCONT        19) SIGSTOP        20) SIGTSTP
21) SIGTTIN        22) SIGTTOU        23) SIGURG         24) SIGXCPU       25) SIGXFSZ
26) SIGVTALRM  27) SIGPROF       28) SIGWINCH     29) SIGIO             30) SIGPWR
31) SIGSYS          34) SIGRTMIN    35) SIGRTMIN+1 36) SIGRTMIN+2   37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

kill常用的信号

1       SIGHUP:进程重新读取配置文件 很多程序实现reload功能
9       SIGKILL:强制结束进程 ,慎用
15     SIGTERM:停止,kill 默认使用的信号

kill命令使用

kill PID(进程的PID ps aux | grep vsftpd)
-u:指定用户

1.给 vsftpd 进程发送信号 1,15

[root@dmxsp ~]# yum -y install vsftpd
[root@dmxsp ~]# systemctl start vsftpd
[root@dmxsp ~]# ps aux | grep vsftpd

2.发送重启信号,例如 vsftpd 的配置文件发生改变,希望重新加载

[root@dmxsp ~]# kill -1 5618

3.发送停止信号,vsftpd 服务有停止的脚本 systemctl stop vsftpd

[root@dmxsp ~]# kill 5618

4.发送强制停止信号,当无法停止服务时,可强制终止信号

[root@dmxsp ~]# kill -9 5618

pkill命令使用

pkill nginx(进程的名字)是ps命令和kill命令的结合,用来杀死指定进程

-t:中止指定终端下的所有程序
-u:指定用户的程序
-v:与条件不符合的程序
-x:与条件·符合的程序
-f:显示完整程序
-p:列出父进程为用户指定进程的进程信息
[root@dmxsp ~]# pkill nginx

killall命令使用

killall发送一条信号给所有运行任意指定命令的进程. 如果没有指定信号名, 则发送 SIGTERM

[root@dmxsp ~]# killall nginx

7.后台进程管理

放入后台,进入后台

1.jobs显示后台运行的程序


-l:显示进程号
-p:仅任务对应的显示进程号
-r:仅输出运行状态(running)的任务
-s:仅输出停止状态(stoped)的任务

fg:将程序转入前台执行
bg:将程序放在后台执行

vim写文件

[root@dmxsp ~]# vim abc.txt

进入vim,按ctrl+z,进入后台挂起 (暂停),查看后台挂起的程序

[root@dmxsp ~]# ps aux | grep vim
[root@dmxsp ~]# jobs
[1]+ Stopped vim abc.txt

如何恢复

[root@dmxsp ~]# fg

2.screen

Linux screen命令用于多重视窗管理程序。
screen为多重视窗管理程序。此处所谓的视窗,是指一个全屏幕的文字模式画面。通常只有在使用telnet登入主机或是使用老式的终端机时,才有可能用到screen程序

screen

-A :将所有的视窗都调整为目前终端机的大小
-ls(–list):显示目前所有的screen作业
-s:指定建立新视窗时,所要执行的shell
-S:指定screen窗口的名称
-v:显示版本信息
-wipe:检查目前所有的screen窗口名称,并删除已经无法使用的screen窗口名称
-d [pid.tty.host]:断开screen进程(使用该命令时,screen的状态一定要是Attached,也就是说有用户连在screen里)。
一般进程的名字是以pid.tty.host这种形式表示(用screen -list命令可以看出状态)
-D [pid.tty.host]:与-d命令实现一样的功能,区别就是如果执行成功,会踢掉原来在screen里的用户并让他logout。
-r [pid.tty.host]:恢复离线的screen进程,如果有多个断开的进程,需要指定[pid.tty.host]
-m:即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-p number or name:预先选择一个窗口

Screen命令的常规用法

screen -d -r:连接一个screen进程,如果该进程是attached,就先踢掉远端用户再连接。
screen -D -r:连接一个screen进程,如果该进程是attached,就先踢掉远端用户并让他logout再连接
screen -ls或者-list:显示存在的screen进程,常用命令
screen -m:如果在一个Screen进程里,用快捷键crtl+a c或者直接打screen可以创建一个新窗口,screen -m可以新建一个screen进程。
screen -dm:新建一个screen,并默认是detached模式,也就是建好之后不会连上去。
screen -p number or name:预先选择一个窗口。

screen使用

1.安装

[root@dmxsp ~]# yum install screen -y

2.开启一个screen窗口,指定名称

[root@dmxsp ~]# screen -S wget_mysql

3.在screen窗口中执行任务即可

4.平滑的退出screen,但不会终止screen中的任务。注意: 如果使用exit才算真的关闭screen窗口ctrl+a +d

5.查看当前正在运行的screen有哪些

[root@dmxsp ~]# screen -list
There is a screen on:
               22058.wget_mysql (Detached)
               1 Socket in /var/run/screen/S-root.

6.进入正在运行的screen

[root@dmxsp ~]# screen -r wget_mysql
[root@dmxsp ~]# screen -r 22058

8.平均负载

每次发现系统变慢时,我通常做的第一件事,就是执行 top 或者 uptime 命令,来了解系统的负载情况。比如像下面这样,我在命令行里输入了 uptime 命令,系统也随即给出了结果

[root@dmxsp ~]# uptime 
15:01:42 up 1 day, 16:19, 1 user, load average: 0.00, 0.01, 0.05

已经比较熟悉前面几列,它们分别是当前时间、系统运行时间以及正在登录用户数
而最后三个数字呢,依次则是过去 1 分钟、5 分钟、15 分钟的平均负载

什么是平均负载

平均负载不就是单位时间内的 CPU 使用率吗?上面的 0.70,就代表 CPU 使用率是 70%。其实上并…..
那到底如何理解平均负载: 平均负载是指单位时间内,系统处于可运行状态和 不可中断状态的平均进程数,也就是平均活跃进程数,
 PS: 平均负载与 CPU 使用率并没有直接关系

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

1.可运行状态进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们ps 命令看到处于 R 状态的进程
2.不可中断进程,(你做什么事情的时候是不能打断的?) 系统中最常见的是等待硬件设备的 I/O 响应,也就是我们 ps 命令中看到的 D 状态(也称为 DiskSleep)的进程
例如: 当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程或者中断打断的,这个时候的进程就处于不可中断状态。如果此时的进程被打断了,就容易出现磁盘数据与进程数据不一致的问题。所以,不可中断状态实际上是系统对进程和硬件设备的一种保护机制

那平均负载为多少时合理

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

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

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

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

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

那么在实际生产环境中,平均负载多高时,需要我们重点关注呢?

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

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

在实际工作中,我们经常容易把平均负载和 CPU 使用率混淆,所以在这里,我也做一个区分。可能你会疑惑,既然平均负载代表的是活跃进程数,那平均负载高了,不就意味着 CPU 使用率高吗?
我们还是要回到平均负载的含义上来,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程

CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。比如:
CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的
I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高
大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高

 

作者 dmxsp

发表回复

您的电子邮箱地址不会被公开。