Linux中的进程管理
1.进程的基本概述
- 进程是已启动的可执行程序的运行中实例
- 进程是正在执行当中的程序(命令),每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。
- 程序被执行时,执行人的权限和属性、以及程序的代码都会被加载入内存,操作系统就会给这个进程分配一个 ID 号,我们称为 PID(进程 ID)。
- /proc目录下以数字为名的目录,每一个目录代表一个进程,保存着进程的属性信息,每一个进程的PID是唯一的,就算进程退出了,其他进程也不会占用其PID
进程的组成部分
- 已分配内存的地址空间
- 安全属性,包括所有权凭据和特权
- 程序代码的一个或多个执行线程
- 进程状态
进程的环境
- 本地和全局变量
- 当前调度上下文
- 分配的系统资源,如文件描述符合网络端口
进程的产生
- 现有的父进程复制自己的地址空间(fork)来创建一个新的子进程结构
- 每个新进程分配一个唯一的进程ID(PID),满足跟踪和安全性之需,PID与父进程ID(PPID)是新进程环境的元素
- 任何进程可创建子进程,所有进程都是第一个系统进程的后代,在RHEL中第一个系统进程是systemmd
- 通过fork例程,子进程继承安全性身份,过去和当前的文件描述符,端口和资源特权,环境变量,以及程序代码.随后,子进程可能exec其自己的程序代码.通常,父进程在子进程运行漆面处于睡眠状态,设置一个在子进程完成时发出信号的请求(wait).在退出时,子进程可能已经关闭或丢弃了其资源和环境,剩余的部分被称为僵停,父进程在子进程退出时收到信号而被唤醒,清理剩余结构,然后继续执行其自己的程序代码.
- 当程序运行的时候会由父进程通过 fock(一种分支函数)创建子进程来处理任务;子进程被创建后开始处理任务,当任务处理完毕后就会退出,然后子进程会通知父进程来回收资源;如果子进程处理任务期间,父进程意外终止了,那么这个子进程就变成了僵尸进程
进程的分类
- 前台进程
- 与终端相关的进程,通过终端启动的进程注意: 也可以把在前台启动的进程送往后台, 以守护模式运行
- 守护进程
- daemon, 与终端无关的进程 (如内核), 在系统引导过程中启动的进程
2.进程状态
- Ready:准备状态 命令输入在命令行但是没有执行
- Running(Executing):运行状态 命令已经输入回车执行,
- Ready 又回到准备状态 相当于执行了Ctrl+C命令
- Stopped 已停止状态,相当于执行了Ctrl+Z命令,暂停于内存中,但不会被调度,除非手动启用
- Uninterruptible 不可中断的睡眠 有任务和没任务都不去执行, 一直处于睡眠状态, 不可随时唤醒,只有当 IO 资源 (读写资源) 加载成功后才能唤醒
- Interruptible 可中断的睡眠 没有任务时处于睡眠状态, 有任务被唤醒执行任务 , 可以随时唤醒
- Zombie 僵尸状态 子进程任务完成后没有全部退出,未释放占据的内存,成为僵尸进程
- 进程睡眠的原因:
- 当一个执行中的进程,需要加载额外的IO资源的时候,由于IO设备的速度太慢,所以会转入睡眠状态等待,交出CPU给其他进程,以免浪费剩余执行时间
- 在多任务处理操作系统中,每个CPU(或CPU核心)在一个时间点上处理一个进程,在进程运行时,它对CPU时间和资源分配的直接要求会有变化,进程分配一个状态,它随着环境要求而改变
标志 | 内核定义的状态名称和描述 |
---|---|
R | TASK_RUNNING:进程正在CPU上执行,或者正在等待运行.处于运行中(或可运行)状态时,进程可能正在执行用户例程或内核例程(系统调用),或者已排队并就绪 |
S | TASK_INTERRUPTIBLE:进程处于睡眠状态且正在等待某一条件:硬件请求,系统资源访问或信号.当事件或信号满足该条件时,该进程将返回到运行中 |
D | TASK_UNINTERRUPTIBLE:此进程也在睡眠,但与S状态不同,不会响应传递的信号,仅在特定的条件下使用,其中进程中断可能会导致意外的设备状态 |
K | TASK_KILLABLE:进程处于睡眠状态,与不可中断的D状态相同,但有所修改,允许等待中的任务通过响应信号而被中断(彻底退出).实用程序通过将可中断的进程显示为D状态 |
T | TASK_STOPPED:进程已经被停止(暂停),通常是通过用户或其他进程发出的信号.进程可以通过另一信号返回到运行中状态,继续执行(恢复) |
T | TASK_TRACED:正在被调试的进程也会临时停止,并且共享同一个T状态标志 |
Z | EXIT_ZOMBIE:子进程在退出时向父进程发出信号,除进程身份(PID)之外的所有资源都已释放 |
X | EXIT_DEAD:当父进程清理(获取)剩余的子进程结构时,进程现在已彻底释放,此状态从不会再进程列出实用程序中看到 |
< | 高优先级进程 |
N | 低优先级进程 |
+ | 前台进程组中的进程 |
| | 多线程进程 |
s | 会话进程首进程 |
3.进程优先级
Linux进程调度与多任务
- 现代计算机系统既包含每次只能执行一个指令的低端处理器,也包含高性能超级计算机,这些超级计算机每台配备数百个CPU,每个CPU上具有多个核心,他们可以并行执行数以百计的指令,但是所有这些系统往往具有一个共同点:它们需要进行的进程数量总是超出实际具有的核心数
- 通过时间分片技术,Linux (和其他操作系统) 实际能够运行的进程数 (和线程数) 可以超出可用的实际处理单元数, 操作系统进程调度程序将在单个核心上的进程之间进行快速切换, 从而给用户一种有多个进程在同时运行的印象
- 执行此切换的Linux内核部分称为进程调度程序
进程优先级概述
- 进程优先级高的特点:
- 获得更多的CPU运行时间
- 更优先获得CPU运行的机会
- 进程优先级范围: 0-139, 数字越小, 优先级越高
- 0-99:实时优先级,内核调整
- 100-139:静态优先级,用户可控制
- 要更改进程的优先级可以通过调整进程的 nice 值来实现nice 值越小, 优先级越高
- nice值的范围是(-20,19),-20对应100,19对应139
相对优先级
- 由于不是每种进程都与其他进程同样重要,可告知调度程序为不同的进程使用不同的调度策略,常规系统上运行的大多数进程所使用的调度策略成为SCHED_OTHER(也称为SCHED_NORMAL),但还有一些其他策略可用于不同的目的
- 由于并非所有进程都以同样的方式创建,可谓才用SCHED_NORMAL策略运行的进程指定相对优先级,此优先级称为进程的NICE值,一个已成可以有40种不同级别的NICE值
- nice级别的范围是从-20到19,默认情况下,进程将进程其父进程的nice基本,通常为0
- nice级别越高,表示优先级越低(该进程容易将其CPU使用量让给其他进程)
- nice级别越低,表示优先级越高(该进程更加不倾向于让出CPU)
- 如果不存在资源争用(例如当活动进程数少于可用CPU核心数时),即使nice级别高的进程也仍将使用它们可使用的所有可用CPU资源,但当请求CPU时间的进程数超过可用核心数时,nice级别较高的进程将比nice级别较低的进程收到更少的CPU时间
nice级别与权限
- 为很占CPU资源的进程设置较低的nice级别可能会对同一系统上运行的其他进程的性能造成负面影响,所以仅允许root用户设置父nice级别以及降低现有进程的nice级别
- 普通非特权用户仅允许设置正的nice级别,只能对现有进程提升nice级别,而不能降低nice级别
进程优先级调整
- 进程优先级调整:调整nice值
- renice NI PID(renice 3 3095) 调整已经启动的进程的nice值
- nice -n NI command 在启动时指定nice值
4.控制作业
- 作业控制是shell的一种功能,它允许单个shell实例运行和管理多个命令
- 作业在shell提示符中输入的每个管道相关联,该管道中的所有进程均是作业的一部分,并且是同一个进程组的成员(如果在shell提示符中仅输入了一条命令,则这条命令可视为命令的最小管道,该命令将是该作业的唯一成员)
- 一次只能有一个作业从特定终端窗口读取输入和键盘生成的信号.属于该作业的进程是该控制终端的前台进程
- 该控制终端的后台进程是与该终端相关联的任何其他作业的成员,终端的后台进程无法从终端读取输入或接受键盘生存的终端,但可以写入终端,后台中的作业可能已停止(暂停),也可能正在运行,如果某个正在运行的后台作业尝试从终端读取内容,则该作业将自动暂停
- 每个终端是其自身的会话,并且可以具有一个前台进程和多个独立的后台进程,一个作业只能属于一个会话,也就是属于其控制终端的对话
作业分类
- Linux作业分为前台作业与后台作业两种
- 前台作业: 可以通过终端启动, 且启动后一直占据了命令提示符
- 后台作业: 可以通过终端启动, 但启动之后, 释放命令提示符, 后续的操作在后台完成
- 此类作业虽然被送往后台运行,但其依然与终端相关,如果希望送往后台后,剥离与终端的关系需要执行(nohup COMMAND &)
在后台运行作业
- 在命令后加上一个&表示将前台的命令放在后台运行
- sleep 1000 &
- nohup:让后台工作在离开操作终端时,也能够正确的在后台执行;和 &一起使用。
- 注意:使用 nuhup 命令放入后台运行的命令(程序)一但断开终端,用 jobs 命令就查看不到,需要用 ps 或 top 命令查看。
- nohup sleep 500s &
- screen:非常推荐使用的将命令放入后台运行的工具;它的作用是可以新开会话然后将会话以及会话中执行的命令放入后台运行,并且可以随时进行会话切换;哪怕终端断开会话也不会终止。
- -S <会话名称> //新开一个会话并指定该会话的名称
- Ctrl + a + d //此快捷键可以切换回终端,会话会被放入后台运行
- -ls //显示所有的放入后台的终端
- -r <会话名称或 id> //进入指定的会话
- Ctrl + d //此快捷键可以终止会话
- 演示实例:
//新开一个名为ping的会话
[root@hzz ~]# screen -S ping
//在此会话中ping百度,然后使用快捷键 Ctrl + a + d 将此会话放入后台
[root@hzz ~]# ping www.baidu.com
PING www.a.shifen.com (112.80.248.76) 56(84) bytes of data.
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=1 ttl=53 time=12.7 ms
//查看放入后台的会话
[root@hzz ~]# screen -ls
There is a screen on:
346898.ping (Detached)
1 Socket in /run/screen/S-root.
//进入放入后台的会话
[root@hzz ~]# screen -r ping
- jobs:查看后台运行的命令有哪些
-
- 代表命令将默认操作的作业
-
- 代表命令将第二个默认操作的作业
-
- Ctrl+Z将前台进程发送到后台并暂停
- fg:将后台作业调到前台运行,未指定时默认是第一个进程,指定命令 fg %num
- bg:将停止的作业重新运行 bg %num
- kill %n 杀死某个进程
5.进程间通信(IPC:Inter Process Communication)
- 进程间通信方式:
- 同一主机
- 共享内存
- 信号:Signal
- 不同主机
- rpc:remote procecure call
- 基于socket实现进程间通信
- 同一主机
使用信号控制进程
- 信号是传递至进程的软件中断.信号向执行中的程序报告事件,生成信号的事件可以是错误或外部事件(如I/O请求或计时器过期),或者来自于明确请求(如使用信号发送命令)
- 下表列出了系统管理员用于日常进程管理的基本信号,通过短名称(HUP)或正确名称(SIGHUP)指代信号.
- 指定一个信号的方法
- 信号号码(数字标识):kill -1,不指定时默认为15
- 信号完整名称:kill -SIGKILL
- 信号简写名称:kill -TREM 或 kill -KILL
- 指定一个信号的方法
信号编号ID | 短名称 | 定义 | 用途 |
---|---|---|---|
1 | HUP | 挂起 | 让一个进程不用重启就可以重读配置文件,并让新的配置信息生效 |
2 | INT | 键盘中断 | 中断一个前台进程,Ctrl+C就是用的SIGNINT信号 |
9 | KILL | 强制中断,无法拦截 | 导致立即终止程序,无法被拦截,忽略或处理 |
15 | TERM | 终止,可以拦截 | 导致程序终止,但和SIGKILL不同,可以被拦截,忽略或处理,要求程序终止的友好方式,允许自我清理 |
18 | CONT | 恢复执行,不能拦截 | 可以让暂停的进程恢复执行。本信号不能被阻断 |
19 | STOP | 暂停,不能拦截 | 该信号可以暂停前台进程,相当于输入 ctrl+z 快捷键。本信号不能被阻断 |
- 用户可以中断自己的进程,但只有root才能终止由其他人拥有的进程
- kill 命令根据 ID 向进程发送信号. 虽然其名称为 kill, 但该命令可以用于发送任何信号, 而不仅仅是终止程序的信号
- kill [-SIGNAL] PID命令:
- kill -l 显示所有可用的信号
- kill SIGBUS
- killall name 杀死所有配到的进程名
- kill -l 显示所有可用的信号
6.进程管理命令
- Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
ps命令:显示进程信息(process state)
-
包括以下内容
- 用户识别符(UID),它可以确定进程的特权
- 唯一进程识别符(PID)
- CPU和已经花费的实时时间
- 进程在各种位置上分配的内存数量
- 进程的位置STDOUT,称为控制终端
- 当前的进程状态
-
支持三种选项格式:
- UNIX(POSIX)选项,可以分组但必须以连字符开头
- BSD选项,可以分组但不可与连字符同用
- GNU长选项,以双连字符开头
-
注意:
- exiting或defunct表示僵尸进程
- 加了[]中括号的,表示内核进程,通常位于顶部
-
常用选项:
- a 显示所有与终端有关的
- u 显示进程是由哪个用户启动的
- x 显示所有与终端无关的进程
- f 查看进程父子关系
- k 根据进程属性排序,加-表示倒序
- -e 显示所有进程,与-A效果相同
- -l 以长格式显示
- -f 显示更详细的完整格式的进程信息
- -u 显示指定用户启动的进程
- -o 根据自己的需求选择字段
- ps -o user,pid 表示只显示用户和PID
- -F 显示更详细的完整格式的进程信息
- -H 以进程层级格式显示进程相关信息
- ps aux:
- USER(用户,该进程是由哪个用户产生的)
- PID(该进程的ID号)
- %CPU(CPU使用百分比)
- %MEM(内存百分比)
- VSZ(虚拟内存集,该进程向系统申请的内存空间,单位 KB)
- RSS(常驻内存集,物理内存,该进程实际使用的内存空间,单位 KB)
- TTY(该进程是在哪个终端中运行的)
- STAT(进程状态)
- D不可唤醒;R正在运行;S睡眠中可唤醒;T暂停;X死亡;Z僵尸;<高优先级;N低优先级;L被锁入内存;s进程发起者;Ss父进程;l多线程;+前台进程
- START(进程开启的时间)
- TIME(运行累计时间,该进程占用 CPU 的运算时间)
- COMMAND(产生此进程的命令)
- ps -elf:
- F(进程标志,1代表可以复制但不能执行,4代表可以使用超级用户权限)
- S(进程状态)
- UID(用户)
- PID(进程号)
- PPID(父进程号)
- C(运行的CPU编号,CPU使用率,单位百分比)
- PRI(优先级)
- NI(nice值)
- ADDR(地址,在内存中的位置)
- SZ(占用内存大小)
- WCHAN(-代表正在运行)
- STIME(进程的启动时间)
- TTY(终端)
- TIME(累计运行时间)
- CMD(命令)
- ps:
- PSR(进程运行在哪个CPU核心上)
- RTPTRIO(实时优先级)
- ps aux:
-
pstree:显示进程树
- -p 显示进程pid号
- -u 显示进程所用户
-
pgrep:以grep风格指定只显示哪些进程,在当前系统中查找符合某些特性的进程,只显示进程号
- pgrep sshd pgrep atd
-
pidof:根据进程名查找其pid号
- pidof sshd pidof atd
vmstat:虚拟内存状态查看命令
- vmstat [options] [delay [count]]
- -s 显示内存的统计数据
- 直接执行vmstat只能查看当前内存状态,vmstat 3 代表每3秒刷新一次,vmstat 2 4代表每2秒刷新一次,刷新4次后退出
- procs:
- r(running)表示等待运行的队列长度,也即等待运行的进程的个数
- b(block)表示阻塞队列的长度,也即处于不可中断睡眠态的进程个数
- memory:
- swpd 交换(虚拟)内存的使用总量
- free 空闲物理内存总量
- buffer 用于buffer的内存总量
- cache 用于cache的内存总量
- swap:
- si(swap in) 表示从物理内存有多少页面换进swap,也即数据进入swap的数据速率(kb/s)
- so(swap out) 表示从swap有多少页面换进物理内存,也即数据离开swap的数据速率(kb/s)
- io:
- bi(block in) 表示磁盘块有多少个被调入内存中,也即从块设备读入数据到系统的速率(kb/s)
- bo(block out) 表示有多少个磁盘块从内存中被同步到硬盘上去了,也即保存数据至块设备的速率(kb/s)
- system:
- in(interrupts) 表示中断的个数,也即中断速率(kb/s)
- cs(context switch) 表示上下文切换的次数,也即进程切换速率(kb/s)
- CPU:
- us 表示用户空间
- sy 表示内核空间
- id 表示空闲百分比
- wa 表示等待IO完成所占据的时间百分比
- st 表示steal,被虚拟化技术偷走的时间,比如虚拟机
lsof命令
lsof命令用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
lsof [选项]
-a //列出打开文件存在的进程;
-p <进程号> //列出指定进程号所打开的文件;
-c <进程名> //列出指定进程所打开的文件;
-d <文件> //列出占用该文件的进程;
+d <目录> //列出目录下被打开的文件;
+D <目录> //递归列出目录下被打开的文件;
-i <条件> //列出网络连接情况(4、6、协议、:端口、 @ip );
-u //列出指定用户UID号进程详情;
- lsof输出各列信息的意义如下:
- COMMAND 进程的名称
- PID 进程标识符
- PPID 父进程标识符(需要指定-R参数)
- USER 进程所有者
- PGID 进程所属组
- FD 进程描述文件
- DEVICE 指定磁盘的名称
- SIZE 指定文件的大小
- NODE 索引节点(文件在磁盘上的标识)
- NAME 打开文件的确切名称
演示示例:
#列出所有打开的文件,如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位
[root@hzz ~]# lsof
# 查看谁正在使用某个文件
[root@hzz ~]# lsof /filepath/file
#递归查看某个目录的文件信息,使用了+D,对应目录下的所有子目录和文件都会被列出
[root@hzz ~]# lsof +D /filepath/filepath2/
#对比使用+D选项,遍历查看某个目录的所有文件信息的方法
[root@hzz ~]# lsof | grep ‘/filepath/filepath2/’
#列出某个用户打开的文件信息,-u 选项,u其实是user的缩写
[root@hzz ~]# lsof -u username
#列出某个程序所打开的文件信息,-c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成 lsof | grep mysql,但是第一种方法明显比第二种方法要少打几个字符
[root@hzz ~]# lsof -c mysql
#列出多个程序多打开的文件信息
[root@hzz ~]# lsof -c mysql -c apache
#列出某个用户以及某个程序所打开的文件信息
[root@hzz ~]# lsof -u test -c mysql
#列出除了某个用户外的被打开的文件信息,^这个符号在用户名之前,将会把是root用户打开的进程不让显示
[root@hzz ~]# lsof -u ^root
#通过某个进程号显示该进行打开的文件
[root@hzz ~]# lsof -p 1
#列出多个进程号对应的文件信息
[root@hzz ~]# lsof -p 123,456,789
#列出除了某个进程号,其他进程号所打开的文件信息
[root@hzz ~]# lsof -p ^1
#列出所有的网络连接
[root@hzz ~]# lsof -i
#列出所有tcp 网络连接信息
[root@hzz ~]# lsof -i tcp
#列出所有udp网络连接信息
[root@hzz ~]# lsof -i udp
#列出谁在使用某个端口
[root@hzz ~]# lsof -i :3306
#列出谁在使用某个特定的udp端口
[root@hzz ~]# lsof -i udp:55
#列出谁在使用某个特定的tcp端口
[root@hzz ~]# lsof -i tcp:80
#列出某个用户的所有活跃的网络端口
[root@hzz ~]# lsof -a -u test -i
#某个用户组所打开的文件信息
[root@hzz ~]# lsof -g 5555
利用lsof恢复删除的文件:
当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数库的活动事务日志。有时可以通过lsof来恢复这些文件;当进程打开了某个文件,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的录索引节点。
在/proc目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。
#假如由于误操作将/var/log/messages文件删除掉了,那么这时需要将/var/log/messages文件恢复。
#首先使用lsof来查看当前是否有进程打开/var/logmessages文件
[root@hzz ~]# lsof |grep /var/log/messages
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)
#从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。
#因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息。
[root@hzz ~]# head -n 10 /proc/1283/fd/2
Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (rooteverestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007
Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map:
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)
7.监控进程活动
IO负载
-
负载平均值代表一段时间内感知的系统负载.Linux通过预期服务等待时间的表示来实施平均负载计算
-
Linux不仅计算进程数,也作为独立的任务计算线程数,运行中线程和等待I/O资源的线程的CPU请求队列对应于R和D进程状态,等待I/O包括处于睡眠而等待预期磁盘和网络响应的任务
-
负载均衡属于全局计数器计算,是所有CPU的总数和,由于从睡眠返回的任务可能会重新调度到不同的CPU,难以精确的每CPU技术,但累计数的准确度可以保障,显示的平均负载代表所有的CPU
-
一些UNIX系统仅考虑CPU使用率或运行队列长度来指示系统负载,由于具有空闲CPU的系统可能会因为磁盘或网络资源忙而遇到很长时间的等待,因此Linux负载平均值中包含了对I/O的考量,遇到负载平均值很高但CPU活动很低时,请检查磁盘或网络活动
-
查看 CPU 核心数命令: grep 'model name' /proc/cpuinfo
-
Linux 中可以使用 top,uptime 命令显示负载平均值的情况
-
uptime命令
- 22:35:39 up 7:06, 3 users, load average: 0.00, 0.01, 0.05
- 此处的load average代表负载平均值,这三个值代表最近1,5和15分钟的负载情况
- 22:35:39 up 7:06, 3 users, load average: 0.00, 0.01, 0.05
-
将显示的负载平均值除以系统中的逻辑CPU数,当值低于1表示资源利用率较好,等待时间很短,当值高于1表示资源饱和,而且有一定服务等待时间
-
空闲CPU队列的负载数为0,每个就绪和等待的线程使技术增加1,总队列数为1时,资源(CPU,磁盘或网络)正在使用中,但没有请求把时间花在等待上,增加的请求数会累积该技术,但由于许多请求可以在时限内处理,资源的使用率会跟高,而等待时间不会
-
因为磁盘或网络资源忙碌等待I/O而处于睡眠的进程包含在该计数内,而且使负载平均值增大,虽然不能表示CPU使用率,队列数依然表明用户和程序正在等待资源服务.
-
在资源饱和前,平均负载将保持在1以下,因为几乎不会在队列中发现等待的任务,只有资源饱和导致请求留在排队状态并且被负载计算例程技术时,负载平均才会增大,当资源使用率接近100%时,每个增加的请求将开始遭遇服务等待时间
实时进程监控
- top命令可以用于实现全屏动态显示系统信息
- 常用选项
- -d 设置延迟时间 ,top -d 1 表示每隔一秒刷新一次,默认每隔5秒刷新
- -n 指定执行次数
- -b 批模式翻屏显示,默认只实时显示一屏,若要显示后面的进程信息则可以使用-b选项,与-n 数字 合用可以指定显示翻几屏
- -p 指定pid
- -s 在安全模式中运行,避免在交互模式中出现错误
- -u 只监听某个用户的进程
- top 命令交互式子命令
- M 根据驻留内存大小进行排序,默认为根据CPU百分比排序
- P 根据CPU使用百分比进行排序
- N 以PID进行排序
- T 根据累计时间(占据CPU时长)进行排序
- l 是否显示平均负载和启动时间
- t 是否显示进程和 CPU 状态相关信息
- m 是否显示内存相关信息
- c 是否显示完整的命令行信息
- k 终止某个进程
- r 按照 PID 号,给某个进程重设优先级(Nice)值
- 1 显示所有 CPU 信息
- s 修改刷新时间间隔
- q 退出 top 命令
- 参数详解
- load average:1分钟,5分钟,15分钟的平均负载
- load average CPU队列中等待运行的任务的个数
- cpu(s):多颗CPU平均负载,按1键显示每颗CPU平均负载
- us 表示用户空间
- sy 表示内核空间
- ni 表示调整nice值,cpu占用的比率
- id 表示空闲百分比
- wa 表示等待IO完成所占据的时间百分比
- hi 表示hard interrupt,硬件中断占据的时间百分比
- si 表示软中断占据的时间百分比
- st 表示steal,被虚拟化技术偷走的时间
- PR 优先级
- NI nice值
- VIRT 虚拟内存集
- RES 常驻内存集
- SHR 共享内存大小
- S 进程状态
- 常用选项