Linux进程管理

[Toc] #Linux进程管理 ##1.进程基本概述 进程是已启动的可执行程序的运行中实例。shell

/proc目录下以数字为名的目录,每个目录表明一个进程,保存着进程的属性信息。每个进程的PID是惟一的,就算进程退出了,其它进程也不会占用其PID。安全

###1.1.进程的组成部分 已分配内存的地址空间 安全属性,包括全部权凭据和特权 程序代码的一个或多个执行线程 进程状态 ###1.2.进程的环境 本地和全局变量 当前调度上下文 分配的系统资源,如文件描述符和网络端口 ###1.3.进程的产生 现有的(父)进程复制本身的地址空间(fork)来建立一个新的(子)进程结构。 每一个新进程分配有一个惟一的进程ID(PID),知足跟踪和安全性之需。PID与父进程ID(PPID)是新进程环境的元素。 任何进程可建立子进程。全部进程都是第一个系统进程的后代。RHEL7上,第一个系统进程是systemd。 bash

经过fork例程,子进程继承安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec其本身的程序代码。一般,父进程在子进程运行期间处于睡眠状态,设置一个在子进程完成时发出信号的请求(wait)。在退出时,子进程可能已经关闭或丢弃了其资源和环境,剩余的部分被称做僵停。父进程在子进程退出时收到信号而被唤醒,清理剩余结构,而后继续执行其本身的程序代码。 ###1.4.进程的分类 前台进程:与终端相关的进程,经过终端启动的进程 注意:也可把在前台启动的进程送日后台,以守护模式运行 守护进程:daemon,与终端无关的进程(如内核),在系统引导过程当中启动的进程 ##2.进程状态 网络

Excuting //运行态 Ready //就绪态,也能够称做睡眠态 Uninterruptible sleep //不可中断的睡眠。不可随时唤醒,只有当IO资源加载成功后才能唤醒 Interruptible sleep //可中断的睡眠。可随时唤醒 Zombie //僵尸进程。正常运行结束了,可是不释放占据的内存 Stopped //中止态,暂停于内存中,但不会被调度,除非手动启动之 进程睡眠的缘由: 当一个执行中的进程,须要加载额外的IO资源的时候,因为IO设备的速度太慢,因此会转入睡眠状态等待,交出CPU给其余进程,以避免浪费剩余执行时间 在多任务处理操做系统中,每一个CPU(或CPU核心)在一个时间点上处理一个进程。在进程运行时,它对CPU时间和资源分配的直接要求会有变化。进程分配有一个状态,它随着环境要求而改变。多线程

###2.1.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 低优先级进程app

  • 前台进程组中的进程 | 多线程进程 s 会话进程首进程 ##3.进程优先级 ###3.1.Linux进程调度与多任务 现代计算机系统中既包含每次只能执行一个指令的低端处理器,也包含高性能超级计算机,这些超级计算机每台配备数百个CPU,每一个CPU上具备多个核心,它们能够并行执行数以百计的指令。可是全部这些系统每每具备一个共同点:它们须要运行的进程数量老是超出实际具备的核心数。

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

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

###3.2.进程优先级ide

进程优先级范围:0-139,数字越小,优先级越高 0-99:实时优先级,内核调整 100-139:静态优先级,用户可控制性能

进程优先级高的特色: 得到更多的CPU运行时间 更优先得到CPU运行的机会

要修改进程的优先级能够经过调整进程的nice值来实现,nice值越小,优先级越高: nice值的范围是(-20,19),-20对应100,19对应139 ###3.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时间 ###3.4.nice级别与权限 为很占CPU资源的进程设置较低的nice级别可能会对同一系统上运行的其余进程的性能形成负面影响,因此仅容许root用户设置负nice级别以及下降现有进程的nice级别。

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

###3.5.进程优先级调整

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

//调整已经启动的进程的nice值: renice NI PID(例:renice 3 3704) //在启动时指定nice值:(-20,19) nice -n NI COMMAND

[root@localhost ~]# ps -elF|grep vi
4 S root 730 1 0 80 0 - 24938 poll_s 6196 0 09:13 ? 00:00:00 /usr/bin/VGAuthService -s
4 S root 2427 1409 0 80 0 - 31577 poll_s 1692 0 14:24 pts/0 00:00:00 vi abc
0 S root 2430 2410 0 80 0 - 28169 pipe_w 984 0 14:26 pts/1 00:00:00 grep --color=auto vi
[root@localhost ~]# renice 10 2427
2427 (进程 ID) 旧优先级为 0,新优先级为 10
[root@localhost ~]# ps -elF|grep vi
4 S root 730 1 0 80 0 - 24938 poll_s 6196 0 09:13 ? 00:00:00 /usr/bin/VGAuthService -s
4 S root 2427 1409 0 90 10 - 31577 poll_s 1692 0 14:24 pts/0 00:00:00 vi abc
0 R root 2433 2410 0 80 0 - 28169 - 984 0 14:27 pts/1 00:00:00 grep --color=auto vi
[root@localhost ~]# ls
abc test
[root@localhost ~]# nice -n 19 vi abc

##4.进程管理命令 Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中 ###4.1.ps ps(process state)命令用于列出当前的进程。能够显示详细的进程信息,包括:

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

ps支持三种选项格式:

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

ps(process state),显示进程信息。注意事项:

加了[]中括号的,表示内核线程,一般位于顶部 exiting或defunct表示僵尸进程

//经常使用选项: a //显示全部与终端有关的进程 u //显示进程是由哪一个用户启动的 x //显示全部与终端无关的进程

-e //显示全部进程,与-A效果相同 -l //以长格式显示 -F //显示更详细的完整格式的进程信息 -f //显示更详细的完整格式的进程信息 -H //以进程层级格式显示进程相关信息 -o //根据本身的须要选择要显示的字段

//aux结果解析: VSZ //Virtual memory SiZe,虚拟内存集 RSS //ReSident Size,常驻内存集 STAT //进程状态 TIME //运行时的累积时长

//ps命令结果解析: NI //nice值 PRI //优先级 PSR //进程运行在哪一个CPU核心上 RTPTRIO //实时优先级 C //运行的CPU编号 STIME //进程的启动时间 VSZ //Virtual memory SiZe,虚拟内存集 RSS //ReSident Size,常驻内存集 STAT //进程状态 TIME //运行时的累积时长

[root@localhost ~]# ps aux |head 
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 129108 6472 ? Ss 09:13 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 09:13 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 09:13 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 09:13 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 09:13 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 09:13 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 09:13 0:00 [rcu_sched]
root 10 0.0 0.0 0 0 ? S 09:13 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 09:13 0:00 [kdevtmpfs]
[root@localhost ~]# ps -elf |head 
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 32277 ep_pol 09:13 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root 2 0 0 80 0 - 0 kthrea 09:13 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 09:13 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 09:13 ? 00:00:00 [kworker/0:0H]
1 S root 7 2 0 -40 - - 0 smpboo 09:13 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 09:13 ? 00:00:00 [rcu_bh]
1 R root 9 2 0 80 0 - 0 - 09:13 ? 00:00:00 [rcu_sched]
5 S root 10 2 0 -40 - - 0 smpboo 09:13 ? 00:00:00 [watchdog/0]
5 S root 12 2 0 80 0 - 0 devtmp 09:13 ? 00:00:00 [kdevtmpfs]
[root@localhost ~]# ps -F
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 1409 1405 0 28880 2204 0 09:13 pts/0 00:00:00 -bash
root 2470 1409 0 37766 1784 0 14:41 pts/0 00:00:00 ps -F
[root@localhost ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1409 1405 0 09:13 pts/0 00:00:00 -bash
root 2471 1409 0 14:41 pts/0 00:00:00 ps -f

###4.2.pstree

pstree用于显示当前系统上的进程树

[root@localhost ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
        │ └─2*[{NetworkManager}]
        ├─VGAuthService
        ├─agetty
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─firewalld───{firewalld}
        ├─lvmetad
        ├─master─┬─pickup
        │ └─qmgr
        ├─polkitd───5*[{polkitd}]
        ├─rhnsd
        ├─rhsmcertd
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd─┬─sshd───bash───pstree
        │ └─sshd───bash
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───{vmtoolsd}

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

[root@localhost ~]# pgrep vi
730
2500
[root@localhost ~]# ps -ef|grep vi
root 730 1 0 09:13 ? 00:00:00 /usr/bin/VGAuthService -s
root 2500 1409 0 14:54 pts/0 00:00:00 vi abc
root 2526 2410 0 15:00 pts/1 00:00:00 grep --color=auto vi

###4.4.pidof 根据进程名查找其PID号

[root@localhost ~]# ps -ef|grep vi
root 730 1 0 09:13 ? 00:00:00 /usr/bin/VGAuthService -s
root 2500 1409 0 14:54 pts/0 00:00:00 vi abc
root 2526 2410 0 15:00 pts/1 00:00:00 grep --color=auto vi
[root@localhost ~]# pidof vi
2500

###4.5.vmstat 虚拟内存状态查看命令 //语法:vmstat [options] [delay [count]] //例: vmstat 2 //表示每2秒刷新一次 vmstat 2 5 //表示每2秒刷新一次,刷新5次后退出

//经常使用的选项: -s //显示内存的统计数据

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,被虚拟化技术偷走的时间(好比运行虚拟机)

[root@localhost ~]# vmstat 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r b swpd free buff cache si so bi bo in cs us sy id wa st
 1 0 0 1483472 3008 225880 0 0 9 1 40 41 0 0 100 0 0
[root@localhost ~]# vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r b swpd free buff cache si so bi bo in cs us sy id wa st
 1 0 0 1483472 3008 225880 0 0 9 1 40 41 0 0 100 0 0
 0 0 0 1483476 3008 225880 0 0 0 0 67 71 0 0 100 0 0
 0 0 0 1483476 3008 225880 0 0 0 0 71 72 0 0 100 0 0
 1 0 0 1483476 3008 225880 0 0 0 0 81 77 0 0 100 0 0
 0 0 0 1483476 3008 225880 0 0 0 0 61 66 0 1 100 0 0
[root@localhost ~]# vmstat -s
      1867024 K total memory
       154520 K used memory
       130336 K active memory
       115732 K inactive memory
      1483616 K free memory
         3008 K buffer memory
       225880 K swap cache
      2097148 K total swap
            0 K used swap
      2097148 K free swap
         1229 non-nice user cpu ticks
            9 nice user cpu ticks
         2988 system cpu ticks
      2099312 idle cpu ticks
         2695 IO-wait cpu ticks
            0 IRQ cpu ticks
          166 softirq cpu ticks
            0 stolen cpu ticks
       179796 pages paged in
        23257 pages paged out
            0 pages swapped in
            0 pages swapped out
       844377 interrupts
       859142 CPU context switches
   1569201184 boot time
         2674 forks

##5.控制做业 ###5.1.做业与会话 做业控制是shell的一种功能,它容许单个shell实例运行和管理多个命令。

做业与在shell提示符中输入的每一个管道相关联。该管道中的全部进程均是做业的一部分,而且是同一个进程组的成员。(若是在shell提示符中仅输入了一条命令,则这条命令可视为命令的最小管道。该命令将是该做业的惟一成员)

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

该控制终端的后台进程是与该终端相关联的任何其余做业的成员。终端的后台进程没法从终端读取输入或接收键盘生成的中断,但能够写入终端。后台中的做业可能已中止(暂停),也可能正在运行。若是某个正在运行的后台做业尝试从终端读取内容,则该做业将自动暂停。

每一个终端是其自身的会话,而且能够具备一个前台进程和多个独立的后台进程。一个做业只能属于一个会话,也就是属于其控制终端的会话。

###5.2.做业分类

Linux做业分为前台做业与后台做业两种。其各自的特色以下:

前台做业:经过终端启动,且启动后一直占据了命令提示符

后台做业:能够经过终端启动,但启动以后,释放命令提示符,后续的操做在后台完成 此类做业虽然被送日后台运行,但其依然与终端相关。若是但愿送日后台后,剥离与终端的关系须要执行(nohup COMMAND &) ###5.3.在后台运行做业 //在命令后跟上&符号能够生成一个后台做业 //jobs命令用于显示当前全部的后台做业

[root@localhost ~]# sleep 800 &
[1] 2305
[root@localhost ~]# jobs 
[1]+ 运行中 sleep 800 &

//当只有一个后台做业时,直接使用fg命令,不跟任何参数便可将后台做业调至前台运行,可是当有多个做业时则必须跟上%+做业号,也就是上面命令执行结果中以[ ]括起来的数字。

//使用ctrl+z可将前台进程发送到后台,此时做业将处于中止状态

[root@localhost ~]# sleep 600 &
[2] 2307
[root@localhost ~]# sleep 500 &
[3] 2308
[root@localhost ~]# jobs
[1] 运行中 sleep 800 &
[2]- 运行中 sleep 600 &
[3]+ 运行中 sleep 500 &
[root@localhost ~]# fg %3
sleep 500
^Z
[3]+ 已中止 sleep 500
[root@localhost ~]# jobs
[1] 运行中 sleep 800 &
[2]- 运行中 sleep 600 &
[3]+ 已中止 sleep 500

//使用bg命令+做业号可以使后台已中止的做业从新运行 //kill加上做业号能够手动杀死指定做业 //jobs命令的结果中 + //命令将默认操做的做业 - //命令将第二个默认操做的做业

[root@localhost ~]# jobs
[1] 运行中 sleep 800 &
[2]- 运行中 sleep 600 &
[3]+ 已中止 sleep 500
[root@localhost ~]# bg %3
[3]+ sleep 500 &
[root@localhost ~]# jobs
[1] 运行中 sleep 800 &
[2]- 运行中 sleep 600 &
[3]+ 运行中 sleep 500 &
[root@localhost ~]# kill %3
[root@localhost ~]# jobs
[1] 运行中 sleep 800 &
[2]- 运行中 sleep 600 &
[3]+ 已终止 sleep 500

##6.进程间通讯 进程间通讯(IPC:Inter Process Communication)

进程间通讯方式:

同一主机 共享内存 信号:Signal

不一样主机 rpc:remote procecure call 基于socket实现进程间通讯 ##7.使用信号控制进程 信号是传递至进程的软件中断。信号向执行中的程序报告事件。生成信号的事件能够是错误或外部事件(如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@localhost ~]# 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@localhost ~]# ps -ef|grep sleep
root 2340 1412 0 14:27 pts/0 00:00:00 sleep 500
root 2341 1412 0 14:27 pts/0 00:00:00 sleep 800
root 2342 1412 0 14:28 pts/0 00:00:00 sleep 900
root 2344 1412 0 14:28 pts/0 00:00:00 grep --color=auto sleep
[root@localhost ~]# killall sleep
[1] 已终止 sleep 500
[2]- 已终止 sleep 800
[3]+ 已终止 sleep 900
[root@localhost ~]# ps -ef|grep sleep
root 2348 1412 0 14:28 pts/0 00:00:00 grep --color=auto sleep

##8.监控进程活动 ###8.1. IO负载 负载平均值表明一段时间内感知的系统负载。Linux经过预期服务等待时间的表示来实施平均负载计算。

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

负载数属于全局计数器计算,是全部CPU的总和数。因为从睡眠返回的任务可能会从新调度到不一样的CPU,难以精确的每CPU计数,但累计数的准确度能够保障。显示的平均负载表明全部的CPU。

//查看cpu核心数

[root@localhost ~]# grep 'model name' /proc/cpuinfo 
model name	: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz

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

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

[root@localhost ~]# uptime 
 14:34:30 up 5:21, 1 user, load average: 0.00, 0.01, 0.05

//此处的load average就表示负载平均值,这三个值表明最近一、5和15分钟的负载状况。

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

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

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

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

###8.2.实时进程监控 top用于实现全屏动态显示系统信息

//经常使用选项:
    -d      //设置延迟时长,top -d 1表示每隔1秒刷新一次,默认每隔5秒刷新
    -b      //批模式翻屏显示,默认只实时显示一屏,若要显示后面的进程信息则可以使用-b选项,与-n #合用,可指定显示翻#屏
    
[root@localhost ~]# top -b -n 1
top - 14:38:24 up 5:25, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 152 total, 1 running, 151 sleeping, 0 stopped, 0 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
KiB Mem : 1867024 total, 1523364 free, 151264 used, 192396 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1527400 avail Mem 

   PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  2376 root 20 0 157584 2080 1476 R 6.2 0.1 0:00.01 top
     1 root 20 0 129104 6468 2704 S 0.0 0.3 0:01.94 systemd
     2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
     3 root 20 0 0 0 0 S 0.0 0.0 0:00.39 ksoftirqd/0
     5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
     7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
     8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
     9 root 20 0 0 0 0 S 0.0 0.0 0:00.97 rcu_sched
    10 root rt 0 0 0 0 S 0.0 0.0 0:00.25 watchdog/0

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       //进程状态

//top命令交互式子命令:
    M   //根据驻留内存大小进行排序,默认根据CPU百分比排序
    P   //根据CPU使用百分比进行排序
    T   //根据累计时间(占据CPU时长)进行排序
    l   //是否显示平均负载和启动时间
    t   //是否显示进程和CPU状态相关信息
    m   //是否显示内存相关信息
    c   //是否显示完整的命令行信息
    q   //退出top命令
    k   //终止某个进程
    1   //显示全部CPU的信息
    s   //修改刷新时间间隔
相关文章
相关标签/搜索