目录
1 进程概述和 ps 管理进程
1.1 什么是进程?进程管理需要做什么?
进程是已启动的可执行程序的运行实例,进程有以下组成部分:
• 已分配内存的地址空间;
• 进程 ID;
• 程序的代码;
• 进程状态;
2.进程管理
包括进程调度、中断处理、信号、进程优先级、进程切换、进程状态、进程内存等等。
2.1进程的生命周期图:
描述如下:
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程。
所有进程都是第一个系统进程的后代。
centos5 或 6PID 为 1 的进程是:init
centos7 PID 为 1 的进程是:systemd
僵尸进程:不执行代码,占用内存地址空间
当一个进程接收到终止信号时,它结束之前需要一段时间来结束所有任务。
在进程执行所有代码之后,它将相关终止报告发给父进程。父进程正常情况下会移除所有子进程的数据结构。如果父进程没能接收子进程退出信号,那么子进程变为僵尸进程。
所以通常在很短的某个时刻内它是一个僵尸进程。使用 kill 命令是不能杀死僵尸进程的,因为它已经被认定为死亡了。可以尝试杀死僵尸进程的父进程,僵尸进程会随之消失。
如果一个进程为僵尸状态,父进程是 init 或systemd 那么需要重启系统来解决问题。线程:线程是进程中产生的一个执行单元,在同一个进程中与其他线程并行运行。线程之间可以共享资源,比如内存、地址空间、打开文件等。
2.2上下文切换:
在处理器执行期间,运行进程的信息被存储在处理器的寄存器和高速缓存中。
执行的进程被加载到寄存器的数据被称为上下文。
在实际处理器运行过程中,先存储运行进程的上下文。
然后将下一个要运行的进程的上下文恢复到寄存器,这个过程称之为上下文切换。
一般不能有太多上下文切换。
因为处理器每次要刷新寄存器和高速缓存,以便释放空间给新进程,可能导致性能下降。
2.3中断处理:
中断是优先级最高的任务之一。
通常由 I/O 产生,比如网络接口、键盘、磁盘控制器等。
当一个中断信号到达内核的时候,内核必须从当 前执行的进程切换到一个新的进程,以便处理这个中断。这意味着中断会导致上下文切换。也就是说大量中断会导致性能下降。
注意:在 Linux 当中有两种类型的中断。硬中断和软中断。
硬中断是由硬件产生的,需要快速响应(比如:磁盘 IO 中断、键盘中断、鼠标中断等)
软中断被用来处理可以推迟的任务(TCP/IP、SCSI 协议操作等)。
2.4进程的属性
(PID):进程ID,是唯一的数值
(PPID):父进程的 ID
启动进程的用户 ID(UID)和所归属的组(GID)
进程状态:运行 R、休眠 S、僵尸 Z
进程执行的优先级
进程所连接的终端名
进程资源占用:比如占用资源大小(内存、CPU 占用量)
3.ps 命令
常用的参数:
a: 显示跟当前终端关联的所有进程
u: 基于用户的格式显示
x: 显示所有进程,不以终端机来区分
常用的选项组合是 ps -aux 和 ps -axu | grep 关键词
注: 最后一列[xxxx] 使用方括号括起来的进程是内核态的进程,没有括起来的是用户态进程。
上面的参数输出每列含意:
USER: 启劢这些进程的用户
PID: 进程的 ID
%CPU 进程占用的 CPU 百分比;
%MEM 占用内存的百分比;
VSZ:进程占用的虚拟内存大小(单位:KB)
RSS:进程占用的物理内存大小(单位:KB)
STAT:该程序目前的状态,
START:该进程被触发启动的时间;
TIME :该进程实际使用 CPU 运作的时间。
COMMAND:该程序的实际指令
3.1进程的 5 种基本状态
R :该程序目前正在运作,或者是可被运作;
S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号(signal) 唤醒。
T :该程序目前正在侦测或者是停止了;
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (僵尸) 程序的状态
D 不可中断状态,通常存在于 I/O 情冴下。比如数据的传输
5 个基本状态后,还可以加一些字母,比如:Ss、R+,
它们含意如下::
<: 表示进程运行在高优先级上
N: 表示进程运行在低优先级上
L: 表示进程有页面锁定在内存中
s: 表示进程是控制进程
l: 表示进程是多线程的
+: 表示当前进程运行在前台
注:
ctrl-c 是发送 SIGINT 信号,终止一个进程
ctrl-z 是发送 SIGSTOP 信号,挂起一个进程。将作业放置到后台(暂停)
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。代表输入完成或者注销
3.2ps -ef
-e 显示所有进程
-f 显示完整格式输出
包含的信息如下:
UID: 启动这些进程的用户
PID:进程 ID
PPID: 父进程的进程号
C: 进程生命周期中的 CPU 利用率
STIME: 进程启动时的系统时间
TTY: 表明进程在哪个终端设备上运行。如果显示 ?表示与终端无关,这种进程一般是内核态进程。另外, tty1-tty6 是本 机上 面的登入者程序,若为 pts/0 等,则表示运行在虚拟终端上的进程。
TIME: 运行进程一共累计占用的 CPU 时间
CMD: 启动的程序名称
4.free 命令
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 972 603 69 24 299 123
Swap: 2047 69 1978
其中:
第一行:total 是总内存量,used 是已经使用的内存量,free 是空闲的内存,shared 是多个进程共享的内存总数,buffers 是缓冲内存数,cached 是缓存内存数。默认单位是 KB。
第二行开始:
total 系统中有 972MB 的物理内存,
used 是已经使用的内存数量。
free 是空闲的内存数量。shared 是多个进程共享的内存数量。
buff/cache 用来作为缓冲和缓存的空间,内核会在内存将要耗尽时释放这部分内存给其他进程使用。
availble:可使用空间,评估有多少内存可用于启动新应用程序。
available 字段考虑了页缓存,而不是所有可回收的内存。正因为这个原因所以通常 free+buff/cache 的数值要比 available 的数值大。
第三行为 swap 虚拟内存。
在上面信息中我们可以看到,其实系统上并没有运行什么服务。但是有 299 的 cache,这是因为在实验过程中进行 过多次读写执行等操作。这些文件会被系统暂时缓存下来,以便下次运行的时候能够快速的读取。这种使用都是正 常的情况,说明物理内存正在被合理的使用。但是如果我们发现 swap 区域一直被大量使用,这就说明物理内存不 足。可能需要考虑系统上 swap 使用比例或者添加物理内存
5.uptime 命令
#查看系统负载-top 动态管理进程
uptime 查看 CPU 负载工具
[root@localhost ~]# uptime
13:22:30 up 20days, 2 users, load average: 0.06, 0.60, 0.48
13:22:30 : 当前时间
up 20days : 系统运行时间 ,说明此服务器连续运行 20 天了
2 user : 当前登陆用户数
load average: 0.06, 0.60, 0.48 :
系统负载,即任务队列的平均长度。 三个数值分别为 1 分钟、5 分钟、15 分钟前到现在的平均值。
如果服务器的 CPU 为 1 核心,则 load average 中的数字 >=3 负载过高,如果服务器的 CPU 为 4 核心,则 load average 中的数字 >=12 负载过高。
经验:单核心,1 分钟的系统平均负载不要超过 3就可以,这是个经验值。
6.top 命令
top 快捷键: 默认 3s 刷新一次,按 s 修改刷新时间
空格 :立即刷新。
q 退出
P:按 CPU 排序
M:按内存排序
T 按时间排序
p: 进程 IP,查看某个进程状态
数字键 1:显示每个内核的 CPU 使用率
u/U:指定显示的用户
h:帮助
如果使用 TOP 动态只查看某个或某些进程的信息 :
第一步:找到进程 ID :ps -axu | grep vim
第二步:用pid查看进程:top -p 9667
7.实战找出系统中使用 CPU 最多的进程
运行 top , 找出使用 CPU 最多的进程 ,按大写的 P,可以挄按CPU 使用率来排序显示cpu利用率大小不一定百分比越大越高,主要看cpu的数量
第一行内容和 uptime 弹出的信息一样
进程和 CPU 的信息( 第二、三行)
Tasks: 481 total : 进程总数
1 running : 正在运行的进程数
480 sleeping : 睡眠的进程数
0 stopped : 停止的进程数
0 zombie : 僵尸进程数
Cpu(s): 0.0% us : 系统用户进程使用 CPU 百分比。
0.0% sy : 内核中的进程占用 CPU 百分比
0.0% ni : 用户进程空间内改变过优先级的进程占用 CPU 百分比
98.7% id : 空闲 CPU 百分比
0.0% wa : cpu 等待 I/0 完成的时间总量。
0.0% hi : 硬中断消耗时间 。硬中断,占的 CPU 百分比。1. 硬中断是由硬件产生的,比如,像磁盘,网卡, 键盘,时钟等。
0.0% si : 软中断消耗时间。软中断,占的 CPU 百分比。硬中断是由硬件设备产生,需要快速响应。软中断被 用来处理可以推迟的任务(如 TCP/IP 操作,SCSI 协议)。
0.0 st (steal 偷): st:虚拟机偷取物理的时间。比如:物理机已经运行了 KVM,XEN 虚拟机。KVM 虚拟机占用物理机 的 cpu 时间内存信息(第四五行)
Mem: 2033552k total : 物理内存总量
340392k used : 使用的物理内存总量
1376636k free : 空闲内存总量
Swap: 2017948k total :交换区总量
0k used : 使用的交换区总量
192772k free : 空闲交换区总量
1518148 avail Mem : 总的可利用内存是多少
注:如果 swap 分区被使用,那么你的内存不够用了。
第 7 行进程信息
PID : 进程 id。
USER : 进程所有者的用户名。
PR : 优先级(由内核动态调整),用户不能修改。
NI : 进程优先级。 nice 值。负值表示高优先级,正值表示低优先级,用户可以自己调整。
VIRT: 虚拟内存,是迚程正在使用的所有内存(ps 中标为 VSZ)
进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
假如进程申请 100m 的内存,但实际只使用了 10m,那么它会增长100m,而不是实际的使用量
RES:是进程所使用的物理内存。实际实用内存(ps 中标为 RSS)
进程当前使用的内存大小,但不包括 swap out
包含其他进程的共享
如果申请 100m 的内存,实际使用 10m,只增长 10m,与 VIRT 相反
关于库占用内存的情况,它只统计加载的库文件所占内存大小
SHR: 共享内存 ,共享内存大小,单位 kb
除 M 了自身进程共享内存,也包括其他进程的共享内存
虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
计算某个进程所占的物理内存大小公式:RES – SHR
swap out 后,它将会降下来
S :进程状态。
D=不可中断的睡眠状态
R=运行中或可运行
S=睡眠中
T=已停止
Z=僵停
%CPU :上次更新到现在的 CPU 时间占用百分比
%MEM :进程使用的物理内存百分比
TIME+: 进程使用的 CPU 时间总计,单位 1/100 秒
COMMAND :命令名/命令行
8.lsof 命令
lsof -p 43641 #一般用于查看进程,在读哪些文件
lsof -i :22 #用于查看端口,或查看开启端口是哪个进程在使用
进程的前台与后台运行:
前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这这个进程也随着消失
后台进程: 其中有一类后台进程也叫守护进程。是运行在后台的一种特殊进程,不受终端控制,它不需要终端的交互。
Linux 的大多数服务器就是用守护进程实现的。比如,Web 服务器 httpd 等。
9.kill 关闭进程
格式:kill 进程号 #关闭单个进程
kill -l =====> 列出所有支持的信号
信号编号 信号名
1) SIGHUP 重新加载配置
2) SIGINT 键盘中断 crtl+c
3) SIGQUIT 退出
9) SIGKILL 强制终止
15) SIGTERM 终止(正常结束),缺省信号
18) SIGCONT 继续
19) SIGSTOP 停止
20) SIGTSTP 暂停 crtl+z
kill 命令格式如:kill -19 3037
killall 命令 如:killall -i sshd #交互式杀死 sshd 进程。
pkill 命令:pkill [选项][信号] 进程名
选项: -t 终端号:按照终端号踢出用户。
进程的优先级管理
优先级取值范围为(-20,19),越小优先级越高, 默认优先级是 0
10.nice -n 命令
#指定程序的运行优先级
格式:nice n command
11.renice 命令
#改变程序的运行优先级
格式:renice -n pid
12.screen命令
#使用 screen 后台实时执行命令备份命令
screen -S test -> 新建一个叫 test 的会话
screen -ls -> 列出弼前所有的会话
screen -r test -> 回到 test 会话
实戓场景:公司晚上需要备份大量数据,我在 xshell 上直接执行备份脚本可以吗? 或直接运行脚本 & 放到后台运行可以吗?
当关了 xshell 后,back.sh & 还在后台执行吗?
screen 概述和安装
Screen 中有会话的概念,,用户可以在一个 screen 会话中创建多个 screen 窗口,在每一个 screen 窗口中就像操作一个 真实的 telnet/SSH 连接窗口那样。
安装 screen 软件包
[root@localhost ~]# yum -y install screen
screen 使用方法
直接在命令行键入 screen 命令回车
[root@localhost ~]# screen
screen 将创建一个执行 shell 的全屏窗口。你可以执行任意 shell 程序,就像在 ssh 窗口中那样
例如,我们在做某个大型的操作但是突然之间断开:
13.使用 screen 后台实时执行命令备份命令
第一步:[root@localhost ~]# screen #进入
第二步:[root@localhost ~]# vim a.txt #执行命令, 或执行你自己需要运行的备份命令
此时想离开一段时间,但还想让这个命令继续运行
第三步:[root@localhost ~]# #在 screen 当前窗口键入快捷键 Ctrl+a+d
[detached from 44074.pts-3.localhost] #分离出来独立的一个会话
半个小时之后回来了,找到该 screen 会话:
第四步:[root@tivf06 ~]# screen -ls #查看已经建立的会话 ID
There is a screen on:
44074.pts-1.tivf06 (Detached)
1 Socket in /tmp/screens/S-root.重新连接会话:
第五步:[root@localhost ~]# screen -r 44074
[root@localhost ~]# exit #不想使用 screen 会话了,执行:exit 退出。