Linux进程管理

1.进程基本概述

  • 什么是程序:开发编写的源代码,封装为产品,比如(微信、钉钉、等等)都称为程序(硬盘);
  • 什么是进程:程序运行的过程,我们称为进程,它主要是用来控制计算机硬件运行我们的程序;
  • 程序与进程区别:
    - 程序:程序是数据+指令的集合,是一个静态的概念,同时程序可以长期存在系统中;
    - 进程:进程是程序运行的过程,是一个动态的概念,在进程运行的过程中,系统会有各种指标来表示当前运行的状态,同时进程会随着程序的终止而销毁,不会永久存在系统中;

1.2 进程与线程

  • 假设需要运行”360安全卫士“程序,会进行资源申请,首先系统申请一块内存空间、然后从硬盘中将代码读到内存、最后进行其他资源的申请,这个申请资源的过程,我们称为进程(资源单位);
  • 当运行该进程中的"病毒扫描、漏洞查找、垃圾清理"等功能,通常我们会将该功能称为进程中的线程,线程是运行代码的过程,它是一个(执行单位),是进程中的更细的单位,如果该进程有多个线程,线程与线程之间互相不受影响,同时多线程之间可以实现数据共享;
  • 工厂流水线例子:工厂(操作系统)–>进程(车间)–>线程(流水线作业)
    ##############################
    简单来说就是:
  • 程序:静态文件,存储在磁盘上
  • 进程:运行程序,动态概念,随着进程的销毁而结束;
  • 线程:执行单位,进程的子集,进程会包含线程。

1.3 并发与并行

  • 并发:多个任务看起来是同时运行,这是一种假并行(CPU在任务中来回切换);
    在这里插入图片描述-并行:多个任务是真正的同时运行(并行必须有多核CPU才可以实现);
    在这里插入图片描述

1.4 进程运行的状态

  • 一般来说,进程有三个状态,即就绪状态,运行状态,阻塞状态;
  • 运行态:正在使用cpu
  • 阻塞态:碰到了IO操作,需要等待
  • 就绪态:准备好了,等待cpu从进程里调度
  • 在这里插入图片描述上述三种状态之间转换分为如下几种情况;
  • 运行–>阻塞:进程发生I/O操作,需等待事件,而继续无法执行,则进程由运行状态变为阻塞状态;
  • 阻塞–>就绪:进程所等待的事件已经完成,但没办法直接运行,需要进入就绪队列,等待调度;
  • 就绪–>运行:运行的进程时间片已经用完,CPU会从就绪队列中选择合适的进程分配CPU
  • 运行–>就绪:
    1、进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;
    2、当有更高优先级的进程要运行时,该进程需要让出CPU,由运行状态转变为就绪状态;
  • 就绪态–>阻塞: 已经就绪了,跟阻塞毫无关系;
  • 阻塞–>运行:阻塞状态结束,它必须进入就绪队列中,然后等待cpu从队列中挑选进程分配资源

1.5 进程的生命周期

  • 生命周期就是指一个对象的生老病死,用处很广
    在这里插入图片描述当父进程接收到任务调度时,会通过fock派生子进程来
    处理,那么子进程会继承父进程属性。
    1.子进程在处理任务代码时,父进程其实不会进入等待,其运行过程是由linux系统进行调度的。
    2.子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源。
    3.如果子进程在处理任务代码过程中异常退出,而父进程却没有回收子进程资源,会导致子进程虽然运行实体已经消失,但仍然在内核的进程表中占据一条记录,长期下去对于系统资源是一个浪费。(僵尸进程)
    4.如果子进程在处理任务过程中,父进程退出了,子进程没有退出,那么这些子进程就没有父进程来管理了,由系统的system进程管理。(孤儿进程)
    PS: 每个进程都父进程的PPID,子进程则叫PID。
    #####################
    简单来说就是:
    僵尸进程:子进程异常退出,没有让父进程回收
    孤儿进程:子进程运行,父进程意外退出,直接交由系统的system进程管理

2.进程运行状态监控

  • 程序在运行后,我们需要了解进程的运行状态。查看进程的状态分为:
    静态查看
    动态查看

2.1 静态监控进程ps

  • ps -aux常用组合,查看进程 用户、PID、占用cpu百分比、占用内存百分比、状态、执行的命令等

2.1.1 每行指标详解

在这里插入图片描述- USER:启动进程的用户

  • PID:进程运行的ID
  • %CPU:进程占用CPU百分比
    -%MEM:进程占用内存百分比
  • VSZ:进程占用虚拟内存大小 (单位KB)
  • RSS:进程占用物理内存实际大小 (单位KB)
  • TTY:进程是由哪个终端运行启动的tty1、pts/0?表示内核程序与终端无关
  • STAT:进程运行过程中的状态man ps(/STATE)
  • START:进程的启动时间
  • TIME:进程占用 CPU 的总时间(为0表示还没超过秒)
  • COMMAND:程序的运行指令,[ ]属于内核态的进程。 没有[ ] 属于用户态进程。

2.1.2 查看进程的父进程

ppid指定的是父进程:

[root@localhost ~]# ps -ef |grep sshd
root       1043      1  0 7月26 ?       00:00:00 /usr/sbin/sshd -D
root       1561   1043  0 01:00 ?        00:00:00 sshd: root@pts/0
root       1604   1565  0 01:18 pts/0    00:00:00 grep --color=auto sshd

2.1.3 查看进程树结构

通过pstree可以查看进程树状结构:

[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─agetty
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───6*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───2*[{vmtoolsd}]

2.1.4 查看用户进程

pgrep查看用户的进程
-l:同时显示进程名和进程pid
-a:列出进程pid以及详细命令
-u:查看特定用户运行的进程
-o:进程起始的ID;
-n:进程终止的ID;

1、使用普通用户运行进程

[root@localhost ~]# su - xshun -c "sleep 10000" &
[1] 1660
# &将进程放入后台

2、使用pgrep过滤用户运行的进程名称,已经进程ID

[root@localhost ~]# pgrep -l -u xshun
1608 bash
1661 sleep
#-l:同时显示进程名和进程pid
[root@localhost ~]# pgrep -a -u xshun
1608 -bash
1661 sleep 10000
#-a:列出进程pid以及详细命令

2.1.2 SATS运行状态

  • STAT状态的S、Ss、S+、R、R+、S+等等,都是什么意思?
    在这里插入图片描述
SATA基本描述描述SATA状态+符号描述
R进程运行s进程是控制进程,Ss进程的领导者,父进程
S可中断睡眠<进程运行在高优先级上。S<优先级较高的进程
T进程被暂停N进程运行在低优先级上,SN优先级较低的进程
D不可中断的进程+当前进程运行在前台,R+表示该进程在前台运行
Z僵尸进程l进程是多线程的,Sl表示进程是以线程方式运行的

2.2动态监控进程top

  • 使用top命令查看当前的进程状态(动态)

2.1.1 top命令选项

  • 执行top命令时可以指定命令的选项
    -d:指定刷新时间
    -p:指定pid
    -u:指定用户
  • 示例用法:
[root@localhost ~]# top -d 4 -p 1445
#查看指定的进程详情
[root@localhost ~]# top -d 4 -u xshun
#动态查看xshun运行的进程

2.1.2 top内部选项

  • 执行top后可使用的选项
    c:改变top刷新频率(一般不建议设定)
    P:按CPU进行排序;
    M:以内存进行排序;
    R:对排序后的结果进行倒序;
    f:自定义显示的字段,比如打印ppid
    k:指定杀死某个id
    1:显示cpu核心数
    z:以高亮显示数据
    b:高亮显示处于R状态的进程

2.1.3 top字段含义

uptime
w
在这里插入图片描述

  • top字段含义:
    21:48:25:当前的时间
    up 1 day,20:30:服务器运行了多久
    1 user:当前打开了多少个会话
    load average: 0.00 0.01 0.05:系统负载,1,5,15分钟的负载
  • Tasks字段含义: 进程
    129 total:当前进程的总数
    1 running:正在运行的进程数量
    128 sleeping:睡眠的进程数量
    0 stopped:停止的进程数量
    0 zombie:僵尸进程数量
  • %Cpu(s)含义: cpu使用情况
    0.7 us: 用户进程使用CPU百分比
    0.7 sy:系统内核占用CPU百分比,通常内核是于硬件进行交互(调用硬件)
    0.0 ni:优先级的基进程占用的百分比
    98.7 id:空闲CPU的百分比
    0.0 wa:CPU等待IO完成的时间
    0.0 hi:硬中断,占的CPU百分比
    0.0 si:软中断,占的CPU百分比
    0.0 st:比如虚拟机占用物理CPU的时间
  • KiB Mem:物理内存
    。total 总的内存
    。 free 剩余的
    。used使用的
    。buff写缓冲
    。cache读缓存
  • KiB Swap:虚拟内存,交换分区
    。total 总的内存
    。free 剩余的
    。used使用的
    。avail Mem 可用的

使用free 更准一些

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           2120         166        1541           9         412        1799
Swap:          2175           0        2175

total:表示物理内存总量
used:表示总计分配给缓存(包含buffers与cach)使用的数量,但其中可能有部分缓存并未实际使用。
free:未被分配的内存
shared:多个进程共享的内存总额
bufers:系统已分配但未被使用的buffers数量
cached:系统已分配但未被使用的cache数量

2.1.3 如何理解中断

  • Linux 中的中断处理程序分为上半部和下半部:
    。上半部对应硬件中断,用来快速处理中断。
    。下半部对应软中断,用来异步处理上半部未完成的工作。

Linux 中的软中断包括网络收发、定时、调度、等各种类型,可以通过查看 /proc/softirqs 来观察软中断的运行情况。

所以,这两个阶段你也可以这样理解:
上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行;
而下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行;

  • buffer/cache可以手动释放

  • total: 总内存计算公式:used + free + buffer + cache = total

  • used: 已使用内存计算公式:total - free - buffers - cache = used(包含share)

  • free: 未被使用的内存计算公式:total - used - buffer - cache = free

  • available: 可获得内存计算公式: free + (buffer+cache可释放的空间) = available 启 动新的程序能用的内存

  • buffer: 写缓冲;

  • cache: 读缓存;

  • share: 共享内存,属于被分配的内存

  • 需要注意:、

  • free表示的是当前完全没有被程序使用的内存;

  • 而cache在有需要时,是可以被释放出来以供其它 进程使用的;

  • 而available才真正表明系统目前可以提供给应用 程序使用的内存;

  • 内存清理
    sync
    echo 3>/proc/sys/vm/drop_caches 改变了文件 最后修改时间;
    ######################
    sync命令的作用:是将有关文件系统的存储器常驻信息送入物理介质内。
    不是windows中的保存
    为了提高磁盘的读写效率,linux 会把频繁读写的磁盘文件在内存中做缓存。。
    但是这会造成数据的不同步,
    sync 就是为了数据同步。。(flush file system buffers)

3.管理进程状态

当程序运行为进程,如果需要关闭进程,则需要使用
kill、killall,pkill 等命令对进程ID发送关闭信号

3.1 系统支持的信号

  • 使用 kill -l 列出当前系统所支持的信号、虽然支持的信号很多,但我们仅以最常用的3个信号为例
    。1(SIGHUP):通常用来重新加载配置文件
    。9(SIGKILL):强制杀死进程
    。15(SIGTERM):终止进程,(默认kill信号)

3.2 关闭进程pkill、killall

1、通过 pkill、killall 指定进程服务名称,然后将其进程关闭

[root@localhost ~]# pkill nginx
[root@localhost ~]# killall nginx

2、使用pkill将远程连接用户t下线;

[root@localhost ~]# tty
/dev/pts/1
[root@localhost ~]# pkill -9 -t pts/1

4.进程优先级

  • 优先级指的是优先享受资源,比如排队买票时,军人优先、老人优先。等等
  • 系统优先级:优先使用cpu资源;

4.3 进程如何配置优先级

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

4.4 进程优先级如何查看

1、使用top命令查看优先级;
在这里插入图片描述
- NI:显示nice值,默认是0
- PR:显示nice值,-20映射到0,+19映射到39

2、使用ps命令查看进程优先级;

[root@localhost ~]# ps axo command,nice |grep vim
grep --color=auto vim         0

4.5 指定进程启动优先级nice

1、启动vim并且指定程序优先级为-5

[root@localhost ~]# nice -n -5 vim &
[1] 1445
# &放入后台运行

2、查看当前vim进程的优先级

root@localhost ~]# ps -axo pid,command,nice |grep 1463
  1463 vim                          -5

4.6 修改进程优先级renice

1、查看当前正在运行的sshd进程优先级状态

[root@localhost ~]# ps axo pid,command,nice |grep sshd
  1039 /usr/sbin/sshd -D             0
  1051 sshd: root@pts/0              0
  1467 grep --color=auto sshd        0
#-D守护进程

2、调整sshd主进程的优先级

[root@localhost ~]# renice -n -20 1051
1051 (进程 ID) 旧优先级为 0,新优先级为 -20

3、调整之后需要退出终端,重新打开一个新终端

[root@localhost ~]# ps axo pid,command,nice |grep sshd
  1039 /usr/sbin/sshd -D           -20

4、再次登录sshd服务,会由主进程forksshd进程(那么子进程会继承主进程的优先级)

[root@localhost ~]# ps axo pid,command,nice |grep sshd
  1039 /usr/sbin/sshd -D           -20
  1502 sshd: root@pts/1            -20
  1530 sshd: root@pts/0            -20
  1561 grep --color=auto sshd      -20

5.后台进程管理

5.1 什么是后台进程

通常进程都会在终端前台运行,一旦关闭终端,进程也会随着结束;
那么此时我们就希望进程能在后台运行,就是将在前台运行的进程放入后台运行,这样及时我们关闭了终端也不影响进程的正常运行。

5.2 如何将进程转为后台

早期的时候大家都选择使用 nohup + & 符号将进程放入后台,然后在使用jobs、bg、fg等方式查看进程状态,但太麻烦了 也不直观,所以我们推荐使用screen

5.3.1 nohup方式

1、使用nohup将前台进程转换后台运行

[root@localhost ~]# nohup sleep 3000 &
[1] 1562

2、查看进程运行情况

[root@localhost ~]# ps aux |grep sleep
root       1562  0.0  0.0 108052   616 pts/0    S<   17:19   0:00 sleep 3000

3、使用job bg fg等方式查看后台作业

[root@localhost ~]# jobs
[1]+  运行中               nohup sleep 3000 &
#查看后台作业
[root@localhost ~]# fg %1
#转为前台运行
[root@localhost ~]# bg %1
#转为后台运行

5.3.2 screen方式

1、安装screen工具

[root@localhost ~]# yum -y install screen

2、开启一个screen子窗口,可以通过-s为其指定名称

[root@localhost ~]# screen -S wgent_sort
#大写的S

3、在screen窗口执行任务,可以执行前台运行的任务


4、平滑退出 screen,但不会终止screen中的前台任务

ctrl +a+d

5、查看当前有多少个screen正在运行

[root@localhost ~]# screen -list
There is a screen on:
	2041.wgen_sort	(Detached)
1 Socket in /var/run/screen/S-root.

6、可以通过screen id或screen标签名进入

[root@localhost ~]# screen -r wgen_sort 
[root@localhost ~]# screen -r 2041

#在screen窗口先ctrl +cexit结束screen

6.系统平均负载

  • 每次发现系统变慢时,通常做的第一件事,就是执行topuptime 来了解系统的负载情况。
  • 比如像下面这样,我在命令行里输入了 uptime命令,系统也随即给出了结果
[root@localhost ~]# uptime
 17:52:22 up  1:27,  2 users,  load average: 0.01, 0.02, 0.05
# 前面几列,它们分别是当前时间、系统运行时间以及正在 登录用户数。 
# 而最后三个数字呢,依次则是过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average)。

6.1 什么是平均负载

  • 平均负载是单位时间内的 CPU 使用率吗;
    。上面的 0.70 代表 CPU 使用率是 70% 其实不是;
  • 那如何理解平均负载:
    。平均负载是指单位时间内,系统处于可运行状态和 不可中断状态的平均进程数,也就是平均活跃进程数;或者理解"平均负载"是"单位时间内的活跃进程数";
    。平均负载与 CPU 使用率并没有直接关系

6.1.1 可运行状态

  • 可运行状态进程:
  • 指正在使用 CPU 或者正在等待 CPU 的进程,也就是
    我们ps命令看到处于 R 状态的进程

6.1.2 不可中断状态

  • 不可中断进程:
  • 系统中最常见的是等待硬件设备的 I/O 响应,通过ps 命令中看到 D(Disk Sleep)的进程。
  • 例如:当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程或者中断打断的,这个时候的进程就处于不可中断状态。如果此时的进程被打断了,就容易出现磁盘数据与进程数据不一致的问题;
  • 所以,不可中断状态实际上是系统对进程和硬件设备的一种保护机制;

6.2 平均负载为多少时合理

  • 理想的状态是每个 CPU 上都刚好运行着一个进程,这样每个CPU都得到了充分利用。
  • 所以在评判平均负载时,首先你要知道系统有几个CPU通过 top 命令获取,或/proc/cpuinfo
  • 示例:假设现在在4、2、1核的 CPU上,如果平均负载为2时,意味着什么;
    。1.在4个CPU的系统上,意味着 CPU 有50%的空闲;
    。2.在2个 CPU的系统上,意味着所有的 CPU都刚好被完全占用;
    。 3.而1个 CPU 的系统上,则意味着有一半的进程竞争不到CPU
  • 平均负载有三个数值,我们应该关注哪个呢?
  • 实际上,平均负载中的三个指标我们其实都需要关注。(就好比一天的天气要结合起来看;)
  • 1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳;
  • 1分钟的值小于15分钟的值,说明系统最近1分钟的负载在减少,而过去 15 分钟内却有很大的负载;
  • 如果 1 分钟的值远大于 15 分钟的值,就说明最近 1分钟的负载在增加,这种增加有可能只是临时性的,也有可能还会持续上升,所以就需要持续观察。
  • 一旦 1 分钟的平均负载接近或超过了 CPU 的个数,就意味着系统正在发生过载的问题,这时就得分析问题,并要想办法优化了;
  • 例:假设我们在有2个 CPU 系统上看到平均负载为 2.73,6.90,12.98
    。那么说明在过去1分钟内,系统有 136% 的超载
    (2.73/2=136%)
    。而在过去5分钟内,有345%的超载
    (6.90/2=345%)
    。而在过去15分钟内,有649%的超载
    (12.98/2=649%)
    。但从整体趋势来看,系统的负载是在逐步的降低。

6.3 平均负载与CPU使用率

  • 在实际工作中,我们经常容易把平均负载和 CPU 使用率混淆,所以在这里,我也做一个区分;
    -既然平均负载代表的是活跃进程数,那平均负载高了,不就意味着 CPU 使用率高吗?
  • 我们回到平均负载的含义上来,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数;
  • 所以,它不仅包括了正在使用CPU的进程,还包括等待CPU和等待I/O的进程;
  • 而CPU使用率,是单位时间内CPU繁忙情况的统计,跟平均负载并不一定完全对应。比如:
    1)CPU密集型进程,使用大量CPU计算会导致平均负载升高,此时这两者是一致的;
    2)I/O密集型进程,等待I/O也会导致平均负载升
    高,但CPU使用率不一定很高;
    3)大量的CPU进程调度也会导致平均负载升高,此时的CPU使用率也会比较高;

6.5 平均负载案例分析实战

  • 演示这三种常场景,并用stress、mpstat、 pidstat等工具,找出平均负载升高的根源;
  • stressLinux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景;
  • mpstat是多核CPU性能分析工具,用来实时查看每个CPU的性能指标,及所有CPU的平均指标;
  • pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、Mem、I/O等性能指标;
[root@localhost ~]# yum install stress sysstart -y
#如果出现无法使用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.rp

6.5.1 场景1-CPU密集型进程

1、第一个终端运行stress命令,模拟出一个cpu使用率100%的场景:

[root@localhost ~]# stress --cpu 1 --timeout 600

2、第二个终端运行uptime查看平均负载的变化情况

[root@localhost ~]# watch -d uptime
#使用watch -d 参数表示高亮显示变化的区域(注意负载 会持续升高)

在这里插入图片描述

3、在第三个终端运行mpstat查看cpu使用率的变化情况

#-P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据
Linux 3.10.0-1160.31.1.el7.x86_64 (localhost.localdomain) 	2021年07月28日 	_x86_64_	(1 CPU)

20时28分28秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
20时28分33秒  all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
20时28分33秒    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.0
#单核CPU只有一个all和0

4、从终端二中可以看到,1分钟的平均负载会慢慢增加到1.00,而从终端三中还可以看到,正好有一个 CPU的使用率为 100%,但它的iowait0。这说明,平均负载的升高正是由于 CPU使用率为100%。那么,到底是哪个进程导致了 CPU使用率为 100%呢?可以使用pidstat 来查询

#间隔5秒后输出一组数据
[root@localhost ~]# pidstat -u 5 1

Linux 3.10.0-1160.31.1.el7.x86_64 (localhost.localdomain) 	2021年07月28日 	_x86_64_	(1 CPU)

20时34分22秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
20时34分27秒     0      1041    0.20    0.00    0.00    0.20     0  tuned
20时34分27秒     0      1990    0.00    0.20    0.00    0.20     0  kworker/0:0
20时34分27秒     0      2536   99.60    0.00    0.00   99.60     0  stress
20时34分27秒     0      2572    0.00    0.20    0.00    0.20     0  watch
#从这里可以很明显看到,stress进程的CPU使用率为100%
#PID:进程ID
#%usr:进程在用户空间占用cpu的百分比
#%system:进程在内核空间占用cpu的百分比
#%guest:进程在虚拟机占用cpu的百分比
#%CPU:进程占用cpu的百分比
#CPU:处理进程的cpu编号
#Command:当前进程对应的命令

6.5.2 场景2- I/O密集型进程

1、在第一个终端运行stress命令,但这次模拟I/O压力,即不停执行sync

[root@localhost ~]# stress --io 1 --timeout 600s

2、在第二个终端运行uptime查看平均负载的变化情况;

[root@localhost ~]# watch -d uptime

在这里插入图片描述
3、最后第三个终端运行mpstsst查看cpu使用率的变化情况;

#查看所有CPU的指标,并且间隔5秒输入一组数据
[root@localhost ~]# mpstat -P ALL 5
Linux 3.10.0-1160.31.1.el7.x86_64 (localhost.localdomain) 	2021年07月28日 	_x86_64_	(1 CPU)

20时44分19秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
20时44分24秒  all    3.58    0.00   96.42    0.00    0.00    0.00    0.00    0.00    0.00    0.00
20时44分24秒    0    3.58    0.00   96.42    0.00    0.00    0.00    0.00    0.00    0.0
#会发现cpu的与内核打交道的sys占用非常高

4、导致iowait高,我们需要用pidstat来查询

[root@localhost ~]# pidstat -u 5 1
Linux 3.10.0-1160.31.1.el7.x86_64 (localhost.localdomain) 	2021年07月28日 	_x86_64_	(1 CPU)

20时48分11秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
20时48分16秒     0       769    0.20    0.00    0.00    0.20     0  vmtoolsd
20时48分16秒     0      1332    0.00   15.03    0.00   15.03     0  kworker/u256:0
20时48分16秒     0      2924    4.21   80.36    0.00   84.57     0  stress
20时48分16秒     0      2925    0.00    0.20    0.00    0.20     0  kworker/u256:2
20时48分16秒     0      2984    0.00    0.20    0.00    0.20     0  pidstat
#可以发现,还是stress进程造成的

6.5.3 场景3-大量的进程

1、在第一个终端使用stress,但这次模拟的是 4个进程

[root@localhost ~]# stress -c 4 --timeout 600

2、由于系统只要有1个cpu,明显比4个进程要少很多,因而,系统的cpu处于严重过载状态*

[root@localhost ~]# watch -d uptime

3、最后通过 pidstat 查询进程的情况:可以看出 4个进程在争抢1个 CPU 每个进程等待 CPU 的时间(也就是代码块中的 %wait列)高达 75%。这些超出 CPU 计算能力的进程,最终导致 CPU 过载。

#间隔5秒后输出一组数据
[root@localhost ~]# pidstat -u 5 1
Linux 3.10.0-1160.31.1.el7.x86_64 (localhost.localdomain) 	2021年07月28日 	_x86_64_	(1 CPU)

20时58分39秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
20时58分44秒     0      2994   24.90    0.00    0.00   24.90     0  stress
20时58分44秒     0      2995   24.70    0.00    0.00   24.70     0  stress
20时58分44秒     0      2996   24.90    0.00    0.00   24.90     0  stress
20时58分44秒     0      2997   24.70    0.00    0.00   24.70     0  stress
20时58分44秒     0      2998    0.00    0.20    0.00    0.20     0  watch

6.5.4 总结

  • 分析完这三个案例,我再来归纳一下平均负载与CPU
  • 平均负载提供了一个快速查看系统整体性能的手段,
    反映了整体的负载情况。但只看平均负载本身,我们
    并不能直接发现,到底是哪里出现了瓶颈。所以,在
    理解平均负载时,也要注意:
  • 平均负载高有可能是 CPU 密集型进程导致的;
  • 平均负载高并不一定代表 CPU 使用率高,还有可能
    是 I/O 更繁忙了;
  • 当发现负载高的时候,你可以使用 mpstat、pidstat
    等工具,辅助分析负载的来源
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值