进程一直是操作系统最重要的概念之一,网上有好多关于程序、进程、线程等概念的区分,这里不再多说,这里我想聊的是自己整理的关于如何去管理进程方面的一些东西。


    进程管理


进程管理简介

    进程是正在执行的一个程序或命令,每一个进程都是一运行的实体都要自己的地址空间,并占用一定的系统资源。简言之,进程就是正在执行的程序或命令,程序运行过程中会占用一定的资源。

    举个例子,一个简单的命令,例如ls,和一个服务例如httpd,都属于进程,不同的是服务的进程会常驻内存当中,等待被访问。所有的程序,只要运行,都会产生一系列的进程,每当有一个客户端连接我的服务时,就会多产生一个进程。Apache默认并发连接数是400,我们可以改到2048,因此httpd服务最多可以产生两千多个进程并发。


进程管理的作用:<以下是按照按优先级排列>

    a> 判断服务器的健康状态

    b> 查看系统中所有进程

    c> 杀死进程


    当发现某一进程CPU占用率很高,导致服务器接近死机,我们不可以直接杀死程序,所有程序都有正确的结束方式,直接杀死进程是在正确关闭服务功能不起作用的时候,*采用的手段。

    如果是系统的合理进程占用了大量的资源,我们不可以直接杀死进程,这样容易使服务器直接down掉,我们需要考题提升服务器性能,CPU性能不足,可以考虑增加服务器个数,建立集群。如果是某个非法进程在耗费服务器资源,我们也不可以直接杀死进程,因为直接杀死进程,并不会彻底阻止该进程重新启动,因此,需要彻底清除该程序之后,才允许杀死进程。

    终止进程是进程管理当中最不重要的方法。


进程管理的查看

a> ps 和 pstree命令

    ps aux     #查看系统中所有进程,使用BSD操作系统格式

    ps -le      #查看系统中所有进程,使用Linux标准命令格式

    选项:

        -a :显示一个终端的多有进程,除了会话引线

Linux进程资源管理第一篇   -------- 进程管理

/sbin/init是所有进程的父进程,PID在1000以内的均为系统默认的系统进程

ps命令的输出结果解释:

    USER:该进程是由哪个用户产生的

    PID:该进程的ID号

    %CPU:该进程占用CPU资源的百分比,占用越高,进程越耗费资源

    %MEM该进程占用物理内存的百分比,占用越高,进程越耗费资源

    VSZ:该进程占用虚拟内存的大小,单位KB

    RSS:该进程占用实际物理内存的大小,单位KB

    TTY进程是哪个终端中运行的。tty1-tty7代表本地控制台终端,tty1-tty6时本地的字符界面终端,tty7是图形终端,pts/0-255代表虚拟终端。?表示进程不是由用户通过终端启动的,而是由内核直接启动的服务。

    STAT进程状态---- >R<运行>、S<睡眠>、T<停止状态>、s<包含子进程>、+<位于后台>

    START该进程的启动时间

    TIME进程占用CPU的运算时间,不是系统时间    

    COMMAND:进程名

b> pstree命令

pstree     #查看进程树

选项: 

    -p:显示进程的PID

    -u:显示进程的所属用户

c> top命令

top      #检查系统的健康状况

选项:

    -d:指定top命令每隔几秒更新一次,默认3 秒,Windows每1秒刷新

    -b:使用批处理模式输出,一般和”-n”合用

    -n:次数,指定top命令执行的次数,一般和”-b”选项合用,未指定该选项,则动态刷新(动态刷新属于交互模式)

在top命令的交互模式当中可以执行的命令:

?或h:显示交互模式的帮助

P :以CPU使用率排序,与Windows相同,默认此项

M:以内存的使用率排序

N:以PID排序

q:退出top

常用选项:top -b -n 1 > top.log   #将所有进程信息放到日志文件中。

Linux进程资源管理第一篇   -------- 进程管理

我们可以通过最上方五行信息来判断服务器的健康状况。

        第一行:任务队列信息

内容

说明

04:52:20

系统当前时间

up  1:14

系统运行时间

2   users

当前登录了两个用户

Load average:0.00,0.00,0.00

系统在之前的1分钟,5分钟,15分钟的平均负载。一般认为负载小于核数时,负载较小。大于核数,表示系统已经超出负载。

运维服务器的目的是不让服务器出问题,让用户可以正常的访问服务器。服务器间隔重启的时间越长,服务器出现问题的可能越大,因为缓存和临时文件无法下自动清除,即使Linux要比Windows稳定,但这也是不可避免的。服务器追求的无故障率,而不是系统持续运行时间。

服务器长时间不用重启,并不代表服务器没有问题,相反,服务器需要定时重启。高压力服务器,例如网络游戏都有定是维护时间,一般一周一次,让服务器重启,使状态归零。低压力服务器一般也需要一月重启一次,保证系统稳定。

关于平均负载,一般情况下,不能大于核数。如果平均负载大于核数,但各项指标均再可以接受的范围内,通常我们认为内存占用达到70%,CPU占用率达到60%~70%,可以不进行处理。因此,平均负载只是一个经验值。

第二行:进程信息

内容

说明

Tasks: 90total

系统中的进程总数

1 running

正在运行的进程数

89 sleeping

睡眠的进程

0 stopped

正在停止的进程

0 zombie

僵尸<僵死>进程。如果不是0,需要手工检查僵尸进程

 

这里要多说一点的是僵尸进程。理论上而言,如果关闭了父进程,子进程应该也相应关闭。换句话说,有时候我们运行某些程序,需要用到底层进程的支持,例如显卡等,当我们把显卡卸载掉之后,我们希望的是正在运行的程序也会关闭。但某些特殊情况,我们关闭掉依赖进程之后,子进程没有正常关闭,也不能正常运行,而是卡在了系统当中,这就是僵尸进程。一般不会出现僵尸进程,原因一般是因为某个进程长期存在,没有自动关闭,如果该进程并不是特别重要,可以选择杀死进程。

        第三行:CPU信息

内容

说明

Cpu(s): 0.0%us

用户模式占用的CPU百分比

0.0%sy

系统模式占用的CPU百分比

0.0%ni

改变过优先级的用户进程占用的CPU百分比

100.0%id

空闲CPU的CPU百分比

0.0%wa

等待输入/输出法进程的占用的CPU百分比

0.0%hi

硬中断请求服务占用的CPU百分比

0.0%hi

软中断请求服务占用的CPU百分比

0.0%st

st(Steal time)虚拟时间百分比,就是当有


    第四列:物理内存信息

内容

说明

Mem:1030528k total

物理内存的总量,单位kb

184040k used

已经使用的物理内存数量

846488k free

空闲的物理内存数量,我们使用的是虚拟机,总共只分配了1G内存

28912k buffers

作为缓冲 的内存数量

 

    第五列:交换分区的占比

内容

说明

Swap:  1023992k total

交换分区(虚拟内存)的总大小

0k used,

已经使用的交互分区的大小

1023992k free

空闲交换分区的大小

72524k cached

作为缓存 的交互分区的大小

 

以上就是top命令的相关注释,另外多说一点关于缓冲和缓存的区别:

    缓冲buffer:加速了数据的写入,减少了对硬盘的写操作

    缓存cache:加速了数据的读取

    做数据库搜索,网页的调用,负载均衡时才需要考虑缓冲和缓存。

    Swap可以手动添加。


杀死进程

kill  -l                #查看可用的进程信号

Linux进程资源管理第一篇   -------- 进程管理需要注意的是:

kill命令只可以杀死单一进程。killall命令和pkill可以杀死一系列进程

Linux支持64个进程信号。

杀死进程命令:

        kill  -进程信号  进程 PID

常用进程信号:

信号1:SIGHUP,重新加载配置文件,启动服务,但不会将原来在线的用户踢掉,即平滑重启。

信号9:SIGKILL强制终止进程(常用)

信号15:SIGTERM正常结束进程,默认选项。

通常使用 ps -aux | grep 进程名查询进程PID


        killall  选项  -进程信号  进程名

选项:-i:交互式杀死进程,即询问是否要杀死某个进程

-I:忽略进程名的大小写

 

        pkill  选项  -进程信号  进程名

选项:-t 终端号:按照终端号踢出用户

Linux进程资源管理第一篇   -------- 进程管理

 tty含义见ps命令


辅助命令w:查看当前登录用户

 Linux进程资源管理第一篇   -------- 进程管理

只有超级用户可以踢出其他用户,通过-t踢出用户,更加准确,如果同时登录了两个root先下手为强!


修改进程优先级

Linux是一个多用户,多任务的操作系统,Linux系统中通知运行着非常多的进程。但CPU在一个时钟周期内只能运算一个命令,进程优先级决定了每个进程处理的先后顺序。对于多核CPU,每个CPU在一个时钟周期内处理一个进程。优先级的管理在内核裁剪或内核编程中十分重要。

Linux进程资源管理第一篇   -------- 进程管理

 PRI 代表Priority,NI代表Nice。这两个都表示优先级。数字越小代表该进程优先级越高。用户只能修改NI(进程优先级的修正数据),不能修改PRI,但最终的优先级PRI是两者的和

 用户只能修改NI的值,不能直接修改PRI。

 NI值范围为-20~19,普通用户调整NI值的范围为0~19,而且只能调整自己的进程,且只能调高NI值,不能降低。

 Root用户可以设定进程NI值为负值,而且可以调整任何用户的进程。

◎ Pri(最终值) = Pri(原始值) + NI


nice命令

假定现在这里我们有一个可执行程序,叫做proc。

nice  选项  命令        #nice命令不能修改已经存在进程的NI,即 使用NI命令之前,需要将服务停止,重新启动

选项:-n NI值:给命令赋予NI

eg:nice -n -5 ./proc

renice  优先级 PID   #修改已经存在进程的NI值的命令,即每次只能修改一个进程的优先级

eg:renice -10 1845

接下来给出一条监控命令,用来实时刷新当前正在运行的进程:

[[email protected] bit_2]$ while :; do ps -al | grep 'proc' | grep -v "grep"; sleep 1; done
                        # 动态刷新proc进程状态

    当然,除此之外,我们可以通过top交互式环境来修改NI值。

1    top
2    #进入top后按"-r" -> 输入进程PID -> 输入nice值


--------muhuizz整理