19、进程
1.进程基本概述
当我们运行一个程序,那么我们将运行的程序叫进程。
PS1: 当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限。
PS2: 在进程运行的过程中,服务器上会有各种状态来表示当前进程的指标信息。
2.程序和进程的区别
1.程序是数据和指令的集合,是一个静态的概念。比如/bin/ls、/bin/cp等二进制文件。同时程序可以长期存在系统中。
2.进程是程序运行的过程,是一个动态的概念。进程是存在生命周期的概念的,也就是说进程会随着程序的终止而销毁,不会永久存在系统中。
3.进程的生命周期
生命周期就是指一个对象的生老病死。用处很广。
4.监控进程状态
4.1.使用ps命令查看当前的进程状态(静态)
状态 | 描述 |
---|---|
USER | 启动进程的用户 |
PID | 进程运行的ID号 |
%CP | 进程占用CPU百分比 |
%MEM | 进程占用内存百分比 |
VSZ | 进程占用虚拟内存大小 (单位KB) |
RSS | 进程占用物理内存实际大小 (单位KB) |
TTY | 进程是由哪个终端运行启动的tty1、pts/0等 |
? | 表示内核程序与终端无关 |
STAT | 进程运行过程中的状态 man ps (/STATE) |
START | 进程的启动时间 |
TIME | 进程占用 CPU的总时间(为0表示还没超过秒) |
COMMAND | 程序的运行指令,[ 方括号 ]属于内核态的进程。 没有 [ ] 的是用户态进程。 |
4.2.STAT基本状态
STAT基本状态 | 描述 | STAT状态+符号 | 描述 |
---|---|---|---|
R | 进程运行 | s | 进程是控制进程, Ss进程的领导者,父进程 |
S | 可中断睡眠 | < | 进程运行在高优先级上,S<优先级较高的进程 |
T | 进程被暂停 | N | 进程运行在低优先级上,SN优先级较低的进程 |
D | 不可中断进程 | + | 当前进程运行在前台,R+该表示进程在前台运行 |
Z | 僵尸进程 | l | 进程是多线程的,Sl表示进程是以线程方式运行 |
4.3.案例一、PS命令查看进程状态切换
#1.在终端1上运行vim
[root@xuliangwei ~]# vim oldboy
#2.在终端2上运行ps命令查看状态
[root@xuliangwei ~]# ps aux|grep oldboy #S表示睡眠模式,+表示前台运行
root 58118 0.4 0.2 151788 5320 pts/1 S+ 22:11 0:00 oldboy
root 58120 0.0 0.0 112720 996 pts/0 R+ 22:12 0:00 grep --color=auto oldboy
#在终端1上挂起vim命令,按下:ctrl+z
#3.回到终端2再次运行ps命令查看状态
[root@xuliangwei ~]# ps aux|grep oldboy #T表示停止状态
root 58118 0.1 0.2 151788 5320 pts/1 T 22:11 0:00 vim oldboy
root 58125 0.0 0.0 112720 996 pts/0 R+ 22:12 0:00 grep --color=auto oldboy
4.4.案例二、PS命令查看不可中断状态进程
#1.使用tar打包文件时,可以通过终端不断查看状态,由S+,R+变为D+
[root@xuliangwei ~]# tar -czf etc.tar.gz /etc/ /usr/ /var/
[root@xuliangwei ~]# ps aux|grep tar|grep -v grep
root 58467 5.5 0.2 127924 5456 pts/1 R+ 22:22 0:04 tar -czf etc.tar.gz /etc/
[root@xuliangwei ~]# ps aux|grep tar|grep -v grep
root 58467 5.5 0.2 127088 4708 pts/1 S+ 22:22 0:03 tar -czf etc.tar.gz /etc/
[root@xuliangwei ~]# ps aux|grep tar|grep -v grep
root 58467 5.6 0.2 127232 4708 pts/1 D+ 22:22 0:03 tar -czf etc.tar.gz /etc/
4.5.查看负载
[root@oldboy ~]# w
19:05:48 up 1 day, 11 min, 3 users, load average: 0.00, 0.01, 0.05
[root@oldboy ~]# uptime
19:06:16 up 1 day, 12 min, 3 users, load average: 0.00, 0.01, 0.05
[root@oldboy ~]# top
19:01:10 up 1 day, 7 min, 3 users, load average: 0.00, 0.01, 0.07
Tasks: 189 total, 1 running, 187 sleeping, 1 stopped, 0 zombie
4.6.top查看出的名词含义
任务
含义
Tasks: 129 total
当然进程的总数
1 running
正在运行的进程数
128 sleeping
睡眠的进程数
0 stopped
停止的进程数
0 zombie
僵尸进程数
%Cpu(s): 0.7 us
系统用户进程使用CPU百分比
0.7 sy
内核中的进程占用CPU百分比,通常内核是于硬件进行交互
0.0 ni
改变过优先级的进程占用CPU的百分比
98.7 id
空闲CPU的百分比
0.0 wa
IO等待占用CPU的百分比
0.0 hi
硬中断,占的CPU百分比(扩展)
0.0 si
软中断,占的CPU百分比(扩展)
0.0 st
比如虚拟机占用物理主机CPU的时间
任务 | 含义 |
---|---|
Tasks: 129 total | 当然进程的总数 |
1 running | 正在运行的进程数 |
128 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
%Cpu(s): 0.7 us | 系统用户进程使用CPU百分比 |
0.7 sy | 内核中的进程占用CPU百分比,通常内核是于硬件进行交互 |
0.0 ni | 改变过优先级的进程占用CPU的百分比 |
98.7 id | 空闲CPU的百分比 |
0.0 wa | IO等待占用CPU的百分比 |
0.0 hi | 硬中断,占的CPU百分比(扩展) |
0.0 si | 软中断,占的CPU百分比(扩展) |
0.0 st | 比如虚拟机占用物理主机CPU的时间 |
所以,这两个阶段你也可以这样理解:
上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行;
而下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行。
f: 经常听同事说大量的网络小包会导致性能问题,为什么呢?
q:因为大量的网络小包会导致频繁的硬中断和软中断?
所以大量网络小包传输很慢,但如果将网络包一次传递,是不是会快很多呢?
https://www.cnblogs.com/xuliangwei/p/10789270.html
4.7.top命令使用下面参数则会显示不同效果
字母 | 含义 |
---|---|
h | 查看帮出 |
1 | 数字1,显示所有CPU核心的负载 |
z | 以高亮显示数据 |
b | 高亮显示处于R状态的进程 |
M | 按内存使用百分比排序输出 |
P | 按CPU使用百分比排序输出 |
q | 退出top |
4.8.top中第六行的释义
PID | USER | PR | NI | VIRT | RES | SHR | S | %CPU | %MEM | TIME+ | COMMAND |
---|---|---|---|---|---|---|---|---|---|---|---|
进程id | 进程所有者 | 优先级 | nice值。负值表示高优先级,正值表示低优先级 | 进程使用的虚拟内存总量 | 进程使用的、未被换出的物理内存大小 | 共享内存大小 | 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程) | 上次更新到现在的CPU时间占用百分比 | 进程使用的物理内存百分比 | 进程使用的CPU时间总计,单位1/100秒 | 命令名/命令行 |
https://www.cnblogs.com/zhoug2020/p/6336453.html
5.管理进程状态
管理进程: Kill pkill killall
数字编号 | 信号含义 | 信号翻译 |
---|---|---|
1 | SIGHUP | 通常用来重新加载配置文件 |
9 | SIGKILL | 强制杀死进程 |
15 | SIGTERM | 终止进程,默认kill使用该信号 |
当进程没有停止的信号,可以使用系统的kill给进程发送信号
默认kill掉进程的父进程,这样才能彻底的杀掉该进程. 否则如果只是kill子进程,没有用
[root@oldboy ~]# kill 18788
重载配置,PID号不会发生变化. 只要PID发生变化说明进程被停止过
[root@oldboy ~]# kill -1 20154
强制杀死某个进程.慎用
[root@oldboy ~]# kill -9 20154
批量杀死进程
[root@oldboy ~]# ps aux|grep nginx |grep -v grep|awk '{print $2}'|sed -r 's#(.*)#kill \1#g'|bash
[root@oldboy ~]# killall nginx 跟进程的名称(批量)
[root@oldboy ~]# pkill nginx 跟上进程名称(批量)
[root@oldboy ~]# pkill -9 -t pts/0 杀掉连接的终端
6.管理后台进程
==后台进程:screen==
1.再开启一个子bash窗口,关闭父bash并不影响子bash
1.安装
[root@oldboy ~]# yum install screen -y
2.开启一个screen窗口,指定名称
[root@oldboy ~]# screen -S wget_mysql
3.在screen窗口中执行任务即可
4.平滑的退出screen,但不会终止screen中的任务 注意: 如果使用exit 才算真的关闭screen窗口
ctrl+a+d
5.查看当前正在运行的screen有哪些
[root@oldboy ~]# screen -list
There is a screen on:
22058.wget_mysql (Detached)
1 Socket in /var/run/screen/S-root.
6.进入正在运行的screen
[root@oldboy ~]# screen -r wget_mysql
[root@oldboy ~]# screen -r 22058
7.进程的优先级[进阶]
7.1.进程优先级: nice renice
nice 值越高:表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。
nice 值越低:表示优先级越高,例如-20,该进程更不倾向于让出CPU。
NI: 实际nice级别,默认是0。PR:显示nice值,-20映射到0,19映射到39
7.2.nice指定程序的优先级。
语法格式 nice -n 优先级数字 进程名称
#1.开启vim并且指定程序优先级为-5
[root@m01 ~]# nice -n -5 vim &
[1] 98417
#2.查看该进程的优先级情况
[root@m01 ~]# ps axo pid,command,nice |grep 98417
98417 vim -5
7.3.renice命令修改一个正在运行的进程优先级。
语法格式 renice -n 优先级数字 进程pid
1.查看sshd进程当前的优先级状态
[root@m01 ~]# ps axo pid,command,nice |grep [s]shd
70840 sshd: root@pts/2 0
98002 /usr/sbin/sshd -D 0
2.调整sshd主进程的优先级
[root@m01 ~]# renice -n -20 98002
98002 (process ID) old priority 0, new priority -20
3.调整之后记得退出终端
[root@m01 ~]# ps axo pid,command,nice |grep [s]shd
70840 sshd: root@pts/2 0
98002 /usr/sbin/sshd -D -20
[root@m01 ~]# exit
4.当再次登陆sshd服务,会由主进程fork子进程(那么子进程会继承主进程的优先级)
[root@m01 ~]# ps axo pid,command,nice |grep [s]shd
98002 /usr/sbin/sshd -D -20
98122 sshd: root@pts/0 -20
案例: Linux假死
8.系统平均负载[进阶]
平均负载: mpstat pidstat
如何理解平均负载:平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,
PS: 平均负载与 CPU 使用率并没有直接关系。
划重点,因此你可以简单理解为,平均负载其实就是单位时间内的活跃进程数。
那么在实际生产环境中,平均负载多高时, 65%-70%
场景一:CPU 密集型进程
[root@oldboy ~]# stress --cpu 4 --timeout 600
[root@oldboy ~]# watch -d uptime
[root@oldboy ~]# mpstat -P ALL 5
[root@oldboy ~]# pidstat -u 5 1
场景二:I/O 密集型进程
[root@m01 ~]# stress --io 1 --timeout 600s
场景三:大量进程的场景
[root@m01 ~]# stress -c 4 --timeout 600
平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。
但只看平均负载本身,我们并不能直接发现,到底是哪里出现了瓶颈。
所以,在理解平均负载时,也要注意:
平均负载高有可能是 CPU 密集型进程导致的;
平均负载高并不一定代表 CPU使用率高,还有可能是 I/O 繁忙了;
当发现负载高的时候,你可以使用 mpstat、pidstat 等工具,辅助分析负载的来源
如果出现无法使用mpstat、pidstat命令查看%wait指标建议更新下软件包
wget http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm
rpm -Uvh sysstat-11.7.3-1.x86_64.rpm