进程管理

进程概述

什么是进程
进程就是一个正在运行的程序

程序与进程的区别

  • 程序是静态概念,是一组代码和数据的集合,可以长期存放在系统中
  • 进程是动态概念,一个正在运行的程序,具有生命周期,无法长期存放在系统中

进程的生命周期
接收任务-frok子进程-子进程处理任务-父进程等待

1.用户发起请求
2.父进程会fork出子进程,子进程会继承父进程大部分的属性,如:文件描述符等,处理任务
3.子进程在处理任务的过程中,父进程是一个wait状态,等待子进程
   -正常结束
   -非正常结束时产生↓
       - 僵尸进程 :子进程先结束  父进程没有及时回收子进程的占用资源  此时的子进程就称为”僵尸进程”
       - 孤儿进程 :父进程先结束  子进程还在执行任务  没有父进程的管理  此时的子进程就称为”孤儿进程”

僵尸进程产生的原因

子进程的结束和父进程的运行是异步的
父进程永远不知道子进程什么时候结束
子进程在结束时,父进程繁忙来不及wait子进程
则会导致,子进程变成僵尸进程

img

孤儿进程产生的原因

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

img

同步和异步

  • 同步是 数据传输是同时完成的 子进程完成任务时直接被父进程接收
  • 异步是 子进程完成任务后等待随时父进程的接收 父进程可以随意时间接收

监控进程的状态

进程状态管理命令-ps

ps [选项] [参数]

## 常用选项组合
ps -ef :查看所有进程和进程的信息

[root@web03 ~]# systemctl start nginx
[root@web03 ~]# ps -ef | grep nginx
root      11986      1  0 17:18 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     11988  11986  0 17:18 ?        00:00:00 nginx: worker process
root      11990  11889  0 17:18 pts/0    00:00:00 grep --color=auto nginx
# 只看nginx 不看grep命令进程的的方法
[root@web03 ~]# ps -ef | grep [n]ginx
root      11986      1  0 17:18 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     11988  11986  0 17:18 ?        00:00:00 nginx: worker process
## 原因:grep命令的程序在进程当中就是 grep --color=auto nginx 
## grep 识别[] 对grep来说[n]ginx就是nginx grep --color=auto [n]ginx 等于 grep --color=auto nginx
## ps 不识别[] 对ps 来说[n]ginx就是[n]ginx grep --color=auto [n]ginx 不等于 grep --color=auto nginx

ps aux :查看所有进程和进程的信息
a:查看所有与终端相关的进程,由终端发起的进程
[root@web03 ~]# ps -a 
   PID TTY          TIME CMD
 11998 pts/0    00:00:00 ps

u:显示进程的管理用户
[root@web03 ~]# ps -u 
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        556  0.0  0.0 110208   864 tty1     Ss+  14:06   0:00 /sbin/agetty --noclear tty1 linux
root      11889  0.0  0.2 115944  2472 pts/0    Ss   17:15   0:00 -bash
root      11999  0.0  0.1 155452  1872 pts/0    R+   17:21   0:00 ps -u

x:查看所有与终端无关的进程
[root@web03 ~]# ps -x
   PID TTY      STAT   TIME COMMAND
     1 ?        Ss     0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
     2 ?        S      0:00 [kthreadd]
     4 ?        S<     0:00 [kworker/0:0H]
     5 ?        S      0:00 [kworker/u256:0]
......

o:自定义显示字段
[root@web03 ~]# ps -o user   # 后面接什么信息就出什么信息的数据
USER
root
root

f:查看父进程和子进程的关系
[root@web03 ~]# ps -auxf | grep nginx
root      12010  0.0  0.0 112812   980 pts/0    S+   17:26   0:00          \_ grep --color=auto nginx
root      11986  0.0  0.0  39308   940 ?        Ss   17:18   0:00 nginx: master process /usr/sbin/nginx
nginx     11988  0.0  0.1  39696  1564 ?        S    17:18   0:00  \_ nginx: worker process

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

## 查看pid
pgrep
pidof
[root@web03 ~]# pgrep nginx
11986
11988

[root@web03 ~]# pidof nginx
11988 11986

-a:显示该进程的完整描述信息
[root@web03 ~]# pgrep -a nginx
11986 nginx: master process /usr/sbin/nginx
11988 nginx: worker process

-l:显示该进程的启动命令
[root@web03 ~]# pgrep -l nginx
11986 nginx
11988 nginx

## 查看父进程子进程树
安装pstre命令:
[root@web03 ~]# yum install -y psmisc
[root@web03 ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─agetty
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon
        ├─master─┬─pickup
        │        └─qmgr
        ├─nginx───nginx
        ├─polkitd───6*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───2*[{vmtoolsd}]

### 进程各项代表的意思
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

USER:该进程的管理用户

PID:进程号

%CPU:该进程占用CPU的百分比

%MEM:该进程占用内存的百分比

VSZ:该进程占用虚拟内存的大小

RSS:该进程占用物理内存的大小

TTY:
    ?:由内核发起的进程
    tty:机器上的终端进程
    pts/N:远程连接工具的终端进程

STAT:进程运行的状态
    ** D:无法中断的休眠状态 (通IO的进程)
    ** R:正在运行的状态
    ** S:处于休眠状态的进程  (父进程在休眠状态在等待子进程完成任务)
    ** +:在前台运行         (例如显示在终端上 你那看见的都是前台运行)
    ** Z:僵尸进程
   (以上为重点↑  需要记)
    T:暂停或者被追踪的状态
    W:进入交换内存的进程    (swap,centos7见不到)
    X:死掉的进程            (少见)
    <:优先级高的进程
    N:优先级低的进程
    L:有些数据页被锁进内存的进程
    s:父进程,在它下面有子进程(例如终端就是Ss+父进程 所有输入命令就是子进程 不输入命令状态是休眠状态)
    l:以线程的方式运行
    |:存在多进程的进程

START:进程开启的时间

TIME:该进程占用CPU的时间

COMMAND:进程的名字或者进程的命令
    []:内核态进程
    没[]:用户态进程

# 关闭运行的进程的方法
方法1.
ps -ef|grep 进程名  # 找出进程的进程号
kill 进程号

方法2.
pgrep 进程名|xargs kill

进程管理命令-top

[root@web03 ~]# top
top - 17:43:02 up  3:37,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  96 total,   1 running,  95 sleeping,   0 stopped,   0 zombie
%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
KiB Mem :   995676 total,   440204 free,   137576 used,   417896 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   708044 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                 
 12077 root      20   0  161972   2192   1560 R  0.3  0.2   0:00.04 top                                     
     1 root      20   0  125492   3944   2628 S  0.0  0.4   0:00.97 systemd                                 
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd                                
     4 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H                            
     5 root      20   0       0      0      0 S  0.0  0.0   0:00.24 kworker/u256:0                          
     6 root      20   0       0      0      0 S  0.0  0.0   0:00.32 ksoftirqd/0                             
     7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0                             
     8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh                                  
     9 root      20   0       0      0      0 S  0.0  0.0   0:00.26 rcu_sched                               
    10 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 lru-add-drain                           
    11 root      rt   0       0      0      0 S  0.0  0.0   0:00.05 watchdog/0                              
    13 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs                               
    14 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 netns                                   
    15 root      20   0       0      0      0 S  0.0  0.0   0:00.00 khungtaskd                              
    16 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 writeback                               
    17 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kintegrityd                             
    18 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 bioset                                  
    19 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 bioset                                  
    20 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 bioset                                  
    21 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kblockd                                 
    22 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 md 

## 第一行:统相关
top - 17:43:02 up  3:37,  1 user,  load average: 0.00, 0.01, 0.05

top : 命令
17:43:02:当前系统时间
up  3:37:该服务器运行时间
1 user:当前登陆的用户数量
load average: 0.00, 0.01, 0.05 : 系统的平均负载
0.00:系统运行从当前时间往回推1分钟的负载
0.01:系统运行从当前时间往回推5分钟的负载
0.05:系统运行从当前时间往回推15分钟的负载

## 第二行:行状态
Tasks:  96 total,   1 running,  95 sleeping,   0 stopped,   0 zombie

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

## 第三行:PU百分比
%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:等待状态的进程占用cpu的百分  S状态
0.0 hi:硬中断占用cpu的百分比
0.0 si:软中断占用cpu的百分比
0.0 st:  st:虚拟化技术占用cpu的百分比

## 第四行:      物理内存       # 空闲内存       #已使用内存       # 缓冲区内存
KiB Mem :   995676 total,   440204 free,   137576 used,   417896 buff/cache

KiB:大小单位
995676 total:总内存数
440204 free:空闲内存数
137576 used:已使用的内存数
417896 buff/cache:  buffer缓冲区/cache缓存区  # 剩余实际可用内存是free + buff/cache
# 当打开一个文件时 文件的数据会在内存中开辟一个buffer缓冲区 并把你文件的数据加载到缓冲区
# 当编辑修改这个文件时 内存中会开辟一个cache缓存区 将你修改的内容放到缓存区 
# 最后当你保存时 才会将你编辑修改后的文件内容从缓存区写入文件 保存在硬盘上

## 第五行:wap虚拟内存
KiB Swap:  1048572 total,  1048572 free,        0 used.   708044 avail Mem 
KiB:大小单位
1048572 total:总共的虚拟内存数
1048572 free:空闲的虚拟内存数
0 used:已使用的虚拟内存数
708044 avail Mem:可用的虚拟内存数

## 第六行:
PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND 

PID:进程pid号
USER:进程的用户
PR:进程优先级
NI:nice值,正常为0,负值表示高优先级,正值表示低优先级
VIRT:虚拟内存占用空间
RES:真实内存占用空间
SHR:共享内存占用空间  # 几个进程共同占用的内容空间就是共享内存
S:进程的状态
%CPU:占用的cpu百分比
%MEM:内存占用的百分比
TIME+:运行时间
COMMAND:进程的运行命令

## 查看内存的命令
free
[root@web03 ~]# free
              total        used        free      shared  buff/cache   available
Mem:         995676      137424      440276        7828      417976      708160
Swap:       1048572           0     1048572
##实际可用内存
[root@web03 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            972         134         429           7         408         691
Swap:          1023           0        1023

top命令选项,用法

top
-d:指定更新的时间(默认是3s更新一次)
[root@web03 ~]# top -d 1

-p:只查看指定pid的进程
[root@web03 ~]# top -p 进程pid

-u:指定相关用户
[root@web03 ~]# top -u root

-b:将top内容保存到文件中
-n:指定次数
[root@web03 ~]# top -b -n 1 > /opt/hg.txt
# 将进程的信息写入文件保存下来 不能直接保存 因为内是动态的 还得指定次数 保存的时间跟刷新时间有关
[root@web03 ~]# cat /opt/hg.txt 
top - 18:07:51 up  4:01,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  96 total,   1 running,  95 sleeping,   0 stopped,   0 zombie
%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
KiB Mem :   995676 total,   439900 free,   137796 used,   417980 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   707788 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
     1 root      20   0  125492   3944   2628 S  0.0  0.4   0:00.99 systemd
......

top 常见终端指令
h    查看帮出内容
z    高亮显示
1    显示所有CPU的负载
s    设置刷新时间
b    高亮现实处于R状态的进程
M    按内存使用百分比排序输出
P    按CPU使用百分比排序输出
R    对排序进行反转
f    自定义显示字段  空格选择需要的字段
k    kill掉指定PID进程
W    保存top环境设置  文件在 ~/.toprc
q    退出

什么是中断

中断是系统用来影响硬件设备请求的一种机制,它会打断进程的正常调度和执行,
然后调用内核中的中断处理程序来影响设备的请求

中断是一个异步的事件处理机制,可以提高操作系统处理并发的能力

由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快的运行,如果中弄断本身要做的事情不多,那么处理起来也不会有太大的问题,但是如果中断要处理的事情很多,中断服务程序就有可能要运行很长时间

特别是,中断处理程序在影响中断时,还会临时关闭中断,这就会导致上一次中断处理完成之前,其他中断都能不能响应,也就是说中断有可能会丢失

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

# 总结
中断是系统的一种机制 会打断进程的正常调度和执行
第一阶段就是软中断 简单解释就是 快速处理
第二阶段就是硬中断 简单解释就是 延迟处理

进程的信号管理kill

[root@web03 ~]# 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语法(加别名时需要大写)
[root@web03 ~]# ps -ef | grep [n]ginx
root      11986      1  0 17:18 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     11988  11986  0 17:18 ?        00:00:00 nginx: worker process
[root@web03 ~]# kill -3 11986
[root@web03 ~]# ps -ef | grep [n]ginx

[root@web03 ~]# kill -QUIT 11986

killall 进程pid :想要杀掉所有进程 就不指定pid
pkill 进程pid :想要杀掉所有进程 就不指定pid

pkill -t pts/0   # -t 选项是删终端进程的选项
pkill -9 -t pts/0 # -t 杀不了的话就 -9 强制删

进程的优先级

什么是优先级

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

优先级的定义和配置

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

##使用top查看优先级
top - 19:01:15 up  4:41,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  96 total,   1 running,  95 sleeping,   0 stopped,   0 zombie
%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
KiB Mem :   995676 total,   440048 free,   137288 used,   418340 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   708304 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                 
   537 root      20   0  272976   4772   3660 S  0.3  0.5   0:12.52 vmtoolsd                                
     1 root      20   0  125492   3944   2628 S  0.0  0.4   0:01.02 systemd                                 
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd     
......

#使用ps查看优先级
[root@zls ~]# ps axo command,nice |grep [s]shd
/usr/sbin/sshd -D             0
sshd: root@pts/0              0
sshd: root@pts/1              0
sshd: root@pts/2              0

#使用nice命令指定进程优先级
[root@web03 ~]# nice -n -1 vim 1.txt
[root@web03 ~]# ps aux |grep [v]im
root      12367  0.1  0.4 149268  4960 pts/0    S<+  19:09   0:00 vim 1.txt
[root@web03 ~]# ps axo command,nice|grep [v]im
vim 1.txt                    -1

## 重置已经在运行的程序的优先级的方法
 renice -n

liunx的假死

什么是假死

所谓假死就是可以ping通 但是ssh连上不去 其他如何操作都没反映 包括之前部署的nginx也打不开页面

假死如何实现

有一个确定可以把系统搞成假死的办法是:主进程分配固定内存,然后不停的fork,并且在子进程里面sleep(100)。
也就是说,当主进程不停fork的时候,很快会把系统的物理内存用完,当物理内存不足时候,系统会开始使用swap;那么当swap不足时会触发oom killer进程;
当oom killer杀掉了子进程,主进程会立刻fork新的子进程,并再次导致内存用完,再次触发oom killer进程,于是进入死循环。而且oom killer是系统底层优先级很高的内核线程,也在参与死循环。

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

是由于ping是在系统底层处理的,没有参与进程调度;sshd要参与进程调度,但是优先级没oom killer高,总得不到调度。

解决方法

将ssh的优先级调到最高 这样当系统内存吃紧 还能勉强登陆sshd 进入调试 然后分析故障

后台进程管理

# 在执行的命令后面加 & 会直接将该命令放在后台执行
[root@web03 ~]# ping baidu.com &
[1] 12472
[root@web03 ~]# PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=128 time=31.4 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=128 time=30.7 ms
......

# ctrl+z 把进程放在后台 并暂停
指令:ctrl+z

# 查看所有被暂停的进程
指令:jobs
[root@web03 ~]# jobs
[1]+  Stopped                 ping baidu.com

# 把暂停的进程运行起来,调到后台运行,后面加数字,就可以运行第几个被暂停的进程(默认是最后一个)
指令:bg
[root@web03 ~]# bg 1
[1]+ ping baidu.com &
[root@web03 ~]# 64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=3 ttl=128 time=31.6 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=4 ttl=128 time=32.0 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=5 ttl=128 time=31.2 ms

# 把后台暂停的进程,调到前台运行,后面加数字,可以将第N个进程调到前台运行(默认是最后一个)
指令:fg
[root@web03 ~]# fg 1
ping baidu.com
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=3 ttl=128 time=31.7 ms

# 将执行的命令放入后台执行,并且将输出结果默认保存到 nohup.out 文件中 
# 如果再也别的命令的输出结果 也还是会被保存到 nohup.out 文件中 但是是追加进去的 不是覆盖
指令:nohup
[root@web03 ~]# nohup ping baidu.com &
[3] 12578
[root@web03 ~]# nohup: ignoring input and appending output to ‘nohup.out’

# 将进程放入后台(开启一个子shell 将你要运行的进程放入这个子shell里去运行)
指令:screen  
安装指令:yum install -y screen
[root@web03 ~]# screen   # 当你输入screen后 会在下面重新开一个子shell

# 在下面这个新的shell 输入你要运行的进程 退出后就会回到原来的shell
[root@web03 ~]# ping baidu.com  # 然后这个程序就会被挂在后台运行
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=128 time=31.8 ms

选项:
-S:指定后台进程的名字
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=31 ttl=128 time=31.4 ms
[root@web03 ~]# ping baidu.com
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=128 time=31.0 ms

-ls:查看所有screen的后台进程
[root@web03 ~]# screen -ls
There are screens on:
    12654.ping  (Detached)
    12617.pts-0.web03   (Detached)
2 Sockets in /var/run/screen/S-root.

-r:指定后台进程号,进入该后台进程
[root@web03 ~]# screen -r 12654
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=4 ttl=128 time=31.2 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=5 ttl=128 time=31.5 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=6 ttl=128 time=31.7 ms

Ctrl + c      : 暂停这个进程 退出这个子shell
Ctrl + a + d  : 将写入的进程放在后台执行 退出这个子shell

# 怎么用screen看ping一个网站的丢包率↓
先用screen ping一个网站 
然后 Ctrl + c 暂停ping
[root@web03 ~]# ping taobao.com
PING taobao.com (59.82.122.115) 56(84) bytes of data.
64 bytes from 59.82.122.115 (59.82.122.115): icmp_seq=1 ttl=128 time=33.5 ms
64 bytes from 59.82.122.115 (59.82.122.115): icmp_seq=2 ttl=128 time=34.0 ms
64 bytes from 59.82.122.115 (59.82.122.115): icmp_seq=3 ttl=128 time=33.7 ms
64 bytes from 59.82.122.115 (59.82.122.115): icmp_seq=4 ttl=128 time=34.1 ms
64 bytes from 59.82.122.115 (59.82.122.115): icmp_seq=5 ttl=128 time=33.7 ms
^C
--- taobao.com ping statistics ---
#一共传了5个包          #一共接收到了5个包  #丢包率是0
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 33.575/33.857/34.141/0.310 ms

平均负载

什么是平均负载

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

平均负载和CPU的使用率是没有直接关系的

平均负载多少合理?

# 如何查看cpu的个数的方法
方法1 :top 按 1

方法2 :lscpu

方法3 :/proc/cpuinfo
[root@web03 ~]# cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 158
model name      : Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
stepping        : 13
microcode       : 0xde
cpu MHz         : 2592.001
cache size      : 12288 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat md_clear spec_ctrl intel_stibp flush_l1d arch_capabilities
bogomips        : 5184.00
clflush size    : 64
cache_alignment : 64
address sizes   : 45 bits physical, 48 bits virtual
power management:

processor       : 0  0代表第一个CPU也可以认为是第一个核心数

## 平均负载多少合理?
不管是有4个CPU 还是一个CPU有4个核心 只要每个CPU或者每个核心上都在稳定运行一个程序 那就是合理的

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

# 三个平均负载值需要关注哪个?
三个平均负载值都需要关注 要看三个时间值的趋势去判断情况

# CPU的超负载  一般是磁盘相关 不会使服务器卡顿
假设在有2个CPU系统上看到平均负载为2.73,6.90,12.98
那么说明在过去1分钟内,系统有136%的超载(2.73/2*100%=136%) # ←CPU的超载的算法
5分钟:(6.90/2*100%=345%)
15分钟:(12.98/2*100%=649%)
但整体趋势来看 系统负载是在逐步降低 这样的情况下一般过会就好了

# 负载的上升
CPU使用率高不代表系统的负载就高 但CPU使用率高会导致系统的负载上升
CPU使用率低 系统的负载也会高 内存 硬盘也会影响负载
所以平均负载和CPU的使用率是没有直接关系的

CPU类型

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

某一台服务器,很卡,怎么办?

## 碰到问题的解决流程
1,找到卡的原因:服务器,负载太高
2,去定位,什么程序,导致负载高?
3,去定位,负载高,是哪个程序或者引起了哪个硬件 才导致负载高?

# 模拟问题  使用stress是因为目前不是在企业里没有用户量
stress是Linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。
先安装 : yum install -y stress
# 分析负载
mpstat是多核CPU性能分析工具,用来实时检查每个CPU的性能指标,以及所有CPU的平均指标。
pidstat是一个常用的进程性能分析工具,用来实时查看进程的CPU,内存,IO,以及上下文切换等性能指标。
# 启动了4个cpu密集型的进程,4个占满CPU的进程 再--timeout指定600秒后超时断开
[root@web03 ~]# stress --cpu 4 --timeout 600

# 查看所有的CPU 5s显示一次数据
mpstat -P ALL 5    安装命令:yum install -y sysstat-10.1.5-19.el7.x86_64
[root@web03 ~]# mpstat -P ALL 5
#从mpstat中可以看出,是用户态的进程导致CPU过高
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
## %usr占用率高 说明是 用户态的进程 CPU相关
## %sys占用率高 说明是 内核态的进程 IO相关 

# pidstat -u选项指定5s输出一次数据 2 , 总共输出2组数据的方法
[root@web03 ~]# pidstat -u 5 2

# stress 启动大量进程 导致负载升高的方法 -c 指定启动的进程数
[root@web03 ~]# stress -c 100 --timeout 600

# stress 让 IO:磁盘IO导致负载升高的方法
stress --io选项指定 从IO去运行程序
[root@web03 ~]# stress --io 100 --timeout 600

# stress 让 CPU:CPU使用率会导致负载升高的方法
stress --cpu选项指定 从cpu去运行程序
[root@web03 ~]# stress --cpu 100 --timeout 600

### 总结解决问题的分析流程和方法↓
1.使用uptime或者top命令查看,系统负载
2.看1分钟,5分钟,15分钟的负载趋势
3.是什么情况导致负载上升
mpstat -P ALL 5 是用户态,还是内核态,导致负载上升
用户态:cpu使用率,大量进程
内核态:磁盘IO,压缩文件,网络存储挂载,下载文件,数据库查询语句

4.pidstat查看到底是哪个程序,引起用户态或者内核态的负载上升?
pidstat -u 5 2

5.再top查到了是某个进程后
     - 运维的问题
        执行了某条命令导致
        启动了某个服务导致
     - 开发的问题
        查看开发写好的程序日志,导出日志,交给开发让开发解决