您当前的位置: 首页 >  编程语言

Linux—进程管理

Linux 进程管理 1、进程管理介绍 1.1 什么是进程?

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 简而言之:进程就是运行中的程序。

1.2 什么是程序?

程序是人使用计算机语言编写的可以实现特定目的或解决特定问题的代码集合。

1.3 进程的组成部分 已分配内存的地址空间 安全属性,包括所有权凭据和特权 程序代码的一个或多个执行线程 进程状态 1.4 进程的环境 本地和全局变量 当前调度上下文 分配的系统资源,如文件描述符和网络端口 1. 5进程管理的作用 判断服务器健康状态:运维工程师最主要的工作就是保证服务器安全稳定的运行。理想的状态是,在服务器出现问题,但是还没有造成服务器宕机或停止服务时,就人为干预解决了问题。进程管理最主要的工作就是判断服务器当前运行是否健康,是否需要人为干预。如果服务器的 CPU 占用率、内存占用率过高,就需要人为介入解决问题了。 查看系统中所有的进程:我们需要查看系统中所有正在运行的进程,通过这些进程可以判断系统中运行了哪些服务,是否有非法服务运行。 杀死进程:这是进程管理中最不常用的手段,当我需要停止服务时,会通过正确关闭命令来停止服务(如 apache 服务可以通过 systemctl stop apache 来关闭)。只有当正常终止进程的手段失效的情况下,才会考虑使用 kill 命令杀死进程(你不是杀手,不要什么进程都用 kill来终止,否则非常容易导致服务器崩溃)。 1.6 进程的生命周期

当程序运行的时候会由父进程通过fock创建子进程来处理任务;子进程被创建后开始处理任务,当任务处理完毕后就会退出,然后子进程会通知父进程来回收资源;如果子进程处理任务期间,父进程意外终止了,那么这个子进程就变成了僵尸进程。

1.7 进程的分类 前台进程:与终端相关的进程,通过终端启动的进程 注意:也可把在前台启动的进程送往后台,以守护模式运行 守护进程:daemon,与终端无关的进程(如内核),在系统引导过程中启动的进程 1.8 进程状态
Excuting                    //运行态
Ready                       //中断态,也可以称作睡眠态
Uninterruptible sleep       //不可中断的睡眠。不可随时唤醒,只有当IO资源加载成功后才能唤醒
Interruptible sleep         //可中断的睡眠。可随时唤醒
Zombie                      //僵尸进程。正常运行结束了,但是不释放占据的内存
Stopped                     //停止态,暂停于内存中,但不会被调度,除非手动启动之

进程睡眠的原因: 当一个执行中的进程,需要加载额外的IO资源的时候,由于IO设备的速度太慢,所以会转入睡眠状态等待,交出CPU给其他进程,以免浪费剩余执行时间

Linux进程状态

标志 内核定义的状态名称和描述 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 低优先级进程 + 前台进程组中的进程 l 多线程进程 s 会话进程首进程 2、进程优先级 2.1 linux进程调度与多任务

现代计算机系统中既包含每次只能执行一个指令的低端处理器,也包含高性能超级计算机,这些超级计算机每台配备数百个CPU,每个CPU上具有多个核心,它们可以并行执行数以百计的指令。但是所有这些系统往往具有一个共同点:它们需要运行的进程数量总是超出实际具有的核心数。

通过时间分片技术,Linux(和其他操作系统)实际能够运行的进程数(和线程数)可以超出可用的实际处理单元数。操作系统进程调度程序将在单个核心上的进程之间进行快速切换,从而给用户一种有多个进程在同时运行的印象。

执行此切换的Linux内核部分称为进程调度程序.

2.2 进程优先级 进程优先级范围:0-139,数字越小,优先级越高 0-99:实时优先级,内核调整 100-139:静态优先级,用户可控制 进程优先级高的特点: 获得更多的CPU运行时间 更优先获得CPU运行的机会

要修改进程的优先级可以通过调整进程的nice值来实现,nice值越小,优先级越高: nice值的范围是(-20,19),-20对应100,19对应139

2.3 相对优先级

由于不是每种进程都与其他进程同样重要,可告知调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略称为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时间

2.4 nice级别与权限

为很占CPU资源的进程设置较低的nice级别可能会对同一系统上运行的其他进程的性能造成负面影响,所以仅允许root用户设置负nice级别以及降低现有进程的nice级别。

普通非特权用户仅允许设置正的nice级别。只能对现有进程提升nice级别,而不能降低nice级别

2.5 进程优先级调整

进程优先级调整:调整nice值

//调整已经启动的进程的nice值:
    renice NI PID(例:renice 3 3704)
//在启动时指定nice值:(-20,19)
    nice -n NI COMMAND
3、系统状态和进程管理 3.1 ps命令

ps(process state)命令用于列出当前的进程。可以显示详细的进程信息,包括:

用户识别符(UID),它确定进程的特权 唯一进程识别符(PID) CPU和已经花费的实时时间 进程在各种位置上分配的内存数量 进程的位置STDOUT,称为控制终端 当前的进程状态

ps支持的选项格式:

UNIX(POSIX)选项,可以分组但必须以连字符开头 BSD 选项,可以分组但不可与连字符同用

注意:

加了 [ ] 的,表示内核进程 exiting或defunct表示僵尸进程
[root@zsl ~]# ps aux
#查看系统中所有进程,使用BSD操作系统格式

[root@zsl ~]# ps -ef    /常用的选项ps -ef
#查看系统中所有进程,使用Linux标准命令格式。

选项:
a:	//显示一个终端的所有进程,除了会话引线
u:	//显示进程的归属用户及内存的使用情况
x:	//显示没有控制终端的进程
f:	//查看进程父子关系
k:	//根据进程属性排序,加-表示倒序

-e      //显示所有进程,与-A效果相同
-f      //显示更详细的完整格式的进程信息
-l      //显示更多信息
-u      //显示指定用户启动的进程
-o      //根据自己的需要选择要显示的字段

[root@zsl ~]# ps auxk -%cpu		//根据CPU使用率进行排序,从高到低
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
rngd         883  2.9  0.8 160108  6512 ?        Ssl  14:02   0:02 /sbin/rngd -f --fill-watermark=0

[root@zsl ~]# ps -o pid,comm,ni		//表示只显示进程号,命令,nice值三个字段
    PID COMMAND          NI
   1507 bash              0
   1535 ps                0

ps aux输出结果

[root@zsl ~]# ps aux		#查看系统中所有的进程
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.5  1.6 179140 13524 ?        Ss   14:02   0:01 /usr/lib/systemd/systemd --switched-ro
root           2  0.0  0.0      0     0 ?        S    14:02   0:00 [kthreadd]

输出 含义 USER 该进程是由哪个用户产生的; PID 进程的 ID 号; %CPU 该进程占用 CPU 资源的百分比,占用越高,进程越耗费资源; %MEM 该进程占用物理内存的百分比,占用越高,进程越耗费资源; VSZ 虚拟内存,该进程向系统申请的内存空间,单位 KB; RSS 物理内存,该进程实际使用的内存空间,单位 KB; TTY 该进程是在哪个终端中运行的。其中 tty1-tty7 代表本地控制台终端(可以通过alt+F1-F7 键切换不同的终端),tty1-tty6 是本地的字符界面终端,tty7 是图形终端。pts/0-255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用的是 pts/0 终端,第二个远程连接占用 pts/1,依次增长; STAT 进程状态; START 该进程的启动时间; TIME 该进程占用 CPU 的运算时间,注意不是系统时间; COMMAND 产生此进程的命令; STAT进程状态 状态含义 D 不可被唤醒的睡眠状态,通常用于 I/O 情况 R 该进程正在运行 S 该进程在睡眠状态,可被唤醒 T 暂停状态,可能是在后台暂停或进程在出错状态 X 死掉的进程(应该不会出现) Z 僵尸进程。进程已经终止,但是部分程序还在内存当中。 < 高优先级,S<表示优先级较高的进程 N 低优先级,SN表示优先级较低的进程 L 被锁入内存 s 子进程发起者,Ss表示父进程 l 多线程(小写 L),Sl表示进程以多线程运行 + 前台进程,R+表示该进程在前台运行,一旦终止,数据丢失

ps -lef输出结果

[root@zsl ~]# ps -lef
F S UID          PID    PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root           1       0  0  80   0 - 44785 do_epo 14:02 ?        00:00:01 /usr/lib/systemd/systemd -
1 S root           2       0  0  80   0 -     0 -      14:02 ?        00:00:00 [kthreadd]
输出 含义 F 进程标志,说明进程的权限,常见的标志: 1:进程可以复制,但是不能执行 4:进程使用超级用户权限 S 进程状态。具体的状态和“ps aux”命令中 STAT 状态一致 UID 进程是哪个 UID 用户调用运行的 PID 进程的 ID 号 PPID 父进程的 ID 号 C 该进程的 CPU 使用率,单位是百分比 PRI 进程的优先级,数值越小该进程优先级越高,越快被 CPU 执行;动态值由内核决定 NI 进程的优先级,也是数值越小越早被执行;静态值管理员手动设置,NI值的范围-20到19之间; 调整已经启动的进程的nice值的命令:renice NI PID 在启动时指定nice值的命令:nice -n 数字 COMMAND ADDR 该进程在内存的哪个位置 SZ 该进程占用多大内存 WCHAN 该进程是否运行。“-”代表正在运行 STIME 该进程的启动时间 TTY 该进程由哪个终端产生 TIME 该进程占用 CPU 的运算时间,注意不是系统时间 CMD 产生此进程的命令名 3.2 pstree命令

pstree命令将所有进程以树状图显示

[root@zsl ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─agetty
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─firewalld───{firewalld}
        ├─polkitd───5*[{polkitd}]
        ├─rhsmcertd
        ├─rngd───{rngd}
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───sshd───bash───pstree
        ├─sssd─┬─sssd_be
        │      └─sssd_nss
        ├─systemd───(sd-pam)
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───3*[{tuned}]
        └─vmtoolsd───2*[{vmtoolsd}]
3.3 pidof命令

根据进程名查找其PID号

[root@zsl ~]# pidof sshd
1506 1491 962
[root@zsl ~]# pidof atd

3.4 pgrep命令

以grep风格指定只显示哪些进程,在当前系统中找符合某些特性的进程。只显示进程号

[root@zsl ~]# pgrep sshd
962
1491
1506
[root@zsl ~]# ps -ef|grep sshd
root        1491     962  0 14:03 ?        00:00:00 sshd: root [priv]
root        1506    1491  0 14:03 ?        00:00:00 sshd: root@pts/0
root        1571    1507  0 14:22 pts/0    00:00:00 grep --color=auto sshd
3.5 vmstatml

虚拟内存状态查看命令

//语法:vmstat [options] [delay [count]]
//例:
vmstat 2        //表示每2秒刷新一次
vmstat 2 5      //表示每2秒刷新一次,刷新5次后退出
                        
//常用的选项:
    -s          //显示内存的统计数据
    
[root@zsl ~]# vmstat 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 358828   3164 208976    0    0   128    27   78  241  1  1 98  0  0

procs:进程信息字段:

字段 含义 r 等待运行的进程数,数量越大,系统越繁忙。 b 阻塞队列长度,也即不可被唤醒的进程数量,数量越大,系统越繁忙。

memory:内存信息字段:

字段 含义 swpd 虚拟内存的使用情况,单位 KB。 free 空闲的内存容量,单位 KB。 buff buffer缓冲的内存容量,单位 KB。 cache cache缓存的内存容量,单位 KB。

swap:交换分区的信息字段:

字段 含义 si 从磁盘中交换到内存中数据的数量,单位 KB。 so 从内存中交换到磁盘中数据的数量,单位 KB。此两个数越大,证明数据需要经常在磁盘和内存之间交换,系统性能越差。

io:磁盘读写信息字段:

字段 含义 bi 从块设备读入数据的总量,单位是块。 bo 写到块设备的数据的总量,单位是块。此两个数越大,代表系统的 I/O 越繁忙。

system:系统信息字段:

字段 含义 in 每秒被中断的进程次数。 cs 每秒钟进行的事件切换次数。此两个数越大,代表系统与接口设备的通信非常繁忙。

CPU:CPU 信息字段:

字段 含义 us 非内核进程消耗 CPU 运算时间的百分比。 sy 内核进程消耗 CPU 运算时间的百分比。 id 空闲 CPU 的百分比。 wa 等待 I/O 所消耗的 CPU 百分比。 st 被虚拟机所盗用的 CPU 占比。 3.6 fg命令

fg命令可以将后台的工作恢复到前台运行

fg %工作号
参数:
%工作号          %号可以省略,但是注意工作号和 PID 的区别。

[root@zsl ~]# sleep 500s &
[1] 117170
[root@zsl ~]# fg %1
sleep 500s
3.7 bg命令

bg命令可以恢复后台暂停的工作,让其在后台继续运行

bg %工作号
参数:
%工作号          %号可以省略,但是注意工作号和 PID 的区别。

[root@zsl ~]# sleep 500s
^Z
[1]+  已停止               sleep 500s
[root@zsl ~]# bg %1
[1]+ sleep 500s &
[root@zsl ~]# jobs
[1]+  运行中               sleep 500s &
3.8 nohup命令

nohup 命令的作用就是让后台工作在离开操作终端时,也能够正确的在后台执行;和 &一起使用。

注意:使用nuhup命令放入后台运行的命令(程序)一但断开终端,用 jobs 命令就查看不到,需要用 ps 或 top 命令查看

nohup 命令 &
#nohup 和 & 中间加上命令,表示将命令放入后台运行,断开终端也不会终止。

[root@zsl ~]# nohup sleep 500s &
[1] 46544
[root@zsl ~]# nohup: 忽略输入并把输出追加到"nohup.out"

[root@zsl ~]# ps -ef | grep "sleep 500s" | grep -v "color"
root      46544  35267  0 19:15 pts/0    00:00:00 sleep 500s
4、控制作业 4.1 作业与会话

什么是作业?

作业控制是shell的一种功能,它允许单个shell实例运行和管理多个命令

作业在sehll提示符中输入的每个管道相关联、该管道中的所有进程均是作业的一部分,并且是同一个进程组的成员

如果在shell提示符中仅输入了一条命令,则这条命令可视为命令的最小管道;该命令将是该作业的唯一成员

一次只能有一个作业从特定终端窗口读取输入和键盘生成的信号。属于该作业的进程是该控制终端的前台进程

什么是会话?

会话是一个或多个进程组的集合

4.2 作业分类

Linux作业分为前台作业与后台作业两种。其各自的特点如下:

前台作业:通过终端启动,且启动后一直占据了命令提示符 后台作业:可以通过终端启动,但启动之后,释放命令提示符,后续的操作在后台完成 此类作业虽然被送往后台运行,但其依然与终端相关。如果希望送往后台后,剥离与终端的关系需要执行(nohup COMMAND &) 4.3 后台运行作业演示
//在命令后跟上&符号可以生成一个后台作业
[root@zsl ~]# sleep 100&
[1] 1583

//jobs命令用于显示当前所有的后台作业
[root@zsl ~]# jobs 
[1]+  Running                 sleep 100 &

//fg命令用于将后台作业调至前台运行

//当只有一个后台作业时,直接使用fg命令,不跟任何参数即可将后台作业调至前台运行,但是当有多个作业时则必须跟上%+作业号,也就是上面命令执行结果中以[]括起来的数字。
[root@zsl ~]# fg
sleep 300
^C
[root@zsl ~]# fg %2
sleep 500
^C

//使用ctrl+z可将前台进程发送到后台,此时作业将处于停止状态
[root@zsl ~]# fg %1
sleep 1000
^Z
[1]+  Stopped                 sleep 1000

//使用bg命令+作业号可使后台已停止的作业重新运行
[root@ZSL ~]# bg %1
[1]+ sleep 1000 &
[root@ZSL ~]# jobs
[1]-  Running                 sleep 1000 &
[2]+  Running                 sleep 500 &

//kill加上作业号可以手动杀死指定作业
[root@ZSL ~]# jobs
[1]-  Running                 sleep 1000 &
[2]+  Running                 sleep 500 &
[root@zsl~]# kill %1
[1]-  Terminated              sleep 1000
[root@zsl ~]# jobs
[2]+  Running                 sleep 500 &

//jobs命令的结果中
    +     //命令将默认操作的作业
    -     //命令将第二个默认操作的作业
5、进程间通信

进程间通信(IPC:Inter Process Communication)

进程间通信方式:

同一主机 共享内存 信号:Signal 不同主机 rpc:remote procecure call 基于socket实现进程间通信 6、使用信号控制进程

信号是传递至进程的软件中断。信号向执行中的程序报告事件。生成信号的事件可以是错误或外部事件(如I/O请求或计时器过期),或者来自于明确请求(如使用信号发送命令)

下表列出了系统管理员用于日常进程管理的基本信号。请通过短名称(HUP)或正确名称(SIGHUP)指代信号。

指定一个信号的方法: 信号号码(数字标识):kill -1 信号完整名称:kill -SIGKILL 信号简写名称:kill -TERM或kill -KILL或kill -INT或kill -HUP

基本进程管理信号

信号编号 ID 短名称 定义 用途 1 HUP 挂起 让一个进程不用重启就可以重读配置文件,并让新的配置信息生效 2 INT 键盘中断 中断一个前台进程。ctrl+c就是用的SIGINT信号 9 KILL 中断,无法拦截 导致立即终止程序。无法被拦截、忽略或处理 15 默认值 TERM 终止 导致程序终止。和SIGKILL不同,可以被拦截、忽略或处理。要求程序终止的友好方式,允许自我清理

用户可以中断自己的进程,但只有root才能终止由其他人拥有的进程。

kill命令根据ID向进程发送信号。虽其名称为kill,但该命令可用于发送任何信号,而不仅仅是终止程序的信号

//语法: kill [-SIGNAL] PID ...

//显示所有可用的信号(可使用man 7 signal查看帮助信息)
[root@zsl ~]# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

//killall COMMAND:killall后面跟进程名,表示将匹配到的以进程名为名的进程全部杀死
[root@zsl ~]# ps -ef|grep sleep
root        1589    1507  0 14:50 pts/0    00:00:00 sleep 1000
root        1599    1507  0 14:59 pts/0    00:00:00 grep --color=auto sleep
[root@zsl ~]# killall sleep
[1]+  Terminated              sleep 1000
[root@zsl ~]# ps -ef|grep sleep
root        1602    1507  0 14:59 pts/0    00:00:00 grep --color=auto sleep
7、监控进程活动 7.1 IO负载

负载平均值代表一段时间内感知的系统负载。Linux通过预期服务等待时间的表示来实施平均负载计算。

Linux不仅计算进程数,也作为独立的任务计算线程数。运行中线程和等待I/O资源的线程的CPU请求队列对应于R和D进程状态。等待I/O包括处于睡眠而等待预期磁盘和网络响应的任务。

负载数属于全局计数器计算,是所有CPU的总和数。由于从睡眠返回的任务可能会重新调度到不同的CPU,难以精确的每CPU计数,但累计数的准确度可以保障。显示的平均负载代表所有的CPU。

//查看cpu核心数
[root@zsl ~]# grep 'model name' /proc/cpuinfo 
model name	: AMD Ryzen 5 4600H with Radeon Graphics

一些UNIX系统仅考虑CPU使用率或运行队列长度来指示系统负载。由于具有空闲CPU的系统可能会因为磁盘或网络资源忙而遇到很长时间的等待,因此Linux负载平均值中包含了对I/O的考量。遇到负载平均值很高但CPU活动很低时,请检查磁盘和网络活动。

Linux中可以使用top、uptime显示负载平均值的情况。

[root@zsl ~]# uptime 
 15:05:44 up  1:03,  1 user,  load average: 0.01, 0.01, 0.00
 //此处的load average就表示负载平均值,这三个值代表最近1、5和15分钟的负载情况。

将显示的负载平均值除以系统中的逻辑CPU数。当值低于1表示资源利用率较好,等待时间很短。当值高于1表示资源饱和,而且有一定的服务等待时间。

空闲CPU队列的负载数为0。每个就绪和等待的线程使计数增加1。总队列数为1时,资源(CPU、磁盘或网络)正在使用中,但没有请求把时间花在等待上。增加的请求数会累积该计数,但由于许多请求可以在时限内处理,资源使用率会很高,而等待时间则不会。

因为磁盘或网络资源忙碌等待I/O而处于睡眠的进程包含在该计数内,而且使负载平均值增大。虽然不能表示CPU使用率,队列数依然表明用户和程序正在等待资源服务。

在资源饱和前,平均负载将保持在1以下,因为几乎不会在队列中发现等待的任务。只有资源饱和导致请求留在排队状态并且被负载计算例程计数时,负载平均才会增大。当资源使用率接近100%时,每个增加的请求将开始遭遇服务等待时间。

7.2 实时进程监控

top用于实现全屏动态显示系统信息

[root@localhost ~]# top [选项]

选项:
-d 秒数:  指定 top 命令每隔几秒更新。默认是 3 秒
-n 次数:指定 top 命令执行的次数。一般和“-b”选项合用
-b 使用批处理模式输出。一般和“-n”选项合用,用于把 top 命令重定向到文件中
-p 指定PID。只查看某个 PID 的进程
-s 使top 在安全模式运行,避免在交互模式中出现错误
-u 用户名:只监听某个用户的进程

在 top 命令的交互模式当中可以执行的命令:
?或 h:	显示交互模式的帮助
P:以 CPU 使用率排序,默认就是此项
M:以内存的使用率排序
N:以 PID 排序
T:按照 CPU 的累积运算时间排序,也就是用 TIME+项排序
k:按照 PID 号,给予某个进程一个信号。一般用于终止某个进程,信号 9是强制终止的信号
r:按照 PID 号,给某个进程重设优先级(Nice)值
q:退出 top

[root@localhost ~]# top
top - 13:44:21 up 4 days, 16:01,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:  84 total,   1 running,  83 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.0 us,  2.0 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1883724 total,   144992 free,   948956 used,   789776 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1539352 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND        
 1119 root      10 -10  146420  29512   5956 S  1.3  1.6  71:48.53 AliYunDun      
 1317 root      20   0 2070408  62124   3296 S  0.3  3.3  28:04.11 java  

命令的输出,top 命令的输出内容是动态的,默认每 3 秒刷新一次。命令的输出主要分为两大部分:第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出判断服务器的健康状态;第二部分从第六行开始,显示的是系统中进程的信息。

top 命令的第一部分输出

第一行为任务队列信息:

top - 13:44:21 up 4 days, 16:01,  2 users,  load average: 0.00, 0.01, 0.05
输出 含义 13:44:21 系统当前时间 up 4 days, 16:01 系统的运行时间,本机已经运行 4 天 16 小时 1 分钟 2 users 当前登录了两个用户 load average: 0.00, 0.01, 0.05 系统在之前 1 分钟,5 分钟,15 分钟的平均负载。 如果 CPU 是单核,则这个数超过 1,就是高负载。 如果 CPU 是四核,则这个数超过 4,就是高负载。 (这个平均负载完全是个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数。)

第二行为进程信息:

Tasks:  84 total,   1 running,  83 sleeping,   0 stopped,   0 zombie
输出 含义 84 total 系统中的进程总数 1 running 正在运行的进程数 83 sleeping 睡眠的进程 0 stopped 正在停止的进程 0 zombie 僵尸进程。如果不是 0,需要手工检查僵尸进程

第三行为 CPU 信息:

%Cpu(s):  2.0 us,  2.0 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
输出 含义 2.0 us 用户模式占用的 CPU 百分比 2.0 sy 系统模式占用的 CPU 百分比 0.0 ni 改变过优先级的用户进程占用的 CPU 百分比 96.0 id 空闲 CPU 的 CPU 百分比 0.0 wa 等待输入/输出的进程的占用 CPU 百分比 0.0 hi 硬中断请求服务占用的 CPU 百分比 0.0 si 软中断请求服务占用的 CPU 百分比 0.0 st st(Steal time)虚拟时间百分比。就是当有虚拟机时, 虚拟 CPU 等待实际 CPU 的时间百分比

第四行为物理内存信息:

KiB Mem :  1883724 total,   144992 free,   948956 used,   789776 buff/cache
输出 含义 1883724 total 物理内存的总量,单位 KB/MB 144992 free 空闲的物理内存数量,我们使用的是虚拟机, 总共分配了 2G 内存,所以只有 0.14G 的空闲内存了 948956 used 已经使用的物理内存数量 789776 buff/cache 作为缓冲的内存数量

第五行为交换分区(swap)信息:

KiB Swap:  2097148 total,  2097148 free,        0 used.  1539352 avail Mem
输出 含义 2097148 total 交换分区(虚拟内存)的总大小 2097148 free 空闲交换分区的大小 0 used 已经使用的交互分区的大小 1539352 avail Mem 可用交换分区总量

top 命令的第二部分输出

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND        
 1119 root      10 -10  146420  29512   5956 S  1.3  1.6  71:48.53 AliYunDun      
 1317 root      20   0 2070408  62124   3296 S  0.3  3.3  28:04.11 java           
主要是系统进程信息。这部分和 ps 命令的输出比较类似,只是如果在终端中执行 top 命令不能看到所有的进程,而只能看到占比靠前的进程。 输出 含义 PID 进程 ID USER 该进程所属的用户 PR 优先级,数值越小优先级越高 NI 优先级,数值越小优先级越高 VIRT 该进程使用的虚拟内存的大小,单位 KB RES 该进程使用的物理内存的大小,单位 KB SHR 共享内存大小,单位 KB S 进程状态 %CPU 该进程占用 CPU 的百分比 %MEM 该进程占用内存的百分比 TIME+ 该进程总共占用的 CPU 时间 COMMAND 进程的命令名 作业

写出以下描述对应的进程状态标志:

描述 状态标志 进程已被停止(暂停) T 进程已释放了其所有资源(pid除外) Z 进程正在CPU上运行或者正在等待于CPU上运行 R 进程正处于睡眠状态,直至满足某些条件后才会启动 S 进程正在等待I/O或某些条件得到满足,并且绝对不会影响信号 D