0
点赞
收藏
分享

微信扫一扫

进程管理

进程概述

什么是进程

一个正在运行的程序

程序与进程的区别:

进程是动态概念,具有生命周期,无法长期存放在系统中。
程序是静态概念,代码的集合,可以长期存放在系统中

进程的生命周期

接收任务-fork子进程-子进程处理任务-父进程等待
正常结束任务
非正常结束任务

  • 产生僵尸进程
  • 产生孤儿进程

什么是僵尸进程

子进程先结束,父进程没有及时回收子进程的占用资源

什么是孤儿进程

父进程先结束,子进程没有父进程的管理

进程的生命周期

![1651279952845](C:\Users\59418\AppData\Roaming\Typora\typora-user-images\1651279952845.png)

1.用户发起请求
2.父进程会fork出子进程,子进程会继承父进程大部分的属性,如:文件描述符等,处理任务
3.子进程在处理任务的过程中,父进程是一个wait状态,等待子进程
4.正常结束
5.非正常结束
-僵尸进程
-孤儿进程

僵尸进程及产生的原因:

僵尸进程:
子进程比父进程先结束
父进程没有回收子进程的资源
此时的子进程就称为“僵尸进程”

产生原因

子进程的结束和父进程的运行是异步的
父进程永远不知道子进程什么时候结束
子进程在结束时,父进程繁忙来不及wait子进程,
则会导致子进程变成僵尸进程

孤儿进程及产生的原因:

孤儿进程:
父进程比子进程先结束
子进程还在执行任务,没有父进程管理
此时的子进程就称为“孤儿进程”

产生原因

子进程的结束和父进程的运行是异步的
父进程永远不知道子进程什么时候结束
当父进程正常完成工作或其他原因被终止
则会导致子进程变成孤儿进程

监控进程的状态

进程状态管理命令-ps

ps [选项][参数]
##常用选项组合
[root@localhost <sub>]# ps -ef
[root@localhost </sub>]# ps aux
a:查看所有与终端相关的进程,由终端发起的进程
u:显示进程的管理用户信息
x:查看所有与终端无关的进程

[root@localhost <sub>]# ps aux|grep nginx
[root@localhost </sub>]# ps aux|grep [n]ginx
[root@localhost <sub>]# ps aux|grep nginx|grep -vgrep
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 127908 6568 ? Ss Apr29 0:01 /usr/lib/systemd/systemd --switched-r
root 2 0.0 0.0 0 0 ? S Apr29 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Apr29 0:00 [kworker/0:0H]

USER :该进程的管理用户
PID:进程号
%CPU:该进程占用CPU的百分比
%MEM:该进程占用内存的百分比
VSZ:该进程占用虚拟内存的大小
RSS:该进程占用物理内存的大小
TTY:
?:由内核发起的进程
tty:机器上的终端进程
pts/N:远程连接工具的终端进程
STAT:进程运行的状态
D:不可中断的休眠状态(通IO的进程)***<strong>
R:正在运行的状态 </strong>*<strong>
S:处于休眠状态的进程 (在等待其他子进程返回结果) </strong>*<strong>
T:暂停或者被追踪的状态(Ctrl + z ,kill -19 ,kill -20
jobs:查看哪些进程是暂停状态的
bg:把暂停状态的进程,在后台运行起来
fg:把暂停状态的进程,调到前台运行
W:进入交换内存的进程(swap,centos7见不到)
X:死掉的进程(少见)
Z:僵尸进程 </strong><strong>
<:优先级高的进程
N:优先级低的进程
L:有些数据页被锁进内存的进程
s:父进程,在它下面有子进程
l:以线程的方式运行
|:存在多进程的进程
+:在前台运行 </strong>***

START:进程开启的时间
TIME:该进程占用CPU的时间
COMMAND:进程名字或者进程的命令
[]:内核态进程
没[]:用户态进程

#如果后台有被暂停的进程
##查看所有被暂停的进程
[root@localhost </sub>]# jobs
[1]- Stopped vim1.txt
[2]+ Stopped ping baidu.com

bg:让暂停的进程运行起来,后面加数字,就可以运行第几个被暂停的进程(默认是最后一个)
fg; 是把后台暂停的进程,调到前台运行,后面加数字,可以将第N个进程调到前台运行(默认是最后一个)

## ps命令的用法
# 1.根据%cpu进行排序
[root@localhost <sub>]# ps aux|sort -k3
[root@localhost </sub>]# ps aux --sort %cpu
[root@localhost <sub>]# ps aux --sort %mem

# 2.自定义显示字段
o:自定义显示字段
[root@localhost </sub>]# ps axo pid,%cpu,command,%mem
PID %CPU COMMAND %MEM
# 3.显示子进程
f: 查看子进程和父进程的关系
[root@localhost <sub>]# ps auxf|grep nginx

# 4.查看指定进程的pid
[root@localhost </sub>]# ps aux|grep [n]ginx

[root@localhost <sub>]# pgrep nginx

pgrep选项:
-l:显示该进程的启动命令
-a:显示该进程的完整描述信息
[root@localhost </sub>]# pidof nginx

pgrep:查看pid
pidof:查看pid
pstree:查看父进程子进程

进程管理命令-top

[root@localhost ~]# top
## 第一行:系统相关
top - 00:03:01 up 8:35, 1 user, load average: 0.00, 0.01, 0.05

top:命令
00:03:01:当前系统时间
up 8:35,:该服务器,运行的时间
1 user,:当前登录的用户数量
load average: 0.00, 0.01, 0.05:系统的平均负载(服务器的压力)
0.00,:1分钟之前的负载
0.01, 5分钟之前的负载
0.05: 15分钟之前的负载

## 第二行:进程状态
Tasks: 103 total, 1 running, 102 sleeping, 0 stopped, 0 zombie

103 total,:当前系统中所有的进程数量
1 running,:处于R状态,正在运行状态的进程数
102 sleeping,:处于S状态,sleep状态的进程数
0 stopped,:处于T状态,后台挂起暂停状态的进程数
0 zombie:处于Z状态,僵尸进程的进程数量

## 第三行:CPU百分比
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
us:用户进程占用cpu的百分比(用户态)
sy:系统进程占用cpu的百分比(内核态)
id:cpu的空闲程度
ni:优先级较高的进程占用cpu的百分比
wa:等待状态的进程占用cpu的百分比 大S的状态
hi:硬中断占用cpu的百分比
si:软中断占用cpu的百分比
st:虚拟化技术占用cpu的百分比

## 第四行:物理内存
KiB Mem : 2027892 total, 1694448 free, 220768 used, 112676 buff/cache

2027892 total, :总内存数
1694448 free, :空闲内存数
220768 used, :已使用的内存数
112676 buff/cache:buffer缓冲区/缓存区

## 第五行:Swap虚拟内存
KiB Swap: 2097148 total, 2097148 free, 0 used. 1670512 avail Mem

2097148 total, :总虚拟内存数
2097148 free, :空闲的虚拟内存数
0 used. :已使用的虚拟内存数
1670512 avail Mem :可用的虚拟内存数

##第六行
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID:进程ID号
USER:该进程的用户
PR NI:进程优先级
VIRT :虚拟内存占用空间
RES :物理内存占用空间
SHR :共享内存占用空间
S :进程的状态
%CPU :占用CPU的百分比
%MEM :内存占用的百分比
TIME+:运行时间
COMMAND:进程的运行命令

什么是中断

中断是系统用来影响硬件设备请求的一种机制,它可能会打断其它进程的正常调度和执行的操作,然后调用内核中的中断处理程序来影响设备的请求。

对硬件设备发起数据请求,可能会打断其他请求的操作,
缺陷:会影响其他中断发起请求,导致数据丢失中断,在Linux系统中被分为两个阶段执行
上半部分:硬中断
下半部分:软中断
硬中断:1阶段:用来快速处理中断请求,将中断请求放入缓存中,它在中断禁止模式下运行,主要处理跟硬件紧密相关工作
软中断 2阶段:用来延迟处理第一阶段未完成的中断工作,将缓存中没有处理完的中断请求继续处理,通常以内核线程的方式运行

top命令用法

top
-d:指定更新的时间(默认是3s更新一次)
-p:只查看指定pid的进程
-u:指定相关用户
-b:将top内容保存到文件中
-n:指定次数 和-b搭配使用

保存top内容两次结果到文件中
top -b -n 2 > /tmp/2.txt
指定1秒更新一次,保存top内容两次结果到文件中
top -d 1 -b -n 2 > /tmp/3.txt

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

PID:进程ID号
USER:该进程的用户
PR NI:一对组合 表示进程优先级
VIRT :虚拟内存占用空间
RES :物理内存占用空间
SHR :共享内存占用空间
S :进程的状态
%CPU :占用CPU的百分比
%MEM :内存占用的百分比
TIME+:运行时间
COMMAND:进程的运行命令

进程的信号管理

[root@localhost <sub>]# 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

//常见信号列表:
数字信号 信号别名 作用
1 HUP 挂起信号,往往可以让进程重新配置(重新加载配置文件)
2 INT 中断信号,起到结束进程的作用,和ctrl + c 的作用一样
3 QUIT 让进程退出,结果是进程退出
9 KILL 直接结束进程,不能被进程捕获
15 TERM 进程终止,这是默认信号
18 CONT 被暂停的进程将继续恢复运行(放在后台运行,bg)
19 STOP 暂停进程
20 TSTP 用户停止请求,作用类似于ctrl + z 把进程放到后台并暂停

# kill:只能加PID进程信号
kill -9 +PID

# pkill:杀掉所有进程,不用指定pid 可以杀终端
pkill nginx
pkill -9 nginx
pkill -9 +PID

[root@web01 </sub>]# pkill -t pts/0
[root@web01 <sub>]# w
[root@web01 </sub>]# pkill -9 -t pts/0

# killall:杀掉所有进程,不用指定pid
要加上名字使用: killall nginx

进程的优先级

什么是优先级

优先级高的进程,可以优先享用系统的资源

优先级的定义和配置

在启动进程时,为不同的进程使用不同的调度策略。
nice值越高:表示优先级越低,例如19,该进程容易将CPU使用量让给其他进程。
nice值越低:表示优先级越高,例如-20,该进程更不倾向于让出CPU。

## 指定优先级执行命令
nice -n 优先级 命令

nice -n 19 vim 1.txt

## 重置,修改已经在运行的程序的优先级
renice -n 优先级 PID

# 查看sshd服务的优先级
[root@localhost <sub>]# ps axo pid,user,nice,command|grep ssh
918 root 0 /usr/sbin/sshd -D
1167 root 0 sshd: root@pts/0
2444 root 0 grep --color=auto ssh

# 重新设置sshd服务的优先级为-20,对于服务只能指定它的pid
[root@localhost </sub>]# renice -n -20 918
918 (process ID) old priority 0, new priority -20

# 再次查看
[root@localhost ~]# ps axo pid,user,nice,command|grep ssh
918 root -20 /usr/sbin/sshd -D
1167 root 0 sshd: root@pts/0
2447 root 0 grep --color=auto ssh

系统出现假死怎么办

使用nice将sshd的进程优先级提到最高,这样当系统内存吃紧,还能勉强登录sshd,进入调试,然后分析故障。
oom killer:当系统内存被占满,再打开一个东西,系统会触发oom killer机制,自动杀优先级比较低的进程

后台进程管理

&
Ctrl + z
jobs bg fg
screen
nohup

# 在执行的命令后面加 & 会直接将该命令放在后台执行
&
[root@localhost <sub>]# ping baidu.com &

结果会输出在终端 停止运行用kill+pid号
可以重定向 ping baidu.com >> /tmp/2.log &

# 先把进程放在后台暂停配合 bg将暂停的进程,在后台恢复运行
Ctrl + z
jobs bg fg

也可以重定向 ping baidu.com >> /tmp/2.log

[root@localhost </sub>]# ping baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=128 time=32.5 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=128 time=35.3 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=128 time=32.2 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=4 ttl=128 time=38.7 ms
^Z
[1]+ Stopped ping baidu.com
[root@localhost <sub>]# jobs
[1]+ Stopped ping baidu.com
[root@localhost </sub>]# bg 1
[1]+ ping baidu.com &

# 将执行的命令放入后台执行,并且将输出结果保存到 nohup.out文件中
nohup
[root@localhost <sub>]# nohup ping baidu.com &
[2] 2542
[root@localhost </sub>]# nohup: ignoring input and appending output to ‘nohup.out’

[root@localhost <sub>]# ll
total 1052
-rw-------. 1 root root 4365 May 7 02:14 nohup.out
[root@localhost </sub>]# tail -f nohup.out
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=64 ttl=128 time=37.5 ms

[root@localhost ~]# kill 2542

#将进程放入后台(开启一个子shell)
screen 屏幕
安装:yum install -y screen
-ls:查看所有screen放在后台的进程
-r:指定后台进程号,进入该后台进程对应的子shell
screen+pid或者名字 进入对应的子shell
-S:指定后台进程的名字
Ctrl + a + d:退出子shell,放在后台执行

平均负载

什么是平均负载

平均负载是指,单位时间内,系统处于可运行状态(R)和不可中断状态(D)的平均进程数,也就是平均活跃进程数

平均负载多少合理?

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

## 如何查看cpu的个数
# /proc/cpuinfo
[root@localhost <sub>]# cat /proc/cpuinfo

# top 按1
[root@localhost </sub>]# top

# lscpu
[root@localhost ~]# lscpu

假设我们在有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密集型:计算相关( 程序有大量算法可以选择)
IO密集型:数据库相关服务 mysql(和磁盘有很大关系)

CPU使用高可能会导致平均负载上升 但没有太直接关系
内存 磁盘也会导致平均负载高

企业级负载分析实战

领导:某一台服务器,很卡,怎么办?
卡的原因:服务器,负载太高
如何定位,什么程序,导致负载高?
如何定位,负载高,是哪个硬件引起

## 完全是因为目前没有用户量
stress是Linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。
[root@localhost <sub>]# yum install -y stress

## 以下两条命令是分析负载****
mpstat是多核CPU性能分析工具,用来实时检查每个CPU的性能指标,以及所有CPU的平均指标。
[root@localhost </sub>]# yum install -y sysstat

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

## 启动了4个cpu密集型的进程,4个占用CPU的进程 600秒之后超时断开
stress --cpu 4 --timeout 600

## 查看所有的CPU,5s显示一次数据
[root@localhost <sub>]# mpstat -P ALL 5
可以看出,是用户态的进程导致CPU过高
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain) 05/07/2022 _x86_64_ (2 CPU)

04:30:18 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %

## -u指定5s输出一次数据 2 ,总共输出2组数据[root@localhost </sub>]# pidstat -u 5 2

# IO:磁盘IO导致负载升高
[root@localhost <sub>]# stress --io 100 --timeout 600
# CPU:CPU使用率会导致负载升高
[root@localhost </sub>]# stress --cpu 100 --timeout 600
# 启动大量进程:导致负载升高
[root@localhost ~]# stress -c 100 --timeout 600


## 总结分析流程
1.使用uptime或者top或w 命令查看,系统负载
2.看1分钟,5分钟,15分钟的负载趋势
3.是什么情况导致负载上升
mpstat -P ALL 5 是用户态,还是内核态,导致负载上升
用户态:cpu使用率,大量进程
内核态:磁盘IO,压缩文件,网络存储挂载,下载文件,数据库查询语句
4.查看到底是哪个程序,引起用户态或者内核态的负载上升?
pidstat -u 5 2
5.查到了是某个进程
-运维
执行了某条命令?
启动了某个服务?
-开发
查看开发写好的程序日志,导出日志,交给开发


举报

相关推荐

0 条评论