进程管理

进程管理

进程概述

什么是进程

  • 一个正在运行的程序

程序和进程的区别

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

进程的生命周期

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

什么是僵尸进程

  • 子进程比父进程先结束,父进程没有及时回收子进程占用的资源
  • 此时的子进程就称为”僵尸进程”

产生僵尸进程的原因

  • 子进程比父进程先结束
  • 父进程没有回收子进程的资源
  • 子进程在结束时,父进程繁忙来不及wait子进程
  • 则会导致,子进程变成僵尸进程

什么是孤儿进程

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

产生孤儿进程的原因

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

监控进程的状态

进程状态管理命令-ps

# 命令:
ps
# 用法:
ps [选项] [参数]

# 选项:
a:查看所有与终端相关的进程,由终端发起的进程
u:显示进程的管理用户
x:查看所有与终端无关的进程
o:自定义显示字段
f:查看子进程和父进程的关系

## 常用选项组合
ps -ef
ps aux

## 示例:
[root@localhost~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          3  0.0  0.0      0     0 ?        S    May02   0:06 [ksoftirqd/0]
root          2  0.0  0.0      0     0 ?        S    May02   0:00 [kthreadd]

[root@localhost~]# ps aux|grep [n]ginx
root      26531  0.0  0.1  46036  1984 ?        Ss   May03   0:00 nginx: master process nginx -c /opt/nginx/conf/nginx.conf
nobody    26542  0.0  0.2  46464  2152 ?        S    May03   0:00 nginx: worker process


USER:该进程的管理用户
PID:进程号
%CPU:该进程占用CPU的百分比
%MEM:该进程占用内存的百分比
VSZ:该进程占用虚拟内存的大小
RSS:该进程占用物理内存的大小
TTY:
?:由内核发起的进程
tty:机器上的终端进程
pts/N:远程连接工具的终端进程
STAT:进程运行的状态
D:无法中断的休眠状态(通IO的进程)*****
R:正在运行的状态 *****
S:处于休眠状态的进程 *****
T:暂停或者被追踪的状态
W:进入交换内存的进程(swap,centos7见不到)
X:死掉的进程(少见)
Z:僵尸进程 *****
<:优先级高的进程
N:优先级低的进程
L:有些数据页被锁进内存的进程
s:父进程,在它下面有子进程
l:以线程的方式运行
|:存在多进程的进程
+:在前台运行 *****
START:进程开启的时间
TIME:该进程占用CPU的时间
COMMAND:进程的名字或者进程的命令
[]:内核态进程
没[]:用户态进程
# 如果后台有被暂停的进程
[root@localhost~]# vim 777.txt &
& 或者 ctrl+z 挂起到后台并暂停

## 查看所有被暂停的进程

[root@localhost~]# jobs
[1]-  Stopped                 vim 777.txt
[2]+  Stopped                 ping www.sina.com

[root@localhost~]# ps aux | grep ping
root      28699  0.0  0.2 150092  2008 pts/0    T    18:57   0:00 ping www.sina.com

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

[root@localhost~]# jobs
[1]-  Stopped                 vim 777.txt
[2]+  Stopped                 ping www.sina.com
[root@localhost~]# fg 1
vim 777.txt

  1 www.sina.com
  2 www.baidu.com
  3 123456


# ps命令的用法:
## 1.根据%CPU进行排序
[root@localhost~]# ps aux|sort -k 3
[root@localhost~]# ps aux --sort %cpu


[root@localhost~]# ps aux --sort %cpu
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 125460  3872 ?        Ss   May02   0:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    May02   0:00 [kthreadd]

[root@localhost~]# ps aux --sort %mem| tail -1
root       6913  0.0  1.9 573816 19136 ?        Ssl  May02   0:43 /usr/bin/python2 -Es /usr/sbin/tuned -l -P



## 2.自定义显示字段
o:自定义显示字段
[root@localhost~]# ps axo pid,%cpu,command,user
   PID %CPU COMMAND                     USER
     1  0.0 /usr/lib/systemd/systemd -- root
     2  0.0 [kthreadd]                  root



## 3.显示子进程
f:查看子进程和父进程的关系
[root@localhost~]# ps auxf|grep [n]ginx
root      26531  0.0  0.1  46036  1984 ?        Ss   May03   0:00 nginx: master process nginx -c /opt/nginx/conf/nginx.conf
nobody    26542  0.0  0.2  46464  2152 ?        S    May03   0:00  \_ nginx: worker process


查看指定进程的pid命令- pgrep

# 查看指定进程的pid
# 命令:
  pgrep

1)
[root@localhost~]# pgrep nginx
26531
26542

2)
[root@localhost~]# ps aux | grep [n]ginx
root      26531  0.0  0.1  46036  1984 ?        Ss   May03   0:00 nginx: master process nginx -c /opt/nginx/conf/nginx.conf
nobody    26542  0.0  0.2  46464  2152 ?        S    May03   0:00 nginx: worker process

##  pgrep选项:
-l:显示该进程的启动命令
-a:显示该进程的完整描述信息

[root@localhost~]# pgrep -l nginx
26531 nginx
26542 nginx
[root@localhost~]# pgrep -a nginx
26531 nginx: master process nginx -c /opt/nginx/conf/nginx.conf
26542 nginx: worker process   

横排查看进程pid- pidof

# 横排查看进程pid
## pidof

### 示例:
[root@localhost~]# pidof nginx
26542 26531
[root@localhost~]# pgrep nginx
26531
26542

[root@localhost~]# pidof nginx|nargs kill

进程管理命令-top

# 命令:
top

[root@localhost~]# top
top - 16:06:27 up  5:23,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:  98 total,   1 running,  97 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   995896 total,   722832 free,   135988 used,   137076 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   703952 avail Mem 
                                                                                  

## 第一行:系统相关
top - 16:06:27 up  5:23,  2 users,  load average: 0.00, 0.01, 0.05

top:命令
16:06:27:当前系统时间
up  5:23,:该服务器,运行的时间
2 users,:当前登录的用户数量
load average: 0.00, 0.01, 0.05:系统的平均负载(数据可以看出平均负载时越来越小)
0.01:1分钟
0.02:5分钟
0.05:15分钟


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

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


## 第三行:CPU百分比
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 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 :   995896 total,   722832 free,   135988 used,   137076 buff/cache

995896 total:总内存数
722832 free:空闲内存数
135988 used:已使用的内存数
137076 buff/cache:buffer缓冲区/缓存区(缓冲区缓存区大小就是系统可用内存)


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

1048572 total:总共的虚拟内存数
1048572 free:空闲的虚拟内存数
0 used:已使用的虚拟内存数
703952 avail Mem:可用的虚拟内存数

什么是中断

  • 中断是系统用来影响硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来影响设备的请求。
  • PS:中断是一个异步的事件处理机制,可以提高操作系统处理并发的能力。

中断带来的问题

  • 由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中弄断处理程序就需要尽可能快的运行,如果中弄断本身要做的事情不多,那么处理起来也不会有太大的问题,但是如果中断要处理的事情很多,中断服务程序就有可能要运行很长时间。
  • 特别是,中断处理程序在影响中断时,还会临时关闭中断,这就会导致上一次中断处理完成之前,其他中断不能响应,也就是说中断有可能会丢失。

系统的软中断

  • 为了解决中断处理程序执行过长的和丢失中断的问题,Linux将中断处理过程分成了两个阶段:
    第一阶段:用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关工作
    第二阶段:用来延迟处理第一阶段未完成的工作,通常以内核线程的方式运行。

中断生产实例

  • 当网卡在接收数据包的时候,会通过硬中断的方式通知内核,有新数据到了。这时,内核就应该调用中断处理程序来影响它。对第一阶段来说,既然是快速处理,其实就是把网卡接收到的数据包,先放置内存当中,然后更新一下硬件寄存器的状态(表示数据已经读好了),而第二阶段,被软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理,直到把它发送给应用程序。
  • 言简意赅:
    第一阶段:直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行。
    第二阶段:由内核触发该请求,也就是我们常说的软中断,特点是延迟执行。

Linux软中断与硬中断小结:

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

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

3.企业中,会经常听说一个问题,就是大量的网络小包会导致性能问题,为啥呢?
因为大量的网络小包会导致频繁的硬中断和软中断,所以大量的网络小包传输速度很慢,但如果将所有的网络小包"打包","压缩"一次性传输,会快很多。

top命令用法

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



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~]# 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   信号别名   进程PID

### 示例:以数字信号2演示
1) 第一台终端
[lx15@localhost~]# ping www.sina.com
PING ww1.sinaimg.cn.w.alikunlun.com (101.226.27.229) 56(84) bytes of data.
64 bytes from 101.226.27.229 (101.226.27.229): icmp_seq=1 ttl=128 time=9.56 ms
64 bytes from 101.226.27.229 (101.226.27.229): icmp_seq=2 ttl=128 time=12.4 ms
64 bytes from 101.226.27.229 (101.226.27.229): icmp_seq=3 ttl=128 time=12.2 ms

2)第二台终端操作
[root@localhost~]# ps a | grep ping
  7544 pts/1    S+     0:00 ping www.sina.com
[root@localhost~]# kill -2 7544

3)再次查看第一台终端,进程被中断,和ctrl + c 的作用一样
64 bytes from 101.226.27.229 (101.226.27.229): icmp_seq=74 ttl=128 time=10.1 ms
64 bytes from 101.226.27.229 (101.226.27.229): icmp_seq=75 ttl=128 time=10.6 ms
64 bytes from 101.226.27.229 (101.226.27.229): icmp_seq=76 ttl=128 time=10.2 ms

--- ww1.sinaimg.cn.w.alikunlun.com ping statistics ---
76 packets transmitted, 76 received, 0% packet loss, time 75152ms
rtt min/avg/max/mdev = 8.140/13.370/47.864/6.242 ms

# 杀掉所有进程的命令

## 1. 
killall:杀掉所有进程,不用指定pid
pkill: 杀掉所有进程,不用指定pid

## 2.使用pkill踢出从远程登录到本机的用户, pkill  类似killall
[root@localhost~]# w
 18:22:21 up  7:39,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.1         17:29    5.00s  0.09s  0.00s w
lx15     pts/1    10.0.0.1         17:57   18:29   0.04s  0.04s -bash

### 终止 pts/1上所有进程, 除了bash本身
#### 选项:-t 指定终端
[root@localhost~]# pkill -t pts/1
### 终止 pts/1上所有进程, 并且bash也结束(用户被强制退出)
[root@localhost~]# pkill -9 -t pts/1

进程的优先级

什么是优先级

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

优先级的定义和配置

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

进程优先级相关命令:

  • 指定优先级执行命令

    nice -n 优先级值19 命令vim 777

# 示例:
## 查看这里vim的优先级是0
[root@localhost~]# ps axo pid,user,nice,command|grep vim
  8006 lx15       0 vim 777

## 指定vim的优先级为19
[root@localhost~]# nice -n 19 vim 777

[lx15@localhost~]# ps axo pid,user,nice,command|grep vim
  8011 root      19 vim 777

## 此时的vim这个命令的优先级已经被设置为最低,就是设置vim这个命令以19的优先级运行
  • 重置,已经在运行的程序,优先级

    renice -n -优先级值20 已运行程序的pid6676

# 重置
renice

## 查看sshd服务的优先级,此时优先级值为0
[root@localhost~]# ps axo pid,user,nice,command|grep ssh
  6938 root       0 /usr/sbin/sshd -D
  
## 重新设置sshd服务的优先级为-20,
[root@localhost~]# renice -n -20 6938
6938 (process ID) old priority 0, new priority -20

## 再次查看sshd的优先级,此时优先级已经为最高
[root@localhost~]# ps axo pid,user,nice,command|grep ssh
  6938 root     -20 /usr/sbin/sshd -D

为什么要把进程放到后台运行

  • 企业中很多时候会有一些需求:
    1.传输大文件,由于网络问题需要传输很久
    2.我们之前的国外业务,国内到国外,网速很慢,我们需要选择节点做跳板机,那么就必须知道,哪个节点到其他地区网速最快,丢包率最低。
    3.有些服务没有启动脚本,那么我们就需要手动运行,并把他们放到后台

后台进程管理命令

  • 1.在执行的命令后面加 & 会直接将该命令放在后台执行

    [root@localhost~]# ping www.sina.com &
    
  • 2.Ctrl + z 会直接将该正在执行的命令放在后台暂停,配合jobs 和 bg将暂停的进程,在后台恢复运行

    [lx15@localhost~]# ping www.sina.com
    PING ww1.sinaimg.cn.w.alikunlun.com (101.226.27.226) 56(84) bytes of data.
    64 bytes from 101.226.27.226 (101.226.27.226): icmp_seq=1 ttl=128 time=11.4 ms
    64 bytes from 101.226.27.226 (101.226.27.226): icmp_seq=2 ttl=128 time=11.4 ms
    ^Z
    [1]+  Stopped                 ping www.sina.com
    
    
    [lx15@localhost~]# jobs
    [1]+  Stopped                 ping www.sina.com
    
    ## bg将暂停的进程,在后台恢复运行
    [lx15@localhost~]# bg
    [1]+ ping www.sina.com &
    
    
  • 3.将执行的命令放入后台执行,并且将输出结果保存到 nohup.out文件中

    • nohup.out文件会放在当前所在目录下
    • nohup ping www.sina.com &
    [lx15@localhost~]# nohup ping www.sina.com &
    [2] 8098
    [lx15@localhost~]# nohup: ignoring input and appending output to ‘nohup.out’
                       nohuo: 忽略输入的同时把输出追加到nohup.out的文件中
    
  • 4.将进程放入后台(开启一个子shell)

    • screen
    • yum install -y screen
    -ls:查看所有screen的后台进程,就是所有的子shell
    -r:指定后台进程号,进入该后台进程的子shell
    -S:指定后台进程(子shell)的名字
    Ctrl + a 再按d:放在后台执行
    -X -S 26542 quit :在主会话中关闭子shell
    
    
    ## 示例:
    [root@localhost~]# screen -S ping_baidu
    [detached from 8152.ping_baidu]
    
    [root@localhost~]# screen -ls
    There are screens on:
    	8198.ping_sina	(Attached)
    	8166.ping_baidu	(Attached)
    	8152.ping_baidu	(Detached)
    3 Sockets in /var/run/screen/S-root.
    
    [root@localhost~]# screen -r 8152
    [detached from 8152.ping_baidu]
    
    [root@localhost~]# screen -X -S 8198 quit
    [root@localhost~]# screen -ls
    There are screens on:
    	8166.ping_baidu	(Attached)
    	8152.ping_baidu	(Detached)
    2 Sockets in /var/run/screen/S-root.
    
    

平均负载

什么是平均负载

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

    • 可运行状态进程,是指正在使用CPU或者正在等待CPU的进程,也就是我们用PS命令看的处于R状态的进程
    • 不可中断进程,系统中最常见的是等待硬件设备的IO相应,也就是我们PS命令中看到的D状态(也成为Disk Sleep)的进程。例如:当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,他是不能被其他进程或者中断程序打断的,这个是后续的进程就处于不可中断的状态,
    • 不可中断状态实际上是系统对进程和硬件设备的一种保护机制
  • 平均负载与CPU使用率并没有直接关系

平均负载多少合理?

  • 最理想的状态是每个CPU上都刚还运行着一个进程,这样每个CPU都得到了充分利用。所以在评判负载时,首先你要知道系统有几个CPU

如何查看cpu的个数

# /proc/cpuinfo

# top 按 1

# 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%)
但整体趋势来看,系统负载是在逐步降低。



假设现在在4,2,1核的CPU上,如果平均负载为2时,意味着什么呢?
1.在4个CPU的系统上,意味着CPU有50%空闲。
2.在2个CPU的系统上,以为这所有的CPU都刚好完全被占用。
3.在1个CPU的系统上,则意味着有一半的进程竞争不到CPU。


1.如果1分钟,5分钟,15分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。
2.如果1分钟的值远小于15分钟的值,就说明系统像最近1分钟的负载在减少,而过去15分钟内却有很大的负载。
3.反过来,如果1分钟的大于15分钟,就说明最近1分钟的负载在增加,这种增加有可能只是临时的,也有可能还会持续上升...所以要持续观察。
4.一旦1分钟的平均负载接近或超过了CPU的个数,就意味着,系统正在发生过载的问题,这时候就得分析问题了,并且要想办法优化。

CPU类型

  • CPU密集型:计算相关
  • IO密集型:数据库相关服务

企业中平均负载多高需要重点关注

  • 当平均负载高于CPU数量70%的时候,你就应该分析排查负载高的问题了,一旦负载过高,就可能导致进程相应变慢,进而影响服务的正常功能。
    但70%这个数字并不是绝对的,最推荐的方法,还是把系统的平均负载监控起来,然后根据更多的历史数据,判断负载的变化趋势,当发现负载有明显升高的趋势时,比如说负载翻倍了,你再去做分析和调查。

企业级负载分析实战

  • 问题
领导:某一台服务器,很卡,怎么办?
卡的原因:服务器,负载太高
如何定位,什么程序,导致负载高?
如何定位,负载高,是哪个硬件引起的?
  • stress是Linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景
# 安装:
[root@localhost ~]# yum install -y stress
  • 分析负载
    • mpstat是多核CPU性能分析工具,用来实时检查每个CPU的性能指标,以及所有CPU的平均指标
    • pidstat是一个常用的进程性能分析工具,用来实时查看进程的CPU,内存,IO,以及上下文切换等性能指标
## 启动了4个cpu密集型的进程,4个占用CPU的进程
[root@localhost ~]# stress --cpu 4 --timeout 600
[root@localhost ~]# stress --io 100 --timeout 600
[root@localhost ~]# stress -c 100 --timeout 600

## 查看所有的CPU,5s显示一次数据,下面可以看出,是用户态的进程导致CPU过高
[root@localhost ~]# mpstat -P ALL 5

Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 05/06/2022 _x86_64_ (4 CPU)
07:56:14 PM  CPU  %usr  %nice  %sys  %iowait  %irq  %soft  %steal %guest %gnice %idle
07:56:19 PM  all  99.95  0.00  0.05   0.00    0.00  0.00   0.00    0.00   0.00  0.00
07:56:19 PM  0   100.00  0.00  0.00   0.00    0.00  0.00   0.00    0.00   0.00  0.00 
07:56:19 PM  1   100.00  0.00  0.00   0.00    0.00  0.00   0.00    0.00   0.00  0.00 
07:56:19 PM  2   100.00  0.00  0.00   0.00    0.00  0.00   0.00    0.00   0.00  0.00 
07:56:19 PM  3   100.00  0.00  0.00   0.00    0.00  0.00   0.00    0.00   0.00  0.00


## -u指定5s输出一次数据      2,表示总共输出2组数据
[root@localhost ~]# pidstat -u 5 2





## 导致负载升高的三种情况情况
### IO:磁盘IO导致负载升高(磁盘的高使用率压力测试)
[root@localhost ~]# stress --io 100 --timeout 600
### CPU: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.查到了是某个进程后
- 运维
执行了某条命令?
启动了某个服务?
- 开发
查看开发写好的程序日志,导出日志,交给开发

企业案例,Linux假死是怎么回事

  • 所谓假死,就是能ping通,但是ssh不上去;任何其他操作也都没反应,包括上面部署的nginx也打不开页面

  • 假死其实很难出现一次

系统假死为何能ping通却无法连接

  • 此时机器可以ping通,但是无法ssh上去。这是由于ping是在系统底层处理的,没有参与进程调度;sshd要参与进程调度,但是优先级没oom killer高,总得不到调度。

出现假死怎么办

  • 建议使用nice将sshd的进程优先级调高。这样当系统内存吃紧,还能勉强登陆sshd,进入调试。然后分析故障

思维导图

posted @ 2022-05-04 21:10  悠悠哉55  阅读(98)  评论(0)    收藏  举报