在每一个基本的系统中,都包含有各种各样的基本进程,用于检查系统服务,和操作系统通信等等。进程和系统的性能表现有着很大的关系,因此,一个系统管理者应该清楚了解当前系统中正在运行什么东西,有什么资源可用等等,只有这样,你才能够调整配置,例如,禁止不需要的进程,打开必须的监护程序以及将你的内核调整到最优化,最后得到一个最适合自己使用的最好的系统。Ubuntu是一个为大众设计的系统,这也就决定了其系统设置的大众化,换句话说,臃肿化。为了适应兼容性而支持的很多东西,我们其实不一定需要。在这里,笔者试图讲解一些通过调整内核参数,shell参数以及特定应用的设置来优化系统的方法,供大家参考。需要注意的是,不同的ubuntu系统有着不同的启动脚本,并有着不同的运行进程,这里我只能以7.04系统为基础来讲解。其实自己学会对进程进行追踪查看是非常重要的,只有这样你才能在不同的系统中都游刃有余。另外,如果要更加深入调整系统,那么自己编译一个属于自己的系统是最合适的,本文没有牵涉这么深入的东西。如果你对自己编译linux系统感兴趣,可以参考这篇文章和这篇文章。
本文假设你有一点点基本使用linux的基础,所以很多东西只是讲一个概念性的大纲,想深入了解的话,网络上有很多文章。如果你是系统高手,基本就可以不用看本文了,你会觉得很简单,如果你是连ps,who -r都不知道的新手,建议你还是先放google搜索一些入门文章,并亲自使用linux一周以上,再回过头来看这篇文章。本文很大程度上参考了Ubuntu Performance Guides,篇幅较长,故分两页发出。
基础知识理解进程进程简介
刚才就几次提到进程,那么,我们应该怎么理解这个词语?广泛得说,所有在系统中运行的,用于执行各种各样任务的,都是一个进程,只不过根据具体执行任务的不同可以有所区分,例如,用于管理和维持操作系统运行的属于系统进程,而用于处理用户需求的就是用户进程。
进程并不是一个独立的概念,它是相互交互的,很多进程都为其他进程提供服务,或者携手共同完成某一个功能。这些服务中,有一些对于系统的运作是非常关键的,例如X-Windows服务。绝大多数的系统进程都是服务性质的进程,而绝大多数用户进程则是应用程序类进程。应用程序,比如你现在在使用的 FireFox(或者其它,估计FF最多吧)通常是由一个或多个满足用户需求的进程组成。总的来说,服务的开启和关闭是基于系统需求的,而应用程序的开启和关闭,则是基于用户的需求的。
我们上面说的这些进程阿,服务阿啥的,其实之间的区分并不是很明显,举个例子,Gnome的桌面系统就是由各种程序和进程组成,而他们不仅提供其它程序需要的服务,还可以支持用户的需求。GDE完全可以被称为是程序,进程,应用和服务的集合体,这不会产生任何冲突。
当然,我们还是要稍微做一下区分,后面才方便继续讲解。现在就统一一下,进程表示任何可以产生运行中的进程标志符的东西,程序则表示能产生进程的可执行文件。用户能够直接使用应用程序,而操作系统才使用服务。
进程基本操作
在你的机器上,唯一能够消耗你资源的就是正在运行的进程。如果当你发现自己的系统突然很慢,运行不正常时,通常只有两个可能,一种是某些进程运行异常,另一种就是某些进程所消耗的资源已经大于你所拥有的资源。
当然,想看看什么东西正在你机器上运行其实很简单,使用ps -aux或者top命令即可,这些东西资料很多,我就不多说了,实在不行man top或者man ps吧。当然,对于初学者来说最方便的还是利用图形化界面的系统监视器,如图:
(点击缩放)
所有信息都尽显眼前。注意,在系统监视器中,你不仅能看到进程运行情况,还能看到磁盘使用,CPU使用等很多有价值的信息,这些信息是接下来的部分可能用到的。
ok,现在我们知道,如果系统异常,如何去确定是什么进程异常了。但是接下来该怎么处理呢?无论是命令行还是图形界面显示,你都可以看到每一个进程都有属于自己的ID,也就是PID。它们都是进程的句柄,而不是表示真实的进程。这有什么区别?对于一个拥有多线程的进程来讲,可以让所有的线程都拥有同一个句柄,也可以让每一个线程都拥有一个句柄。太专业了?恩,通俗来讲,这就相当于……进程的身份证,我们通过它来标志进程。这个东西在ubuntu中默认可以有32768个不同的PID,每有一个新的进程,就分配一个当前未用的PID给它。
好了,让我们找到那个让我们系统变慢的该死的罪魁祸首,看看它的PID,然后用kill PID命令来关闭它。等等,你确定就是这个进程影响了你的系统?你确信没有错杀好人?好吧,其实可以先用kill -stop PID命令来暂停一个进程,看看没有了它,我们的系统是否正常。如果发现了冤假错案,没关系,kill -cont PID能让进程继续工作。
除了直接使用kill PID之外,我们还有更进一步的kill进程的办法。kill PID仅仅是发出一个TERM信号,然后进程能捕捉这个信号,开始释放资源,关闭程序,这不是一下子就完成的,因此在关闭程序之前,你可以结束打开的文件和完成正在做的任务。但是这导致一个问题,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号,而且如果进程失去响应了怎么办?别急,我们还可以试一试kill -1 PID命令,这个命令发送的是hang up信号,含义是“中止信号”,它告诉进程,终端已经被kill了。但这个信号同样只被运行良好的进程所拦截。假设这两种方式都无法结束进程,那么只能使用kill -9 PID了。这个命令发送的是真正的kill信号,对于这个信号,进程是不能忽略的。这是一个“我不管您在做什么,立刻停止”的信号,也就是说进程立刻被终止,不实施清理操作。
信号是用来与守护程序和进程通信的。任何活动任务都是一个进程,而守护程序是等待对某些事件做出反应或者按照日程安排执行任务的后台服务。一个程序必须有建在其中的信号处理程序用于捕获和应答信号。在LINUX中的signal参考指南解释了各种不同信号和这些信号的用途。常用的信号除了上面介绍的以外,还有INT,CHLD等。