欢迎来到李洋的博客

回首境界: 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

19、进程

1.进程基本概述

当我们运行一个程序,那么我们将运行的程序叫进程。
PS1: 当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限。
PS2: 在进程运行的过程中,服务器上会有各种状态来表示当前进程的指标信息。

2.程序和进程的区别

1.程序是数据和指令的集合,是一个静态的概念。比如/bin/ls、/bin/cp等二进制文件。同时程序可以长期存在系统中。
2.进程是程序运行的过程,是一个动态的概念。进程是存在生命周期的概念的,也就是说进程会随着程序的终止而销毁,不会永久存在系统中。

3.进程的生命周期

生命周期就是指一个对象的生老病死。用处很广。

4.监控进程状态

4.1.使用ps命令查看当前的进程状态(静态)

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

4.2.STAT基本状态

STAT基本状态 描述 STAT状态+符号 描述
R 进程运行 s 进程是控制进程, Ss进程的领导者,父进程
S 可中断睡眠 < 进程运行在高优先级上,S<优先级较高的进程
T 进程被暂停 N 进程运行在低优先级上,SN优先级较低的进程
D 不可中断进程 + 当前进程运行在前台,R+该表示进程在前台运行
Z 僵尸进程 l 进程是多线程的,Sl表示进程是以线程方式运行

4.3.案例一、PS命令查看进程状态切换

 #1.在终端1上运行vim
 [root@xuliangwei ~]# vim oldboy

 #2.在终端2上运行ps命令查看状态
 [root@xuliangwei ~]# ps aux|grep oldboy #S表示睡眠模式,+表示前台运行
 root 58118 0.4 0.2 151788 5320 pts/1 S+ 22:11 0:00 oldboy
 root 58120 0.0 0.0 112720 996 pts/0 R+ 22:12 0:00 grep --color=auto oldboy
 #在终端1上挂起vim命令,按下:ctrl+z 

 #3.回到终端2再次运行ps命令查看状态
 [root@xuliangwei ~]# ps aux|grep oldboy #T表示停止状态
 root 58118 0.1 0.2 151788 5320 pts/1 T 22:11 0:00 vim oldboy
 root 58125 0.0 0.0 112720 996 pts/0 R+ 22:12 0:00 grep --color=auto oldboy

4.4.案例二、PS命令查看不可中断状态进程

 #1.使用tar打包文件时,可以通过终端不断查看状态,由S+,R+变为D+
 [root@xuliangwei ~]# tar -czf etc.tar.gz /etc/ /usr/ /var/

 [root@xuliangwei ~]# ps aux|grep tar|grep -v grep
 root 58467 5.5 0.2 127924 5456 pts/1 R+ 22:22 0:04 tar -czf etc.tar.gz /etc/ 
 [root@xuliangwei ~]# ps aux|grep tar|grep -v grep
 root 58467 5.5 0.2 127088 4708 pts/1 S+ 22:22 0:03 tar -czf etc.tar.gz /etc/ 
 [root@xuliangwei ~]# ps aux|grep tar|grep -v grep
 root 58467 5.6 0.2 127232 4708 pts/1 D+ 22:22 0:03 tar -czf etc.tar.gz /etc/ 

4.5.查看负载

[root@oldboy ~]# w
 19:05:48 up 1 day, 11 min, 3 users, load average: 0.00, 0.01, 0.05

[root@oldboy ~]# uptime
 19:06:16 up 1 day, 12 min, 3 users, load average: 0.00, 0.01, 0.05

[root@oldboy ~]# top 
19:01:10 up 1 day, 7 min, 3 users, load average: 0.00, 0.01, 0.07
Tasks: 189 total, 1 running, 187 sleeping, 1 stopped, 0 zombie

4.6.top查看出的名词含义

任务 含义
Tasks: 129 total 当然进程的总数
1 running 正在运行的进程数
128 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
%Cpu(s): 0.7 us 系统用户进程使用CPU百分比
0.7 sy 内核中的进程占用CPU百分比,通常内核是于硬件进行交互
0.0 ni 改变过优先级的进程占用CPU的百分比
98.7 id 空闲CPU的百分比
0.0 wa IO等待占用CPU的百分比
0.0 hi 硬中断,占的CPU百分比(扩展)
0.0 si 软中断,占的CPU百分比(扩展)
0.0 st 比如虚拟机占用物理主机CPU的时间

所以,这两个阶段你也可以这样理解:
上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行;

而下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行。

f: 经常听同事说大量的网络小包会导致性能问题,为什么呢?
q:因为大量的网络小包会导致频繁的硬中断和软中断?
所以大量网络小包传输很慢,但如果将网络包一次传递,是不是会快很多呢?

https://www.cnblogs.com/xuliangwei/p/10789270.html

4.7.top命令使用下面参数则会显示不同效果

字母 含义
h 查看帮出
1 数字1,显示所有CPU核心的负载
z 以高亮显示数据
b 高亮显示处于R状态的进程
M 按内存使用百分比排序输出
P 按CPU使用百分比排序输出
q 退出top

4.8.top中第六行的释义

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
进程id 进程所有者 优先级 nice值。负值表示高优先级,正值表示低优先级 进程使用的虚拟内存总量 进程使用的、未被换出的物理内存大小 共享内存大小 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程) 上次更新到现在的CPU时间占用百分比 进程使用的物理内存百分比 进程使用的CPU时间总计,单位1/100秒 命令名/命令行

https://www.cnblogs.com/zhoug2020/p/6336453.html

5.管理进程状态

管理进程: Kill pkill killall

数字编号 信号含义 信号翻译
1 SIGHUP 通常用来重新加载配置文件
9 SIGKILL 强制杀死进程
15 SIGTERM 终止进程,默认kill使用该信号

当进程没有停止的信号,可以使用系统的kill给进程发送信号

默认kill掉进程的父进程,这样才能彻底的杀掉该进程. 否则如果只是kill子进程,没有用
[root@oldboy ~]# kill 18788

重载配置,PID号不会发生变化. 只要PID发生变化说明进程被停止过
[root@oldboy ~]# kill -1 20154

强制杀死某个进程.慎用
[root@oldboy ~]# kill -9 20154

批量杀死进程
[root@oldboy ~]# ps aux|grep nginx |grep -v grep|awk '{print $2}'|sed -r 's#(.*)#kill \1#g'|bash
[root@oldboy ~]# killall nginx 跟进程的名称(批量)
[root@oldboy ~]# pkill nginx 跟上进程名称(批量)
[root@oldboy ~]# pkill -9 -t pts/0 杀掉连接的终端

6.管理后台进程

==后台进程:screen==

1.再开启一个子bash窗口,关闭父bash并不影响子bash

1.安装
[root@oldboy ~]# yum install screen -y

2.开启一个screen窗口,指定名称
[root@oldboy ~]# screen -S wget_mysql

3.在screen窗口中执行任务即可

4.平滑的退出screen,但不会终止screen中的任务   注意: 如果使用exit 才算真的关闭screen窗口
ctrl+a+d

5.查看当前正在运行的screen有哪些
[root@oldboy ~]# screen -list
There is a screen on:
 22058.wget_mysql   (Detached)
1 Socket in /var/run/screen/S-root.

6.进入正在运行的screen
[root@oldboy ~]# screen -r wget_mysql
[root@oldboy ~]# screen -r 22058

7.进程的优先级[进阶]

7.1.进程优先级: nice renice

nice 值越高:表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。
nice 值越低:表示优先级越高,例如-20,该进程更不倾向于让出CPU。
NI: 实际nice级别,默认是0。PR:显示nice值,-20映射到0,19映射到39

7.2.nice指定程序的优先级。

语法格式 nice -n 优先级数字 进程名称

 #1.开启vim并且指定程序优先级为-5
 [root@m01 ~]# nice -n -5 vim &
 [1] 98417

 #2.查看该进程的优先级情况
 [root@m01 ~]# ps axo pid,command,nice |grep 98417
  98417 vim -5

7.3.renice命令修改一个正在运行的进程优先级。

语法格式 renice -n 优先级数字 进程pid

 1.查看sshd进程当前的优先级状态
 [root@m01 ~]# ps axo pid,command,nice |grep [s]shd
  70840 sshd: root@pts/2 0
  98002 /usr/sbin/sshd -D 0

 2.调整sshd主进程的优先级
 [root@m01 ~]# renice -n -20 98002
 98002 (process ID) old priority 0, new priority -20

 3.调整之后记得退出终端
 [root@m01 ~]# ps axo pid,command,nice |grep [s]shd
  70840 sshd: root@pts/2 0
  98002 /usr/sbin/sshd -D -20
 [root@m01 ~]# exit

 4.当再次登陆sshd服务,会由主进程fork子进程(那么子进程会继承主进程的优先级)
 [root@m01 ~]# ps axo pid,command,nice |grep [s]shd
  98002 /usr/sbin/sshd -D -20
  98122 sshd: root@pts/0 -20

案例: Linux假死

8.系统平均负载[进阶]

平均负载: mpstat pidstat

如何理解平均负载:平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,
PS: 平均负载与 CPU 使用率并没有直接关系。

划重点,因此你可以简单理解为,平均负载其实就是单位时间内的活跃进程数。

那么在实际生产环境中,平均负载多高时, 65%-70%

场景一:CPU 密集型进程
[root@oldboy ~]# stress --cpu 4 --timeout 600 

[root@oldboy ~]# watch -d uptime
[root@oldboy ~]# mpstat -P ALL 5
[root@oldboy ~]# pidstat -u 5 1

场景二:I/O 密集型进程
[root@m01 ~]# stress --io 1 --timeout 600s

场景三:大量进程的场景
[root@m01 ~]# stress -c 4 --timeout 600

平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。  
但只看平均负载本身,我们并不能直接发现,到底是哪里出现了瓶颈。

所以,在理解平均负载时,也要注意:
 平均负载高有可能是 CPU 密集型进程导致的;
 平均负载高并不一定代表 CPU使用率高,还有可能是 I/O 繁忙了;
 当发现负载高的时候,你可以使用 mpstat、pidstat 等工具,辅助分析负载的来源

如果出现无法使用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.rpm

stress介绍





posted on 2019-06-24 17:24  miss_xxy  阅读(269)  评论(0编辑  收藏  举报

导航

levels of contents