案头见蠹鱼,犹胜凡俦侣。这篇文章主要讲述CenOS 进程管理相关的知识,希望能为你提供帮助。
[TOC]
进程管理
进程基本概述
什么是进程
进程就是一个正在运行的程序
比如:windows上安装QQ,我们会将其称为QQ程序,当QQ运行后,在任务管理器中,我们可以看到QQ程序在运行着。此时,我们称其为:QQ进程
程序和进程的区别
【CenOS 进程管理】程序是静态概念,代码的合集,可以长期存放在系统中
进程是动态概念,具有生命周期,无法长期存放在系统中
进程的生命周期
文章图片
接收任务—fork子进程—子进程处理任务—父进程等待
正常结束
非正常结束
- 僵尸进程
- 孤儿进程
父进程没有回收子进程的资源
此时的子进程称为" 僵尸进程"
产生的原因子进程的结束和父进程的运行是异步的
父进程永远不知道子进程什么时候结束
子进程在结束时,父进程繁忙来不及处理wait子进程
则会导致,子进程变为僵尸进程
孤儿进程及产生的原因 孤儿进程父进程比子进程先结束
子进程还在执行任务,没有父进程管理
此时的子进程称为" 孤儿进程"
产生的原因子进程的结束和父进程的运行时异步的
父进程永远不知道子进程什么时候结束
当父进程正常完成工作或其他原因被终止
则会导致,子进程变成孤儿进程
监控进程的状态 进程状态管理命令-ps
ps [选项] [参数]## 常用组合
[root@localhost ~]# ps -ef
[root@localhost ~]# ps auxa:查看所有与终端相关的进程,由终端发起的进程
u:显示进程的管理用户
x:查看所有与终端无关的进程root@localhost ~]# ps aux | grep bash
USERPID %CPU %MEMVSZRSS TTYSTAT STARTTIME COMMAND
root123640.00.1 1155482048 pts/0Ss17:550:00 -bash
root124060.00.0 112812980 pts/0S+18:140:00 USER:该进程的管理用户
PID:进程号
%CPU:该进程占用CPU的百分比
%MEM:该进程占用内存的百分比
VSZ:该进程占用虚拟内存的大小
RSS:该进程占用物理内存的大小
TTY:终端
?:由内核发起的进程
tty:机器上(虚拟机)的终端进程
pts/N:远程连接工具的终端进程
STAT:进程运行的状态
#D:无法中断的休眠状态(通IO的进程)
#R:正在运行的状态
#S:处于休眠状态的进程
T:暂停或者被追踪的状态(ctrl+z)
W:进入交换内存的进程(swap,centos7已见不到)
X:死掉的进程(少见)
#Z:zombie 僵尸进程
<
:优先级高德进程
N:优先级低的进程
L:有些数据页被锁进内存的进程
s:父进程,在它下面有子进程
l:以线程的方式运行
|:存在多进程的进程
#+:在前台运行
STRAT:进程开启的时间
TIME:该进程占用CPU的时间
COMMAND:进程的名字或者进程的命令
[]:内核态进程
没[]:用户态进程# 如果后台有被暂停的进程
## 查看所有被暂停的进程
[root@localhost ~]# jobs
[1]+Stoppedping www.baidu.combg:让暂停的进程运行起来,后面加数字,就可以运行第几个被暂停的进程(默认是最后一个)
fg:是把后台暂停的进程,调到前台运行,后面加数字,可以将第N个进程调到前台运行(默认是最后一个)## ps命令的用法
# 1.根据%CPU进行排序
[root@localhost ~]# ps -ef |sort -k 3[root@localhost ~]# ps -aux --sort %cpu#2.自定义显示字段
o:显示自定义字段
[root@localhost ~]# ps axo user
USER
root
root
root[root@localhost ~]# ps axo user,pid
USERPID
root1
root2
root4
root6
root7# 3.显示子进程
f:查看子进程和父进程的关系
[root@localhost ~]# ps auxf | grep bash
root16490.00.1 1156522108 pts/0Ss14:580:00
\\_ -bash
root16960.00.0 112812980 pts/0S+15:070:00
\\_ grep --color=auto bash# 4.查看指定进程的pid
[root@localhost ~]# pgrep bash
1649
# 4.1.杀死该命令的所有进程
[root@localhost ~]# pgrep bash |xargs kill# pgrep 选项
-l:显示该进程的启动命令
[root@localhost ~]# pgrep-l bash
1649 bash-a:显示该进程的完整描述信息
[root@localhost ~]# pgrep-la ping
1732 ping www.baidu.com
进程状态管理命令-top
[root@localhost ~]# top
## 第一行(系统相关)
top - 16:05:46 up 21 min,1 user,load average: 0.00, 0.01, 0.03
top:命令
16:05:46:当前系统时间
up 21 min:该服务器运行时间
1 user:当前用户登录的数量
load average: 0.00, 0.01, 0.03:系统的平均负载
0.00:代表系统1分钟前的负载
0.01:代表系统5分钟前的负载
0.03:代表系统15分钟前的负载## 第二行(进程状态)
Tasks: 105 total,1 running, 104 sleeping,0 stopped,0 zombie
Tasks:工作任务
105 total:当前系统中进程的总数
1 running:处于R状态,正在运行状态的进程数量
104 sleeping:处于S状态,休眠状态的进程数量
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
0.0 us:用户进程占用CPU的百分比(用户态)
0.0 sy:系统进程占用CPU的百分比(内核态)
0.0 ni:优先级较高的进程占用CPU的百分比
100.0 id:CPU的空闲程度
0.0 wa:wait,等待的进程占用CPU的百分比
0.0 hi:硬中断占用CPU的百分比
0.0 si:软中断占用CPU的百分比
0.0 st:虚拟化技术占用CPU的百分## 第四行(物理内存)
KiB Mem :2027892 total,1690716 free,222372 used,114804 buff/cache
KiB:单位,KB
2027892 total:总内存数
1690716 free:空闲的内存数
222372 used:已使用的内存数
114804 buff/cache:buff缓冲区/缓存区## 第五行(虚拟内存)
KiB Swap:2097148 total,2097148 free,0 used.1667840 avail Mem
KiB:单位,KB
2097148 total:总共的虚拟内存数
2097148 free:空闲的虚拟内存数
0 used:已使用的虚拟内存数
1667840 avail Mem:可用的虚拟内存数
什么是中断
中断是系统用来影响硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来影响设备的请求。
## 中断是一种处理机制,虽然叫中断,但是它是避免被打断的、丢数据。
为什么要有中断
## 举例
比如你定了一份外卖,但是不确定外卖什么时候送到,也没有别的方法了解外卖的进度,但是配送人员送外卖是不等人的,到了你这,没人接取的话,直接走人了。所以你只能苦苦的等着,时不时的去门口看看外卖送到没有,而不能做其他的事情。
不过如果在订外卖的时候,你就跟配送员约定好了,让他送到给你打电话,那你就不用苦苦等着了,可以去忙别的事情了,直到电话一响,接到电话,就可以取外卖了。此时打电话就是一个中断的操作。
没接到电话之前,你可以做其他事情,当你接到电话之后(就发生了中断),你才要进行另一个动作取外卖
# PS:中断是一个异步的事件处理机制,可以提高操作系统处理并发的能力
中断会带来什么问题
由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快的运行,如果中断本身要做的事情不多,那么处理起来也不会有太大问题,但是如果中断要处理的事情很多,中断服务程序就有可能要运行很长时间。
特别是,中断处理程序在影响中断时,还会临时关闭中断,这就会导致上一次中断处理完成之前,其他中断都不能想应,也就是说中断有可能会丢失数据。
## PS:遇到这种情况就需要用到软中断
系统的软中断
刚才说了丢失一次中断,如果对于系统来说,每次都只能处理一次中断。为了解决中断处理程序执行过长的和丢失中断的问题,Linux将中断处理过程分成了两个阶段:
第一阶段:用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关工作
第二阶段:用来延迟处理第一阶段未完成的工作,通常以内核线程的方式运行
top命令用法
## 命令:top
# 选项
-d:指定更新的时间(默认是3s更新一次)
-p:只查看指定PID进程
-u:查看指定相关用户
-b:将top内容保存到文件中
-n:结合-b选项使用,指定次数# 常见指令
h:查看帮助
z:高亮显示
1:显示所有cpu的负载
s:设置刷新时间(默认是3s)
b:高亮显示处于R状态的进程
M:按内存使用百分比排序输出
P:按cpu使用百分比排序输出
R:对排序进行反转
f:显示自定义字段
k:kill掉指定PID进程
W:保存top环境设置 保存到~/.toprc
q:退出## top每一行的内容
PID:进程号
USER:该进程的用户
PR NI:进程优先级,最高是20 最低是-20
VIRT:虚拟内存占用空间
RES:物理内存占用空间
SHR:共享内存占用空间
S:进程的状态
%CPU:占用CPU的百分比
%MEM:占用内存的百分比
TIME+:运行时间
COMMAND:进程的运行命令
进程的信号管理
## 列出所有信号名称
[root@localhost ~]# kill -l
1) SIGHUP2) SIGINT3) SIGQUIT4) SIGILL5) SIGTRAP
6) SIGABRT7) SIGBUS8) SIGFPE9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM27) SIGPROF 28) SIGWINCH29) SIGIO30) SIGPWR
31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) SIGRTMIN+3
38) SIGRTMIN+439) SIGRTMIN+540) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+8
43) SIGRTMIN+944) 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-956) SIGRTMAX-857) SIGRTMAX-7
58) SIGRTMAX-659) SIGRTMAX-560) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-2
63) SIGRTMAX-164) SIGRTMAX# 常见信号列表:
数字信号信号别名作用
1HUP挂起信号,往往可以让进程重新配置(重新加载配置文件)
2INT中断信号,起到结束进程的作用,和ctrl + c 的作用一样
3QUIT让进程退出,结果是进程退出
9KILL直接结束进程,不能被进程捕获
15TERM进程终止,这是默认信号
18CONT被暂停的进程将继续恢复运行(放在后台运行,bg)
19STOP暂停进程
20TSTP用户停止请求,作用类似于ctrl + z 把进程放到后台并暂停killall:杀掉所有进程,不用指定pid
pkill:杀掉所有进程,不用指定pid,也可以杀掉终端
[root@localhost ~]# pkill -9 -t pts/0
进程的优先级
## 什么是优先级
优先级高的进程,可以优先享用系统资源
## 举例
cpu有四核,处理了四个进程,这四个进程刚好把cpu占满,那么这个时候,有一个进程发起了调度任务,如果这个进程的优先级较高的话,就会把占满cpu四个进程其中一个进程挤出,由这个进程先运行。## 优先级的定义和配置
在启动进程时,为不同的进程使用不同的调度策略nice值越高:表示优先级越低,例如19,该进程容易将cpu使用量让给其他进程
nice值越低:表示优先级越高,例如-20,该进程更不倾向于让出cpu
使用nice命令指定进程优先级
## 打开一个终端
[root@localhost ~]# nginx## 打开另一个终端,查看进度的优先级
[root@localhost ~]# ps aux |grep [n]ginx
root12100.00.0459961116 ?Ss16:060:00 nginx: master process nginx
nobody12110.00.0464441872 ?S16:060:00 nginx: worker process
[root@localhost ~]# ps axo pid,user,nice,command | grep nginx
1210 root0 nginx: master process nginx
1211 nobody0 nginx: worker process
1215 root0 grep --color=auto nginx## 指定优先级执行命令
[root@localhost ~]# nice -n 5 nginx
[root@localhost ~]# ps axo pid,user,nice,command | grep nginx
1153 root5 nginx: master process nginx
1154 nobody5 nginx: worker process
1158 root0 grep --color=auto nginx## 重置已经在运行得程序,优先级
# 使用命令renice,需指定PID
[root@localhost ~]# ps axo pid,user,nice,command | grep ssh
883 root0 /usr/sbin/sshd -D
1099 root0 sshd: root@pts/0
1164 root0 grep --color=auto ssh
[root@localhost ~]# renice -n -20 883
883 (process ID) old priority 0, new priority -20
[root@localhost ~]# ps axo pid,user,nice,command | grep ssh
883 root-20 /usr/sbin/sshd -D
1099 root0 sshd: root@pts/0
1168 root0 grep --color=auto ssh
后台进程管理
## 在执行命令后面加 &
会直接将该命令放在后台执行
&
[root@localhost ~]# ping www.baidu.com &
[1] 1175
[root@localhost ~]# PING www.a.shifen.com (180.101.49.12) 56(84) bytes of data.
64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=1 ttl=128 time=10.8 ms
64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=2 ttl=128 time=12.2 ms
64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=3 ttl=128 time=12.7 ms## 先把进程放在后台暂停,配合bg命令,将暂停的进程在后台恢复运行
Ctrl + z
jobs bg fg[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (180.101.49.11) 56(84) bytes of data.
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=1 ttl=128 time=12.3 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=2 ttl=128 time=12.3 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=3 ttl=128 time=12.2 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=4 ttl=128 time=13.0 ms
^Z
[1]+Stoppedping www.baidu.com
# 按住ctrl + z,暂停了进程# jobs命令,查看当前暂停的进程有哪些
[root@localhost ~]# jobs
[1]+Stoppedping www.baidu.com# 用bg命令,将暂停的进程放入后台运行
[root@localhost ~]# bg 1# 将执行的命令放入后台执行,并且将输出结果保存到nohup.out文件中,该文件保存在当前目录下
[root@localhost ~]# nohup ping www.baidu.com &
[1] 1206
[root@localhost ~]# nohup: ignoring input and appending output to ‘nohup.out’[root@localhost ~]# ls
anaconda-ks.cfgnginx-1.20.2nginx-1.20.2.tar.gznohup.out# 将进程放入后台(开启一个子shell)
screen
## 安装命令
[root@localhost ~]# yum install -y screen## 选项
-ls:查看所有screen的后台进程
-r:指定后台进程号,进入该进程后台
-S:指定后台进程的名字
按住ctrl + a + d:放在后台执行[root@localhost ~]# screen -S ping_baidu
[root@localhost ~]#
[root@localhost ~]#ping www.baidu.com
按住ctrl + a + d:放在后台执行
[root@localhost ~]# screen -S ping_baidu
[detached from 1228.ping_baidu]
[root@localhost ~]# screen -ls
There is a screen on:
1228.ping_baidu (Detached)
1 Socket in /var/run/screen/S-root.
平均负载
## 什么是平均负载
平均负载是指,单位时间内,系统处于可运行状态(R)和不可中断状态(D)的平均进程数,也就是平均活跃进程数## 平均负载多少合理?
# 如何查看cpu的个数
top 按1
/proc/cpuinfo
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类型
cpu密集型:计算相关
IO密集型:数据库相关的服务器
企业级负载分析实战
领导:某一台服务器,很卡,怎么办?卡的原因:服务器,负载太高如何定位,什么程序,导致负载高?
如何定位?负载高,是哪个硬件引起的?## 在目前没有用户量的情况下,可以用stress测试工具。stress是linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景[root@localhost yum.repos.d]# yum install -y stress## 分析负载
mpstat是多核cpu性能分析工具,用来实验时检查每个cpu的性能指标,以及所有cpu的平均指标。
pidstat是一个常用的进程性能分析工具,用来实时查看进程的cpu、内存、IO,以及上下文切换等性能指标。
#安装命令
mpstat: [root@localhost ~]# yum -y install sysstat-10.1.5-19.el7.x86_64## 模拟一个cpu使用率100%的场景,启动了1个cpu密集型的进程,1个占用CPU的进程
[root@localhost ~]# stress --cpu 1 --timeout 600## 查看所有cpu,5s显示一次数据
[root@localhost ~]# mpstat -P ALL 507:14:31 PMCPU%usr%nice%sys %iowait%irq%soft%steal%guest%gnice%idle
07:14:36 PMall50.050.000.000.000.000.000.000.000.0049.95
07:14:36 PM00.000.000.000.000.000.000.000.000.00100.00
07:14:36 PM1100.000.000.000.000.000.000.000.000.000.0007:14:36 PMCPU%usr%nice%sys %iowait%irq%soft%steal%guest%gnice%idle
07:14:41 PMall50.050.000.100.000.000.000.000.000.0049.85
07:14:41 PM00.000.000.000.000.000.000.000.000.00100.00
07:14:41 PM1100.000.000.000.000.000.000.000.000.000.0007:14:41 PMCPU%usr%nice%sys %iowait%irq%soft%steal%guest%gnice%idle
07:14:46 PMall50.100.000.000.000.000.000.000.000.0049.90
07:14:46 PM00.200.000.000.000.000.000.000.000.0099.80
07:14:46 PM1100.000.000.000.000.000.000.000.000.000.00## -u指定5s输出一次数据 2 , 总共输出2组数据
[root@localhost ~]#pidstat -u 5 2# IO:磁盘IO导致负载升高
[root@localhost ~]# stress --io 100 --timeout 600# CPU:CPU会用率会导致负载升高
[root@localhost ~]# stress --cpu 100 --timeout 600# 启动大量进程:导致负载升高
[root@localhost ~]# stress -c 100 --timeout 600## 总结分析流程:
1.使用uptime或者top命令查看,系统负载
2.看1分钟、5分钟、15分的负载趋势
3.是什么情况导致负载上升
mpstat -P ALL 5:是用户态还是内核态导致上升引起用户态原因:cpu使用率,大量进程
引起内核态原因:磁盘IO,压缩文件,网络存储挂载,下载文件,数据库查询语句
4.查看到底是哪个程序,引起用户态或者内核态的负载上升
pidstat -u 5 2
5.查到了是某个进程后
-运维
执行了某条命令?
启动了某个服务?
-开发
查看开发写好的程序日志.导出日志,交给开发
推荐阅读
- HMS Core地理围栏能力助你实现指定范围人群的精准消息推送
- 跟着动画学 Go 数据结构之二叉树
- [OpenCV实战]32 使用OpenCV进行非真实感渲染
- vue2.x版本中computed和watch的使用入门详解-watch篇
- 搭建组件库最小原型(支线)
- Redis lua环境
- [ 链表OJ题--C语言实现 ] 复制带随机指针的链表(带视频讲解哦)
- kettle庖丁解牛第32篇之本地和上游数据量比较后再抽取
- 路由基础之OSPFRouterID及DR和BDR的选举