目录:
(一)了解进程的概念
(二)如何查看进程&&杀死进程
(三)把程序放置后台运行
(四)了解进程优先级
(五)调整进程优先级
(一)了解进程的概念
(1.1)在我们系统后台中有比较多的概念,第一个“程序”,指的是使用某种语言开发出来的一段代码,是静态存放在我们计算机硬盘上的program,它既不消耗CPU资源,也不消耗内存资源。第二个是“进程”,当一个程序运行的时候,在内存和CPU里会有体现,例如我们计算机中运行的QQ、迅雷等应用程序,称之为process。第三个是“线程”,线程属于进程里的一个单元,一个进程里可以包含多个线程,这些线程会共享进程的内存空间。
(1.2)我们知道系统中的每个用户都有自己的ID号,简称UID,同样每个进程页都有自己的ID号,process id简称PID。进程在运行的过程中也可能会产生子进程,例如运行的A进程进过一段时间的运行后会产生一个B进程,此时我们称A进程为父进程,称B进程为子进程,父进程可能生成一个子进程,也可能会杀死一个子进程,因此父进程和子进程之间是会通信的,我们把这种通信称之为“信号”
(二)如何查看进程&&杀死进程
(2.1)pstree命令
(2.1.1)我们首先来查看进程之间的父子关系,我们可以使用pstree命令,在vms002主机上它可以查询出系统中所有进程的父子关系,其中系统启动后所有进程的父进程是systemd,它的PID为1,而rhel6及以前的版本,所有系统的父进程是init。
(2.1.2)pstree以树状图显示进程,只显示进程的名字,且相同进程合并显示,我们还能以树状图显示进程,并显示进程PID
# pstree -p---以树状图显示进程,并显示进程PID
# pstree -p | more
(2.2)父进程会定期的向子进程发送信号,那么系统中的信号有哪些呢?我们可以使用“# kill -l”命令列出系统中所有的信号列表,其中1)SIGHUP表示挂起,就是是重启,如果我们想重启某个服务,但是不想改变其ID号,就可以使用1号信号;其中2)SIGINT表示通常情况下,我们使用“Ctrl+C”的方式终止进程的方式;而15)SIGTERM表示使用常规的方式终止进程,例如我们使用kill命令不加任何参数终止某进程的时候,默认就是使用15号信号操作的,但是威力不够强,对于异常状态的进程是无法终止的;此时我们使用9)SIGKILL信号,表示强制终止某进程,威力也比较强。
# kill -l---列出系统中所有的信号列表
# kill -2 29626---使用“Ctrl+C”的方式终止29626进程
(2.3)杀死进程的方式
(2.3.1)如果我们开启了一个进程,例如运行了一个firefox,我们应该怎样查看进程的PID号呢?首先我们可以使用pgrep命令,然后直接加上程序名就可以查询出进程的PID号了(图2-3),然后使用kill命令将所查询的异常进程杀死就可以了。当然我们也可以将两个步骤合并成一个步骤执行(图2-4)。
# pgrep firefox---查询firefox进程的PID号
# kill -9 $(pgrep firefox)---强制杀死firefox进程
# kill -9 pgrep firefox
---强制杀死firefox进程
(2.3.2)当然除了kill命令我们也可以使用killall命令,直接跟上程序名即可。
# killall firefox---杀死firefox进程
(2.3.3)我们也可以使用pkill,其中pkill可以实现把系统中某用户踢出的功能。首先我们使用jerry用户登录到vms002主机(图2-5-1),此时我们发现系统中是存在jerry用户登录的,我们使用pkill命令将jerry用户踢出(图2-5-2),此时我们使用管理员删除jerry用户及其家目录的时候,便可以顺利的操作了(图2-5-3)。
# pkill -kill -t pts/1
# userdel -r jerry
(2.4)查看进程我们还可以使用pidof命令,不过我们发现pidof命令后需要跟具体的进程名称,如果进程名称查询时有不一致的地方都是无法查询出来,相比pgrep命令,pgrep可以使用模糊查询的方式查询,因此更加高效。
# pidof firefox---查询firefox的进程号
(2.5)ps列的选项及意义
(2.5.1)如果我们希望查询系统中所有的进程的情况,可以使用ps命令,如果我们只是使用ps命令的时候是只能查询当前终端里shell进程下自己的几个进程而已,并不能看到其他终端里的进程,也无法看到系统的后台进程。所以此时我们希望查询到系统中所有进程时,可以使用如下两种方式查询:
# ps -ef---使用Linux风格的方式显示系统后台进程
# ps aux---使用Unix风格的方式显示系统后台进程
(2.5.2)接着我们来了解一下“# pa aux”命令中每一列代表的含义。
# ps aux | head---查询头10行的信息
USER:进程的属主
PID:进程的ID
PPID:父进程
%CPU:进程占用的CPU百分比
%MEM:占用内存的百分比
NI:进程的NICE值,数值大,表示较少占用CPU时间
VSZ:该进程使用的虚拟内存集(KB)
RSS:该进程占用的固定内存量(KB)(驻留中页的数量)
TTY:该进程在那个终端上运行(登陆者的终端位置),若与终端无关,则显示(?)问号,若为pts/0等,则表示由网络连接主机进程
WCHAN:当前进程是否正在进行,若为“-”表示正在进行
START:该进程被触发启动时间
TIME:该进程实际使用CPU运行的时间
COMMAND:命令的名称和参数
(2.5.3)我们来了解一下STAT状态这一列的相关含义。
D:不可中断的休眠状态(通常IO的进程)
R:正在运行中的队列中可执行的状态
S:处于休眠状态
T:停止或被追踪
W:进入内存交换(从内核2.6开始无效)
X:死掉的进程(基本很少见)
Z:僵尸进程
<:优先级较高的进程
N:优先级较低的进程
L:有些页被锁进内存
s:进程的领导者(在它之下有子进程)
l:多进程的(使用CLONE_THREAD,类似NPTL pthreads)
+:位于后台的进程组
(2.6)ps命令的其它用法
(2.6.1)我们可以使用lscpu查询当前系统的cpu使用情况(图3-6),现在我们系统中运行了一个应用程序firefox,我们希望查询这个程序具体是在当前系统的哪个CPU上运行的,我们可以使用ps命令做如下的查询(图3-7)。
# lscpu
# ps mo pid,comm,psr $(pgrep firefox)---查询firefox进程及其线程运行在哪个CPU上,psr表示运行在哪颗CPU
(2.6.2)如果我们想指定查询ps命令具体的哪几列的信息,则可以使用如下的方式查询:
# ps -ex -o pid,%cpu,%mem | head---查询ps命令具体列的信息
(三)把程序放置后台运行
(3.1)使用nohup
(3.1.1)当父进程关闭的时候,它所对应的子进程全部跟着关闭。我们在vms002主机上首先打开一个firefox进程,使用pstree命令发现,firefox是运行在第三个终端bash之上的。
# pstree | grep -C2 firefox
# ps aux | grep -v grep | grep firefox
(3.1.2)当我们将第三个终端关闭之后,会发现在终端中创建的firefox应用程序也自动关闭了。
# ps aux | grep -v grep | grep firefox
(3.1.3)但是很多时候我们会通过远程连接的方式执行脚本,如果执行一个脚本需要10个小时,是否是说我们需要将终端保持连接10个小时不关闭?因此为了解决这个问题,我们需要将运行的进程放置到后台运行(图3-4),此时我们发现关闭了所有的终端后firefox仍然能够正常的运行。
# nohup firefox &> /dev/null &---我们创建一个firefox并放置到后台运行
# ps aux | grep -v grep | grep firefox---查询当前firefox的运行状态
# pstree | grep -C2 firefox---使用pstree查询firefox的运行状态
注意:grep -v grep表示的是反向过滤,不去搜索grep命令后包含的字段
(3.2)使用jobs
(3.2.1)当我们在vms002的终端直接运行一个firefox进程后,发现此时终端就无法再运行其他的命令了,此时我们可以使用键盘“Ctrl+Z”将firefox程序停止并放到后台。
(3.2.2)如果我们希望查询在后台的程序状态信息,可以使用jobs命令查看。如果我们想将停止的firefox程序放在后台激活运行,可以使用“# bg 1”命令。
# jobs---查询进程的状态
# bg 1---将1号jobs激活并放在后台运行
(3.2.3)如果我们希望将后台运行程序调到前台来,则可以使用“# fg 1”命令,如果我们想终止运行的程序,则可以使用“Ctrl+C”命令。如果我们在运行程序的时候想直接运行在后台,则应该使用“# firefox &”这种方式即可,如果我们想结束进程则可以使用kill命令,其中1号jobs使用“%1”表示。
注意:虽然我们将firefox放置到后台运行了,但是此时firefox仍然是在当前的终端上运行的,即如果当前终端关闭了那么此进程也会被关闭,这个要和nohup区分(图3-12)。
# fg 1---希望将后台运行程序调到前台来运行
# firefox &---运行程序的时候想直接运行在后台
# kill -9 %1---结束进程
# ps aux | grep -v grep | grep firefox
(四)了解进程优先级
(4.1)在我们系统中所有的任务都是由CPU来完成的,在系统中如果一颗CPU有多颗核,那么我们认为就是有多颗CPU。在计算机中我们是可以一次性执行多个任务的,同时一颗CPU也是可以同时执行多个任务的。对于CPU来说,是分为时间片执行的,例如现在系统中有多个任务,那么CPU会对每个任务分片执行,假设每个时间片的时长是1ms,由CPU轮询的在每个任务之间循环执行,由于时间片循环的速度非常快,因此一般我们在系统中操作的时候是感觉不到有时间片在轮询的。有时候我们会感觉系统中某些任务是非常重要的,需要CPU优先执行,此时我们是可以在系统中调整进程的优先级的。优先级的组成如下(图4-1),一般来说,使用chrt命令可以修改优先系数,不过一般不建议修改(图4-2),而nice值的范围是“-20~19”之间,nice值越小优先级越高,nice值越大优先级越低。我们在图形化界面中可以调整进程的优先级的,我们选择“应用程序”--“系统工具”--“系统监视器”,然后便可以在图形化界面中修改进程的优先级了。
(4.2)如果我们的系统现在有两个进程,同时有两颗CPU,如果一个CPU上单独运行一个进程,那么对这两个进程设置进程优先级是没有意义的,但是我们希望能出现抢占资源这种情况,因此我们需要把两个进程放到一颗CPU上去运行。我们想要实现这样的效果,一般可以采用两种方式,第一种是关闭掉其中的一颗CPU,第二种方式是配置CPU的亲和性。
(五)调整进程优先级
(5.1)当前系统我们有两颗CPU,首先我们通过关闭其中的一颗CPU的方式来实现进程对资源抢占的效果,我们在vms002主机上进入到/sys/devices/system/cpu/cpu1目录下,发现online的值为1,表示正在启用的状态,我们可以将online的值设置为0,此时表示1号CPU处于关闭的状态(图5-2),我们发现系统中确实此时只有0号CPU在运行(图5-3)。
(5.2)top命令每一行的含义
(5.2.1)接着我们在vms002主机上执行两个cat命令,实现不断消耗内存的效果(图5-4)。然后我们使用top命令查询当前系统所有进程的情况,再按键盘1可以显示所有CPU运行的信息,其中第一行“top - 18:01:29 up 11:52, 6 users, load average: 2.72, 2.11, 1.11”分别代表的是当前的时间是18:01:29,机器一共运行了11:52的时长,当前系统有6 users个用户登录,机器在一分钟、五分钟、十五分钟的负载分别是“2.72, 2.11, 1.11”。第二行“Tasks: 475 total, 7 running, 468 sleeping, 0 stopped, 0 zombie”表示的是系统总共有进程475 total,其中7 running在运行,有468 sleeping在睡眠状态,有0 stopped个是停止的,有0 zombie时僵尸的状态。由于我们将1号CPU关闭了,所以此时2个进程都是在0号CPU上抢占式运行(图5-5)。第三行“%Cpu(s): 20.4 us, 79.6 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st”表示的是系统用户进程使用CPU百分比为20.4 us,内核中的进程占用CPU百分比为79.6 sy,用户进程空间内改变过优先级的进程占用CPU百分比为0.0 ni,空闲CPU百分比为0.0 id,CPU等待I/O完成的时间总量为0.0 wa(如果wa占用较多CPU,原因是磁盘性能有问题,建议更换磁盘),硬件中断占用CPU百分比为0.0 hi,软件中断占用CPU百分比为0.0 si,被虚拟内存偷走占用CPU百分比为0.0 st。
注意:htop命令也可以实现top命令的相关显示,不过需要我们额外的安装相关的软件包
# cat /dev/zero > /dev/null &
# top -d 1---每1秒中更新一次所有进程的显示
(5.2.2)经验:
0.0 hi:硬中断,占的CPU百分比。硬中断是由硬件产生的,比如,像磁盘、网卡、键盘、时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)hi->Hardware IRQ:The amount of time the CPU has been servicing hardware interrupts
0.0 si:软中断,占的CPU百分比。通常软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程去运行。I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同的。Si->Software Interrupts:The amount of time the CPUhas been servicing software interrupts。
0.0 st:虚拟机偷取物理CPU的时间。比如:物理机已经运行了KVM,KVM虚拟机占用物理机的CPU时间。
(5.2.3)第四行中“Mem : 4033636 total”表示物理内存总量,“3265760 free”表示空闲内存总量,“380604 used”表示使用的物理内存总量,“387272 buff/cache”表示用作内核缓存的内存量和free -k是一个意思。第五行中“Swap: 6291448 total”表示交换区总量,“6291448 free”表示空闲交换分区总量,“0 used”表示使用的交换区总量,“3394360 avail Mem”表示总的可利用内存是多少。
(5.2.4)第六行中PID表示进程id,USER表示进程所有者的用户名,PR表示由内核动态调整的优先级、用户不能修改,NI表示进程优先级即nice值、负值表示高优先级、正值表示低优先级、用户可以自己调整,VIRT表示虚拟内存、是进程正在使用的所有内存,RES表示的是常驻内存集(resident memory usage),SHR表示的是共享内存大小(shared memory)单位kb,S表示进程状态、其中D(不可中断的睡眠状态)、R(运行中或可运行)、S(睡眠中)、T(已跟踪/已停止)、Z(僵死),%CPU表示上次更新到现在的CPU时间占用百分比,%MEM表示进程使用的物理内存百分比,TIME+表示使用的CPU时间总计、单位1/100秒,COMMAND表示命令行。
注意:对于SHR:1、除了M自身进程的共享内存,也包括其他进程的共享内存;2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小;3、计算某个进程所占的物理内存大小公式为RES-SHR;4、swap out后,它将会降下来
(5.2.5)对于top快捷键:
默认3s刷新一次,按s键刷新时间
按空格:立即刷新
q:退出
P:按CPU排序(CPU进行排序)
M:按内存排序
T:按时间排序
数字键1:显示每个内核的CPU使用率
u/U:指定显示的用户
h:帮助
# top -p 9465---使用top命令动态只查看某个或某些进程的信息
(5.3)此时我们在图5-5中发现两个cat进程的NICE值都是0是一致的,而我们希望将进程11239的进程优先级提高,我们可以使用renice命令。我们发现11239进程的nice值为-19,CPU的占用率为96.1%,而11232的nice值为0,CPU的占用率只有1.9%,因此我们通过设置nice值而实现了进程抢占资源的效果,最后我们使用killall命令终止cat命令的总线。
# renice -n -19 11239---将11239进程的nice值设置为-19
# killall -7 cat---终止cat命令的总线
(5.4)调整进程优先级
(5.4.1)接着我们将1号CPU开启,实现1号CPU和0号CPU都是启用的状态(图5-8),并重新运行两个cat命令,实现不断消耗内存的效果(图5-9),此时我们发现两个进程是分别在两个CPU上运行的(图5-10)。
# echo 1 > cpu1/online
# cat /dev/zero > /dev/null &
(5.4.2)当然现在我们想具体的知道每个进程究竟是在哪个CPU上运行的,我们可以使用ps命令,此时我们发现13884进程是在0号CPU上运行,13899是在1号CPU上运行的。
# ps mo pid,comm,psr `pgrep cat`
(5.4.3)现在我们希望在两颗CPU都是启用的状态下,仍然能够指定进程所有的进程都在同一颗CPU上运行,我们可以使用taskset命令进行指定(图5-12),此时我们发现两个进程都已经在同一个CPU上运行了,且各占0号CPU运行的50%的容量(图5-13)。
# taskset -c 0 cat /dev/zero > /dev/null &---指定一个cat进程在0号CPU上运行
# ps mo pid,comm,psr pgrep cat
---查询进程是在哪颗CPU上运行
# top -d 1---使用top命令并且每1秒更新一次
(5.5)我们在调整优先级的时候,都是修改已经运行了的进程的优先级,那么我们是否可以以某优先级来运行某程序呢?其实这个是可以的,我们使用nice指定进程的优先级为-10,然后开始运行一个cat循环的命令(图5-14)。我们使用top命令后发现创建的-10的nice值的进程已经运行了(图5-15)。
# nice -n -10 taskset -c 1 cat /dev/zero > /dev/null &---我们使用nice指定进程的优先级为-10,然后开始运行一个cat循环的命令
# top -d 1
—————— 本文至此结束,感谢阅读 ——————
来源:51CTO
作者:Tom王
链接:https://blog.51cto.com/13613726/2461226