Day25-进程管理核心知识1
- 1. CentOS7 软件包安装方式
- 1.1 什么是源码包?
- 1.2 为什么要源码包安装
- 1.3 源码包如何获取
- 1.4 编译安装源码包软件
- 2. 源码编译示例 下面通过编译Nginx来深入了解下源码包编译的过程。
- 3. Linux 系统进程介绍
- 3.1 什么是进程?
- 3.2 进程/守护进程和程序区别
- 3.3 进程的工作流程
- 4. Linux进程管理命令
- 4.1 ps查看进程
- 4.2 pstree:显示进程状态树
- 4.3 pgrep:查找匹配条件的进程
- 4.4 top:实时显示系统中各个进程的资源占用状况
- 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.基础环境准备
[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
如果已装好,忽略下面步骤:
[root@node1 ~]# yum install gcc make wget -y #(Development Tools含有 gcc make)
2.下载源码包
[root@oldboy ~]# cd /usr/src/
[root@oldboy src]# wget -q http://nginx.org/download/nginx-1.20.1.tar.gz
3.解压源码包, 并进入相应目录
[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
[root@oldboy nginx-1.20.1]# ./configure --prefix=/application/nginx-1.20.1
5.将Makefile文件编译可执行二进制程序
[root@oldboy nginx-1.20.1]# make
6.将二进制文件拷贝至对应的目录中
[root@oldboy nginx-1.20.1]# make install
7.启动测试
[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官方更新
yum install nginx -y
特点:
1.安装复杂。
2.慢。
3.容易报错。
#报错解决方案:
./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 #简易查看进程,过滤进程的命令。
[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语法格式显示每个进程信息。
[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]
输出信息中各列的说明如下。
USER:该进程属于的用户;
PID :该进程的进程号;
%CPU:#该进程使用掉的CPU资源百分比;*****
%MEM:#该进程所占用的物理内存百分比;*****
VSZ :#(Virtual Size)进程占用的虚拟内存量 (单位Kb);*****
RSS :#该进程占用的物理内存大小 (单位Kb);*****
TTY :该进程是在哪个终端机上面运作的,若与终端机无关,则显示?,另外, tty1-tty6是本机上面登入者进程,若为pts/0等,表示为由网络连接进主机进程;
STAT:该进程目前的状态
START:该进程被触发启动的时间;
TIME :该进程实际使用 CPU 运作的时间;
COMMAND:该进程的实际命令,[ 方括号 ] 属于内核态的进程。 没有[ ]的是用户态进程。。
STAT:该进程目前的状态,主要的状态包括
R :正在运行,或者是可被运行。
S :正在中断睡眠中,可被某些信号(signal) 唤醒。
D :不可中断睡眠。
T :正在侦测或者是停止了。
Z :已经终止,但是其父进程无法正常终止他,造成 zombie (疆尸) 进程的状态。
+ :前台进程。
l :多线程进程。
N :低优先级进程。
< :高优先级进程。
s :进程领导者。
L : 已将页面锁定到内存中。
(1)AIX格式:ps -eo “%p %y %x %c”
语法说明:,-e是显示所有进程,-o可以自定义输出指定的字段,以逗号分隔,支持的字段见下面代码。
[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
[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监控,每隔几分钟监控。
倒序排序
[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上运行
[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命令以树形结构显示进程和进程之间的关系。
[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 显示进程对应的用户名称
[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 显示指定用户的所有进程号
[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 平均负载】
[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工具
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
从第七行开始,给出的是各进程(任务)的状态监控。
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必会快捷键指令(老男孩抓重点思想)
1 #查看系统核心总数, 类似于 lscpu(CPUs)
q #退出top
M #按内存使用百分比排序输出
P #按CPU使用百分比排序输出
R #对已排序的列反转排序
###抓重点显示,有助于查看的指令。
x #高亮显示排序的列
z #以彩色信息展示
b #高亮显示处于R状态的进程
>或< #改变排序的列,依然高亮显示。
#top熟悉了解的快捷键
h #查看帮助
l,t,m #显示/隐藏前5行的数据输出