高可用高性能系统(八)进程管理

来源:互联网 发布:上海电气电站待遇知乎 编辑:程序博客网 时间:2024/04/25 11:57
    进程是系统的一个处理单元。系统的处理单元按不同的粒度来划分的话,可以是函数、线程、进程、计算机、集群。当然,进程仍然是最基础的操作系统的处理单元。当系统发生一个无法恢复的错误时,操作系统一般都是以进程为单位,将其杀死,同时释放该进程的资源。函数,线程在处理致命性错误传播时,多数是无能为力的,即使有C++异常捕获系统这类东西。
    我们讨论进程如何在实现高可用高性能,对其他粒度的讨论是有作用的。对于一个处理过程来说,如果要高可用的话,就要保证该处理过程即使在某个进程崩溃时,也能由其他进程来继续完成。当然是否从崩溃点开始,还是从头开始涉及到不同的策略。从头开始,对进程来说比较简单。而从崩溃点开始的话,要涉及到很复杂的事情,比如崩溃点的上下文环境、资源情况,总之就是还原崩溃之前的环境,他的好处很明显,就是避免重复执行,减少执行的代价。
    很显然,一个进程如果被操作系统杀死的话,他自己是不会拉起的,所以一般都需要一个独立的监控进程,不停地检查目标进程是否存在内存中,如果不存在,那么重新启动这个进程。不论LINUX或者是WIN32进程,本身是没法从进程崩溃的点开始重新执行的,所以我们一般都是让他重新执行。稍好点的做法,就是在进程执行体的实现中,做些扩展,自己记录一些应用层的断点数据,然后再重新执行时,减少前面的执行过程。
    Erlang的进程和通常意义上的进程不太一样,是他虚拟机内部实现的,所以能够以很小的代价启动大量的进程。但我不能确定他是如何实现的,从我推测上来看,既然进程是他自己实现的,那么保存上下文应该不是问题。但从传统的角度来看,LINUX要做到这个地方还是蛮困难的。LVS是LINUX下的一个重要集群软件,他就是修改了部分内核,才能获取进程的上下文。
    单从进程管理本身来看,没啥好说的,就是如何恢复进程,保证业务处理的顺利进行。但如果涉及到跨机器,就要考虑进程迁移的问题。进程迁移同样也涉及到进程的上下文,进程迁移必须考虑到迁移的代价。

    进程由于是是操作系统支持的最小的逻辑处理单元,他具有独立空间,所以使用进程来实现故障隔离是很好的方式。比线程要好很多。我很欣赏Erlang自己管理进程的做法,这个理由上面已经提到了很充分。

原创粉丝点击