进程管理上

温故知新:

多道技术:

1.产生背景:针对单核,实现并发

ps:

现在的主机一般是多核,那么每个核都会利用多道技术

有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个

cpu中的任意一个,具体由操作系统调度算法决定。

2.空间上的复用:如内存中同时有多道程序

3.时间上的复用:复用一个cpu的时间片

强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样

才能保证下次切换回来时,能基于上次切走的位置继续运行

即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在。

进程三大类以及切换

进程在运行中不断的改变运行状态,主要可以分为三大状态

1)就绪状态

当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

2)执行(Running)状态

当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态

3) 阻塞(Blocked)状态

正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

就绪–>执行

处在就绪状态的进程,当调度器为其分配了处理机后,就变成了执行状态。

执行–>就绪

执行状态的进程在其执行过程中,时间片跑完了不得不让出处理机,于是从执行变成就绪状态。

执行–>阻塞

正在执行的进程等待某种事件而无法继续执行时,便从执行状态变成阻塞状态。

阻塞–>就绪

处在阻塞状态的进程,如果等待的时间发生,则从阻塞状态转变成就绪状态。

查看父子进程


[root@localhost yum.repos.d]# yum install nginx -y
[root@localhost yum.repos.d]# 
[root@localhost yum.repos.d]# systemctl start nginx
[root@localhost yum.repos.d]# ps aux |grep nginx
[root@rockylinux test]# ps -elf |grep nginx
1 S root       52670       1  0  80   0 -  2527 sigsus 23:04 ?        00:00:00 nginx: master process /usr/sbin/nginx
5 S nginx      52671   52670  0  80   0 -  3485 ep_pol 23:04 ?        00:00:00 nginx: worker process
5 S nginx      52672   52670  0  80   0 -  3485 ep_pol 23:04 ?        00:00:00 nginx: worker process
0 R root       52674    1556  0  80   0 - 55545 -      23:04 pts/0    00:00:00 grep --color=auto nginx

储备知识:

同步与异步:任务的启动/调用方式

同步:

多个任务是同步执行的指的是启动一个任务之后,必须在原地等待该任务运行完毕之后,才能启动下一个任务并且运行

异步:

提交完一个任务之后,不用在原地等待该任务运行完毕

就能立即提交下一个任务执行

补充&符号:

&作用:在bash命令后加&符号,可以把该命令放到后台运行

并发/并行 串行:指的是任务给人展现出的运行的效果

并发/并行:多个任务是”同时“运行的

串行:一个任务运行完毕,才能运行下一个

阻塞与非阻塞:任务在操作系统中的运行状态

会引起阻塞的事项:

1、硬盘io

2、网络io

3、sleep

4、read命令

一、进程的结构:树形结构

0号:整个系统的祖宗进程

0号进程会产生两个进程1号和2号

1号:是所有用户态进程的祖宗

2号:是所有内核台进程的祖宗

二、进程的状态

分为两大类:

活着的

1、运行着的——-》R

正在执行:手里拿着cpu正在运行

就绪(随时可以投入运行):正在等待操作系统分配cpu,一旦分配到,就可以立即投入运行

2、阻塞的—-》S或D

S:可中断的睡眠

可以用例如ctrl+c, kill -9 pid号命令来终止

D: 不可中断睡眠(因为存储设备太忙了响应不过来了)

不可以被中止(linux系统为了防止数据丢失的一种保护机制)

T:暂停

kill -SIGSTOP pid号 #让程序进去T状态

kill -SIGCONT pid号 #结束T状态

死了的

1、僵尸进程—–》Z

  • 僵尸进程是操作系统的一种优化机制。
  • 一个进程死掉之后,会把其占用的cpu、内存资源都释放掉,但是会保留该进程的状态信息,例如:pid号、存在过的一些运行信息。
  • 这些保留下来的信息都是操作系统给父进程准备的。
  • 每个进程死掉之前都会进入僵尸进程的状态
  • 僵尸进程通常由父进程来回收

2、退出的进程—》X几乎看不到

状态后后面跟的状态符号:

+号:前台运行的进程

s:表示该进程是会话(session)的领导/领导进程,用来接收用户请求,然后自己不干给儿子进程去干

l:当前进程是多线程模式

<: 低优先级(nice值)的进程

三、ps aux命令

-a #显示一个终端的所有进程

-u #选择有效的用户id或者是用户名

-x #显示没有控制终端的进程,同时显示各个命令的具体路径。

[root@localhost ~]# ps aux |head -5
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 128400  7104 ?        Ss   8月12   0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    8月12   0:00 [kthreadd]
root          4  0.0  0.0      0     0 ?        S<   8月12   0:00 [kworker/0:0H]
root          5  0.0  0.0      0     0 ?        S    8月12   0:01 [kworker/u256:0]

USER: 运行进程的用户

PID: 进程ID

%CPU: CPU占用率

%MEM: 内存占用率,指的是实际内存RSS占用率

VSZ: 占用虚拟内存,单位:KB(killo Bytes)

VSZ是指已分配的线性空间大小,这个大小通常并不等于程序实际用到的内存大小,产生这个的可能性很多

比如内存映射,共享的动态库,或者向系统申请了更多的堆,都会扩展线性空间大小。

RSS: 占用实际内存,单位:KB(killo Bytes)

RSZ是Resident Set Size,常驻内存大小,即进程实际占用的物理内存大小

TTY: 进程运行的终端

STAT: 进程状态 man ps (/STATE)

R 运行

S 可中断睡眠 Sleep,即在睡眠的过程中可以接收信号唤醒=》执行的IO操作可以得到硬件设备的响应

D 不可中断睡眠,即在睡眠的过程中不可以接收信号唤醒=》执行的IO操作得不到硬件设备的响应

T 停止的进程

Z 僵尸进程

X 死掉的进程(几乎看不见,因为死了就立即回收了)

< 标注了<小于号代表优先级较高的进程

N N代表优先级较低的进程

s 该进程包含子进程,该进程自己是整个会话的领导者

+ +表示是前台的进程组

l 小写字母l,代表以线程的方式运行,即多线程

| 管道符号代表多进程

START: 进程的启动时间

TIME: 进程占用CPU的总时间

COMMAND: 进程文件,进程名

带[ ]号的代表内核态进程

不带[ ]号的代表用户态进程

补充Centos9中还有一个大写字母I的进程状态

大写字母”I”代表的进程状态是”Idle kernel thread”,这意味着该进程是一个空闲的内核线程,不是用户模式下的空闲进程。这个状态通常只应用于内核线程,用户进程通常不会有这个状态。

四、top命令

命令基本用法

[root@localhost ~]# top
[root@localhost ~]# top -d 1  # 1秒刷新一次
[root@localhost ~]# top -d 1 -p 进程的pid
[root@localhost ~]# top -d 1 -p `pgrep nginx | head -1`
[root@localhost ~]# top -d 1 -p `pgrep sshd | head -1`,33  # 查看sshd以及pid为33的进程
[root@localhost ~]# top -d 1 -u nginx  # 查看指定用户进程
[root@localhost ~]# top -b -n 2 > top.txt  # 将2次top信息写入到文件

top命令结果解析

load average平均负载(负载指的是几个活跃的活要干):

在一段时间内,处于R状态的进程数+不可中断D睡眠的进程数。平均负载是用来要衡量系统的繁忙程度

4个cpu:

平均负载为3,代有个3个活跃进程,—》低负载

平均负载为4,代有个4个活跃进程,—》满负载

平均负载>4, —》超负载

cpu的利用率:反应的是cpu的使用情况

第一部分:系统整体统计信息

up左边的代表当前的时间

up右边代表运行了多长时间

load average: 0.86, 0.56, 0.78 CPU 1分钟,5分钟,15分钟平均负载

平均负载解释如下:

”’

===========> 关于cpu的使用情况有两个参考指标

1、关于cpu使用率

某个用户进程对cpu的利用率 = 用户进程占用的cpu时间(包括用户态us+内核态sy) / cpu经历的这段总时间

进程对cpu的利用率为100%代表使用1颗cpu

进程对cpu的利用率为200%代表使用2颗cpu

如果宿主机只有4颗cpu,那么某个进程对cpu的利用率最多400%

总结:cpu使用率反应的是cpu的利用情况

2、关于load average

在某段时间内平均活跃的进程数(包含系统处于可运行状态以及不可中断状态的平均进程数)

如果宿主机有4颗cpu,那么平均负载是可以超过4的

总结:负载负载反应的cpu的工作量

为何不可中断睡眠也属于活跃的进程

一个进程内要做的事可以分为两大类

1、计算任务—》cpu负责运行

2、io任务—–》磁盘、网卡负责处理

只要该进程正在被处理着,那它就属于活跃的进程

cpu在执行该进程的计算机任务,肯定属于活跃

磁盘在处理该进程的io任务,那肯定也属于活跃

总之有事做就属于活跃

而S状态,在等待用户输入内容,而此时用户什么也没有输,即io操作啥事也没做,计算任务也肯定没有

整个进程就是不活跃的

如果你的物理机有1颗cpu,那么满负载为1,代表可以同时运行1个进程,超过1就代表超载,小于1就代表空闲

如果你的物理机有4颗cpu,那么满负载为4,代表可以同时运行4个进程,超过4则代表超载,小于4就代表空闲

以1颗cpu为例,如果处理器上有一个R的进程,同时在系统的进程可运行队列里有9个进程,那么1分钟的load average=1+9

如果宿主机有4颗cpu,那么平均负责是可以超过4的

3、结论

有可能会出现工作量很大,但是利用率很低,比如每个员工手里都有很多活要做,但实际上你问问每个活的进度是啥大家都告诉这些活都在进行着,但是都处于等待的状态,你作为老板你瞬间怒了,你傻啊,等待的过程你不会干别的事啊,员工也很冤枉,说不行啊老板,我这个io是不可中断的io,不能被中断

必须等着对方送过来数据才行,你别看我很闲,但是这件事确实是正在进行的事情

===========>平均负载多少合理?

假设现在在4,2,1核的CPU上,如果平均负载为2时,意味着什么呢?

————————————————

核心数 平均负载 含义

4 2 有一半(50%)的CPU时间是空闲状态

2 2 CPU的时间刚好完全被占用

1 2 至少一半的进程是抢不到CPU的时间的

————————————————-

===========>平均负载的三个数值我们该关注哪一个?

三个值相当于三个样本,我们应该统筹地看

1、如果1分钟,5分钟,15分钟的负载数值都相差不大,代表系统的负载从过去到现在都近乎一样

2、如果1分钟的值,远小于15分钟的值,那么证明系统的平均负载逐渐降低,即我们的系统刚刚经历过大风浪,但目前已逐渐趋于平均。至于15分钟区间内,系统负载上升的原因,还需要我们认真查明

3、如果15分钟的值,远小于1分钟的值,那么证明系统的平均负载逐渐升高,有可能是临时的也有可能持续上升,需要观察

4、一旦1分钟的平均负载接近或超过了CPU的个数,就意味着,系统正在发生过载的问题,这时候就得分析问题了, 并且要想办法优化。

==========>平均负载实验:4个CPU跑满

[root@egon ~]# cat /proc/cpuinfo | grep processor

processor : 0

processor : 1

processor : 2

processor : 3

打开窗口1:执行top命令,然后按1,观察四个核的id几乎为100%,然后在窗口2执行命令观察负载情况

[root@egon ~]# top

[root@egon ~]# 按1

打开窗口2:依次执行下述命令,然后在窗口来观察变化

[root@egon ~]# while true;do ((1+1));done &

[root@egon ~]# while true;do ((1+1));done &

[root@egon ~]# while true;do ((1+1));done &

[root@egon ~]# while true;do ((1+1));done &

用ps aux | grep bash会看到一系列R的bash进程,然后一个个杀掉,观察cpu的负载逐步恢复平静

思考:如果把测试命令换成下述命令,一直连续执行n次,cpu负载都不会很高,为什么??

[root@egon ~]# while true;do ((1+1));sleep 0.1;done &

[root@egon ~]# while true;do ((1+1));sleep 0.1;done &

[root@egon ~]# while true;do ((1+1));sleep 0.1;done &

。。。执行好多次

补充1:也可以使用stress工具来取代上述的while命令

stress是Linux系统压力测试工具,可用作异常进程模拟平均负载升高的场景,需要安装yum install stress -y

[root@egon ~]# stress –cpu 4 –timeout 3000 # 3000代表持续执行3000秒

补充2:安装yum install sysstat -y会得到下述两个命令

mpstat 是多核CPU性能分析工具,用来实时检查每个CPU的性能指标,以及所有CPU的平均指标。

[root@egon ~]# mpstat -P ALL 3 # 3s输出一组所有指标

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

[root@egon ~]# pidstat -u 1 5 # 1秒一次,总共输出5次

”’

第三行的CPU的信息注释

us User,用户态进程占用cpu时间的百分比,不包括低优先级进程的用户态时间(值1-19)
sys System,内核态进程占用cpu时间的百分比
ni Nice,nice值为1-19的进程,用户态占cpu时间的百分比
id Idle,系统空闲cpu的百分比
wa Iowait,系统等待I/O的cpu时间占比,该时间不计入进程的CPU时间
hi Hardware irq,处理硬件中断所占用CPU的时间,该时间同样不计入进程的CPU时间
si Softtirq,处理软件中断的时间,该时间不计入进程的CPU时间
st Steal,表示同一宿主机上的其他虚拟机抢走的CPU时间

nice 是 Linux 和 Unix 系统中的一个命令,它可以用来调整进程的优先级。
在 Unix-like 系统中,每一个进行CPU调度的任务(包含进程、线程)都有一个对应的 nice 值,这个值决定了其在获得 CPU 时间方面的优先级。nice 值的范围在 -20 到 19,其中 -20 表示最高优先级,而 19 刨示最低优先级。默认情况下,新创建的进程 nice 值是 0。
所以我们以0这个nice值为分水岭,1-19都属于比普通进程优先级要低的进程,这类低优先级的进程对cpu的使用率会计入top统计的ni状态中
-20~-1都属于比较高优先级的,会计入top统计的us状态中

nice值又称之为好心值,值越大越好心,那么优先级就会越低,这就有点接近生活了
如果你对一个进程设置了 nice 值,那么它的 CPU 调度优先级将会根据这个 nice 值来进行调整:
如果你将 nice 值设置得较低(例如-20),那么这个进程将会有更高的优先级,当 CPU 进行任务调度的时候,这个进程更有可能被选中执行。
反之,如果你将 nice 值设置得较高(例如+19),那么这个进程的优先级将会降低,它被 CPU 选中执行的机会就更小了。
需要注意的是,只有拥有适当权限(例如 root 用户)才能够将进程的 nice 值设置为负数。这是为了防止普通用户通过增大某个进程的优先级,不公平地占用过多的 CPU 资源。

linux中断:https://www.cnblogs.com/linhaifeng/articles/13916102.html

top内部命令

l – 关闭或开启第一部分第一行 top 信息的表示

t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示

m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示

N – 以 PID 的大小的顺序排列表示进程列表

P – 以 CPU 占用率大小的顺序排列进程列表

M – 以内存占用率大小的顺序排列进程列表

h – 显示帮助

n – 设置在进程列表所显示进程的数量

q – 退出 top

序号 列名 含义

a PID 进程id

b PPID 父进程id

c RUSER Real user name

d UID 进程所有者的用户id

e USER 进程所有者的用户名

f GROUP 进程所有者的组名

g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?

h PR 优先级

i NI nice值。负值表示高优先级,正值表示低优先级

j P 最后使用的CPU,仅在多CPU环境下有意义

k %CPU 上次更新到现在的CPU时间占用百分比

l TIME 进程使用的CPU时间总计,单位秒

m TIME+ 进程使用的CPU时间总计,单位1/100秒

n %MEM 进程使用的物理内存百分比

o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。

q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

r CODE 可执行代码占用的物理内存大小,单位kb

s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb

t SHR 共享内存大小,单位kb

u nFLT 页面错误次数

v nDRT 最后一次写入到现在,被修改过的页面数。

w S 进程状态。(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)

x COMMAND 命令名/命令行

y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名

z Flags 任务标志,参考 sched.h

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。

通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。

按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。

按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。

五、查看进程树的命令

[root@egon ~]# rpm -qf `which pstree`
psmisc-22.20-16.el7.x86_64
[root@egon ~]# pstree
[root@egon ~]# pstree 104239
bash───bash───bash───bash───pstree

六、查看PPID,也就是父进程ID

[root@egon ~]# ps -elf | head -10
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 11月01 ?      00:00:07 /usr/lib/systemd/systemd --system --deserialize 20
root          2      0  0 11月01 ?      00:00:00 [kthreadd]
root          4      2  0 11月01 ?      00:00:00 [kworker/0:0H]
root          6      2  0 11月01 ?      00:00:06 [ksoftirqd/0]
root          7      2  0 11月01 ?      00:00:00 [migration/0]
root          8      2  0 11月01 ?      00:00:00 [rcu_bh]
root          9      2  0 11月01 ?      00:00:03 [rcu_sched]
root         10      2  0 11月01 ?      00:00:00 [lru-add-drain]
root         11      2  0 11月01 ?      00:00:01 [watchdog/0]
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇