温故知新:
多道技术:
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]