Day25-进程管理核心知识1

Day25-进程管理核心知识1

  • [1. CentOS7 软件包安装方式](#1. CentOS7 软件包安装方式)
    • [1.1 什么是源码包?](#1.1 什么是源码包?)
    • [1.2 为什么要源码包安装](#1.2 为什么要源码包安装)
    • [1.3 源码包如何获取](#1.3 源码包如何获取)
    • [1.4 编译安装源码包软件](#1.4 编译安装源码包软件)
  • [2. 源码编译示例 下面通过编译Nginx来深入了解下源码包编译的过程。](#2. 源码编译示例 下面通过编译Nginx来深入了解下源码包编译的过程。)
  • [3. Linux 系统进程介绍](#3. Linux 系统进程介绍)
    • [3.1 什么是进程?](#3.1 什么是进程?)
    • [3.2 进程/守护进程和程序区别](#3.2 进程/守护进程和程序区别)
    • [3.3 进程的工作流程](#3.3 进程的工作流程)
  • [4. Linux进程管理命令](#4. Linux进程管理命令)
    • [4.1 ps查看进程](#4.1 ps查看进程)
    • [4.2 pstree:显示进程状态树](#4.2 pstree:显示进程状态树)
    • [4.3 pgrep:查找匹配条件的进程](#4.3 pgrep:查找匹配条件的进程)
    • [4.4 top:实时显示系统中各个进程的资源占用状况](#4.4 top:实时显示系统中各个进程的资源占用状况)
    • [4.5 快捷键:](#4.5 快捷键:)

1. CentOS7 软件包安装方式

软件包分类 安装方式 优缺点
rpm 包 软件开发商预先编译打包,安装简单、快速软件开发商预先编译打包,安装简单、快速 软件版本可能偏低,安装路径固定好的。定制 rpm 包、官方找最新的 rpm 包。
源码包 自己手动编译安装,安装复杂 https://blog.oldboyedu.com/autodeploy-rpm 软件版本随意选,可定制安装路径,满足定制需求
二进制包 解压即可使用,安装简单 不能修改源码,软件包大

源码包管理实践

1.1 什么是源码包?

源码包指的是开发人员编写好的程序源代码,但并没有将其编译为一个能正常使用的工具或软件。

1.2 为什么要源码包安装

1)部分软件官网仅提供源码包,需要自行编译并安装。

2)部分软件在新版本有一些特性还没来得及制作成rpm包时,或者软件厂商自身没有这个功能,只能通过可以自行编译软件增加或使用其新特性。

3)源码包的优缺点:

优点:

1.可以自行修改源代码

2.可以定制需要的相关功能

3.新版软件优先更新源码(Python、Go,学开发做运维,差异化发展)

缺点:

1.相对yum安装软件会复杂很多

2.标准化实施困难,自动化运维复杂

1.3 源码包如何获取

常见的软件包都可以在官网获取源码包,比如Apache(并发能力3000-5000)、Nginx(10000-30000)、MySQL等等,阿里云、清华源可能也有

1.4 编译安装源码包软件

上述安装往往是C语言开发的软件。2013年以前,很多的系统服务级软件大多都是C语言开发

C语言优势:运行速度快。缺点:难学,开发速度慢。目前在互联网企业几乎绝迹

Python语言:开发效率高,用途广。解释语言,运行速度慢。

GO语言:开发效率高,用途逐渐广,编译速度快。替代C语言,主要是高并发场合

2. 源码编译示例 下面通过编译Nginx来深入了解下源码包编译的过程。

1.基础环境准备

bash 复制代码
[root@oldboy ~]# rpm -qa make gcc wget
make-3.82-24.el7.x86_64
gcc-4.8.5-44.el7.x86_64
wget-1.14-18.el7_6.1.x86_64

如果已装好,忽略下面步骤:

bash 复制代码
[root@node1 ~]# yum install gcc make wget -y #(Development Tools含有 gcc make)

2.下载源码包

bash 复制代码
[root@oldboy ~]# cd /usr/src/
[root@oldboy src]# wget -q http://nginx.org/download/nginx-1.20.1.tar.gz

3.解压源码包, 并进入相应目录

bash 复制代码
[root@oldboy src]# tar xf nginx-1.20.1.tar.gz
[root@oldboy src]# cd nginx-1.20.1/
[root@oldboy nginx-1.20.1]# 

4.配置相关的选项,并生成Makefile

bash 复制代码
[root@oldboy nginx-1.20.1]#  ./configure --prefix=/application/nginx-1.20.1

5.将Makefile文件编译可执行二进制程序

bash 复制代码
[root@oldboy nginx-1.20.1]#  make

6.将二进制文件拷贝至对应的目录中

bash 复制代码
[root@oldboy nginx-1.20.1]#  make install

7.启动测试

bash 复制代码
[root@oldboy nginx-1.20.1]# netstat -lntup|grep nginx
[root@oldboy nginx-1.20.1]# /application/nginx-1.20.1/sbin/nginx 
[root@oldboy nginx-1.20.1]# netstat -lntup|grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      74238/nginx: master
[root@oldboy nginx-1.20.1]# curl 127.0.0.1
[root@oldboy nginx-1.20.1]# /application/nginx-1.20.1/sbin/nginx -s stop
[root@oldboy nginx-1.20.1]# netstat -lntup|grep nginx

#epel源有nginx的,nginx官方更新

bash 复制代码
yum install nginx -y

特点:

1.安装复杂。

2.慢。

3.容易报错。

#报错解决方案:

bash 复制代码
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

[root@oldboy nginx-1.20.1]# yum install pcre-devel -y

./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.

[root@oldboy nginx-1.20.1]# yum install zlib-devel -y

3. Linux 系统进程介绍

3.1 什么是进程?

计算机应用软件或代码程序被执行,运行于内存中的时候,就称之为进程。

软件或程序运行成为进程后,系统会为其分配分配内存资源,并分配PID,文件描述符、网络端口、运行用户等资源。

在进程运行的过程中,系统会有各种指标来表示当前运行的状态。

进程是已启动的可执行程序的运行实例,进程有以下组成部分分配内存:

分配内存:分配内存地址空间。

安全属性:分配运行身份和权限。

进程代码:可fork一个或多个子进程或线程

进程状态:进程运行后存在多种状态。

3.2 进程/守护进程和程序区别

选项 描述
进程(process) 程序或者软件被运行起来后的产物,存在于内存中,运行结束就会消失
守护进程(daemon process) 除了具备普通进程特点外,还为提供某种服务而持续运行,如:运行着的Linux sshd。
程序/代码(program/code) 代码文件或应用软件文件,比如:ls命令,永久放在磁盘中,可以看得见实体文件,把程序或软件运行起来就是进程,持续运行着,就是守护进程。

3.3 进程的工作流程

进程工作流程描述

1.当程序运行的时候会产生父进程,并可能 fock 多个子进程。

2.当父进程接收到任务调度时,将任务交给派生的子进程处理,子进程会继承父进程属性。

3.子进程在处理任务时,父进程会进入等待状态中...

4.子进程处理任务完成后,会发出信号并执行退出,退出前会唤醒父进程来回收子进程的资源。

5.如果子进程在处理任务过程中异常退出终止,父进程就可能没有回收子进程的资源,导致子进程虽然运行实体已经消失,但仍然在内核中的进程表中占据记录(僵尸进程),长期下去会浪费系统资源。

6.如果子进程在处理任务过程中,父进程退出或意外终止,则子进程可能未退出,那么子进程就没有父进程来管理了,由系统的 system进程管理(孤儿进程)。

PS:每个进程都父进程的PPID,子进程则叫 PID。

程序运行时进程的状态关系:

父进程复制自己的地址空间创建新的子进程,子进程可以继承父进程(ppid)的环境变量

每个进程都有自己的唯一ID(PID)

进程是由 systemd 这个父进程派生出来的子进程

子进程在运行自己的程序代码的时候,父进程往往会进入到睡眠状态。

子进程完成程序代码发出退出信号请求,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵停(僵尸 Zombie)父进程在子进程退出时收到信号会被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。

4. Linux进程管理命令

4.1 ps查看进程

ps命令:

ps命令用于列出执行ps命令的那个时刻的进程快照,就像用手机给进程照了一张照片。

动态查看top

常用:

-e 显示所有进程※

-f 额外显示UID、PPID、C与STIME栏位※

常用命令:

ps -ef #简易查看进程,过滤进程的命令。

bash 复制代码
[root@oldboy ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 Jun02 ?        00:00:06 /usr/lib/systemd/systemd --system --des
root          2      0  0 Jun02 ?        00:00:00 [kthreadd]
root          4      2  0 Jun02 ?        00:00:00 [kworker/0:0H]
root          6      2  0 Jun02 ?        00:00:09 [ksoftirqd/0]
root          7      2  0 Jun02 ?        00:00:00 [migration/0]
root          8      2  0 Jun02 ?        00:00:00 [rcu_bh]

PID为1的初始进程,C7:systemd,C6:init

输出信息中各列的说明如下。

UID:进程被该UID所拥有,程序运行必须要有用户,一般是虚拟用户。
PID:进程的标识号;Process ID
PPID:进程的父进程的标识号;
C:CPU使用的资源百分比;
STIME:进程开始的时间;
TTY :该进程是在哪个终端机上面运作,若与终端机无关,则显示?,另外, tty1-tty6是本机上面的登入者进程,若为pts/0等,则表示为由网络连接进主机的进程;
TIME:进程所使用的总的CPU时间;
CMD:正在执行的命令行。

这里使用BSD语法格式显示每个进程信息。

bash 复制代码
 [root@oldboy ~]# ps aux  #***
 #<== BSD格式参数,使用a选项和x选项显示所有进程,使用u选项显示进程的用户信息。

[root@oldboy ~]# ps aux 
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  46368  6700 ?        Ss   Jun02   0:06 systemd --system --deserialize 18
root          2  0.0  0.0      0     0 ?        S    Jun02   0:00 [kthreadd]
root          4  0.0  0.0      0     0 ?        S<   Jun02   0:00 [kworker/0:0H]

输出信息中各列的说明如下。

bash 复制代码
USER:该进程属于的用户;
PID :该进程的进程号;
%CPU:#该进程使用掉的CPU资源百分比;*****
%MEM:#该进程所占用的物理内存百分比;*****
VSZ :#(Virtual Size)进程占用的虚拟内存量 (单位Kb);*****
RSS :#该进程占用的物理内存大小 (单位Kb);*****
TTY :该进程是在哪个终端机上面运作的,若与终端机无关,则显示?,另外, tty1-tty6是本机上面登入者进程,若为pts/0等,表示为由网络连接进主机进程;
STAT:该进程目前的状态
START:该进程被触发启动的时间;
TIME :该进程实际使用 CPU 运作的时间;
COMMAND:该进程的实际命令,[ 方括号 ] 属于内核态的进程。 没有[ ]的是用户态进程。。

STAT:该进程目前的状态,主要的状态包括

bash 复制代码
 R :正在运行,或者是可被运行。
 S :正在中断睡眠中,可被某些信号(signal) 唤醒。
 D :不可中断睡眠。
 T :正在侦测或者是停止了。
 Z :已经终止,但是其父进程无法正常终止他,造成 zombie (疆尸) 进程的状态。
 + :前台进程。
 l :多线程进程。
 N :低优先级进程。
 < :高优先级进程。
 s :进程领导者。
 L : 已将页面锁定到内存中。

(1)AIX格式:ps -eo "%p %y %x %c"

语法说明:,-e是显示所有进程,-o可以自定义输出指定的字段,以逗号分隔,支持的字段见下面代码。

bash 复制代码
[root@oldboy ~]# ps -eo "%p %y %x %c"
   PID TTY          TIME COMMAND
     1 ?        00:00:06 systemd
     2 ?        00:00:00 kthreadd
     4 ?        00:00:00 kworker/0:0H
     6 ?        00:00:09 ksoftirqd/0
     7 ?        00:00:00 migration/0
     8 ?        00:00:00 rcu_bh

CODE NORMAL HEADER

代码 标准含义 命令行表头内容

%C     pcpu     %CPU
%G     group    GROUP
%P     ppid     PPID
%U     user     USER
%a     args     COMMAND
%c     comm     COMMAND
%g     rgroup   RGROUP
%n     nice     NI
%p     pid      PID 
%r     pgid     PGID
%t     etime    ELAPSED
%u     ruser    RUSER
%x     time     TIME
%y     tty      TTY
%z     vsz      VSZ

ps -eo "%p %C %z %c"
%p     pid      PID 
%C     pcpu     %CPU
%z     vsz      VSZ
%c     comm     COMMAND
bash 复制代码
[root@oldboy ~]# ps -eo "%p %C %z %c"
   PID %CPU    VSZ COMMAND
     1  0.0  46368 systemd
     2  0.0      0 kthreadd
     4  0.0      0 kworker/0:0H
     6  0.0      0 ksoftirqd/0

[root@oldboy ~]# ps aux|awk '{print $2"\t"$3"\t"$4"\t"$5"\t"$6}'
PID	%CPU	%MEM	VSZ	RSS
1	0.0	0.1	46368	6700
2	0.0	0.0	0	0
4	0.0	0.0	0	0
6	0.0	0.0	0	0
7	0.0	0.0	0	0

zabbix监控,每隔几分钟监控。

倒序排序

bash 复制代码
[root@oldboy ~]# ps -eo "%p %C %z %c" --sort -vsz|head
   PID %CPU    VSZ COMMAND
  1053  0.0 612376 polkitd
 20524  0.0 574284 tuned
  1080  0.0 474920 NetworkManager
 21554  0.0 228456 abrtd
 21581  0.0 225940 abrt-watch-log
 21299  0.0 218528 rsyslogd
 20759  0.0 199460 vmtoolsd
 20758  0.0 168304 VGAuthService
  1641  0.0 154848 sshd
ps -eo "%p %C %z %c" --sort vsz #升序

ps aux --sort vsz           #--sort 加上对应格式,可以进行排序  
ps aux --sort -vsz |head    #--sort后面加上 -(减号)表示逆序排序

查看某个进程在哪个CPU上运行

bash 复制代码
[root@oldboy ~]# ps -eo pid,args,psr
   PID COMMAND                     PSR
     1 /usr/lib/systemd/systemd --   0
     2 [kthreadd]                    0
     4 [kworker/0:0H]                0

[root@oldboy ~]# ps aux|awk '{print $2"\t"$3"\t"$4"\t"$5"\t"$6}'|sort -rn -k4|head
1053	0.0	0.3	612376	12292
20524	0.0	0.4	574284	17464
1080	0.0	0.2	474920	8928
21554	0.0	0.1	228456	5844
21581	0.0	0.1	225940	4904
21299	0.0	0.1	218528	6956
20759	0.0	0.1	199460	4856
20758	0.0	0.1	168304	5164
1641	0.0	0.1	154848	5556
13003	0.0	0.1	154692	5420

总结:

ps aux

a	显示与终端相关的所有进程,包含每个进程的完整路径※
u	显示进程的用户信息※
x	显示与终端无关的所有进程※

-u	显示指定用户相关的进程信息

ps -ef

-e	显示所有进程※
-f	额外显示UID、PPID、C与STIME栏位※

企业如何用?

查找占用 cpu mem 虚拟内存 更多的进程,

分析进程的问题,解决问题,把资源降下来。

如果发现没有异常,还无法降下来,就增加资源

维护服务器性能:CPU、内存、IO

4.2 pstree:显示进程状态树

【功能说明】

pstree命令以树形结构显示进程和进程之间的关系。

bash 复制代码
[root@oldboy ~]# pstree
systemd-+-NetworkManager---2*[{NetworkManager}]
        |-VGAuthService
        |-abrt-watch-log
        |-systemd-logind
        |-systemd-udevd
        |-tuned---4*[{tuned}]
        |-vmtoolsd---{vmtoolsd}
        `-vsftpd		
-a	显示启动每个进程对应的完整指令,包含启动进程的路径、参数等
-c	显示的进程中包含子进程和父进程
-h	对现在执行的程序进行特别标注
-n	根据进程PID号来排序输出,默认是以程序名称排序输出的
-p	显示进程的PID
-u	显示进程对应的用户名称
bash 复制代码
[root@oldboy ~]# pgrep crond
2496
[root@oldboy ~]# ps -c -p `pgrep crond`
   PID CLS PRI TTY          TIME CMD
  2496 TS   19 ?        00:00:00 crond

pstree -p 74537
pstree -a
pstree -c -p 74537
pstree -u nobody

4.3 pgrep:查找匹配条件的进程

【功能说明】pgrep命令可以查找匹配条件的进程号。

【语法格式】pgrep [选项] [匹配条件]

【选项说明】-u 显示指定用户的所有进程号

bash 复制代码
[root@oldboy ~]# pgrep crond
2496
[root@oldboy ~]# pstree -p 2496
crond(2496)
[root@oldboy ~]# pstree -p `pgrep crond`
crond(2496)
[root@oldboy ~]# pgrep -u nobody
74538

4.4 top:实时显示系统中各个进程的资源占用状况

【语法格式】top [选项]

参数选项 解释说明(带※的为重点)

-a	将进程按照使用内存排序
-b	以批处理模式显示进程信息,输出结果可以传递给其他程序或写入到文件中。
-c	显示进程的整个命令路径,而不是只显示命令名称
-d	指定每两次屏幕信息刷新之间的时间间隔(top -d 1)
-H	指定这个可以显示每个线程的情况,否则就是进程的总的状态
-i	不显示闲置或者僵死的进程信息
-n	top输出信息更新的次数,完成后将退出top命令
-p	显示指定的进程信息(top -p 进程号)

重点:top输出

top - 01:12:32 up 2 days, 2:47, 2 users, load average: 0.00, 0.01, 0.05

第一行:任务队列信息,同uptime命令的执行结果。

01:12:32 当前系统时间。

up 2 days, 2:47 系统已经运行了1天16小时36分。

2 users 当前有2个用户登录系统。

load average: 0.00, 0.01, 0.05 --- load average 平均负载情况*

*后面的三个数分别是1分钟、5分钟、15分钟的平均负载情况。

【体现系统繁忙的重要简单的查看指标】

【load average 平均负载】

bash 复制代码
[root@oldboy etc]# w|head -1
 01:16:02 up 2 days,  2:51,  2 users,  load average: 0.00, 0.01, 0.05
[root@oldboy etc]# uptime
 01:16:07 up 2 days,  2:51,  2 users,  load average: 0.00, 0.01, 0.05

Tasks: 105 total, 1 running, 104 sleeping, 0 stopped, 0 zombie

第二行,Tasks为任务(进程)。

从上面的信息可以看出,

系统现在共有105个进程,其中处于运行状态的有1个,

104个在休眠(sleep),stoped状态0个,zombie状态(僵死)的有0个。

STAT:该进程目前的状态,主要的状态包括

R :正在运行,或者是可被运行。

S :正在中断睡眠中,可被某些信号(signal) 唤醒。

D :不可中断睡眠。

T :正在侦测或者是停止了。

Z :已经终止,但是其父进程无法正常终止他,造成 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

第三行,CPU状态信息。

0.0% us (user)用户空间占用CPU的百分比(如:应用程序、执行命令)。*****

0.0% sy (system)内核空间占用CPU的百分比(如:内核进程、硬件磁盘操作)。*****

0.0% ni (nice)改变过优先级的进程占用CPU的百分比。

100.0% id (idle)空闲CPU百分比,数值越大,CPU越空闲。*****

0.0% wa (wait)IO等待占用CPU的百分比。*****

0.0% hi (hard Interrupts)硬中断(Hardware IRQ)占用CPU的百分比。

0.0% si 软中断(Software Interrupts)占用CPU的百分比。

0.0% st 虚拟机占用CPU的百分比。

KiB Mem : 4026136 total, 203768 free, 228476 used, 3593892 buff/cache

第四行,内存状态。

KiB Mem : 995684 total, 87984 free, 234516 used, 673184 buff/cache

内存:

4026136 total #内存一共多大

203768 free #可用内存,剩余内存

228476 used #已经使用的内存

3593892 buff/cache #系统缓存和缓冲占用内存空间

KiB Swap: 2097148 total, 2097148 free, 0 used. 3531892 avail Mem

第五行,swap交换分区信息。

12097148 total 交换区总量。

0k used 使用的交换区总量。

2097148 free 空闲交换区总量。

3531892 avail Mem 可用内存大小

以上两行: cat /proc/meminfo或free -m获取。

4.5 快捷键:

l,t,m #显示/隐藏前5行的数据输出

模拟消耗负载,消耗CPU,消耗IO工具

bash 复制代码
stress - tool to impose load on and stress test systems
Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

stress --io 4 --timeout 100s

 PID   USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                     
 20759 root      20   0  199460   4856   3724 R  0.3  0.1   2:24.05 vmtoolsd                                                                    
 74646 root      20   0   58424   2112   1488 R  0.3  0.1   0:01.23 

从第七行开始,给出的是各进程(任务)的状态监控。

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

top必会快捷键指令(老男孩抓重点思想)

bash 复制代码
1     #查看系统核心总数,  类似于 lscpu(CPUs) 
q	  #退出top
M	  #按内存使用百分比排序输出
P	  #按CPU使用百分比排序输出
R     #对已排序的列反转排序
###抓重点显示,有助于查看的指令。
x     #高亮显示排序的列
z     #以彩色信息展示
b	  #高亮显示处于R状态的进程
>或<  #改变排序的列,依然高亮显示。
#top熟悉了解的快捷键
h	  #查看帮助
l,t,m #显示/隐藏前5行的数据输出
相关推荐
热爱嵌入式的小许9 分钟前
Linux基础项目开发1:量产工具——显示系统
linux·运维·服务器·韦东山量产工具
韩楚风4 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学4 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO4 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu74 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我4 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、4 小时前
【Linux】进程地址空间(初步了解)
linux
栎栎学编程4 小时前
Linux中环境变量
linux
我是哈哈hh5 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
郭二哈5 小时前
C++——模板进阶、继承
java·服务器·c++