我们都用过虚拟机,它能让保存一个正在运行系统的状态,这里用到的技术就是checkpoint,日后还可以restart,不过这是针对整个系统,有没有可能只checkpoint一个process,这个方向引来了研究热潮,CRAK就是其中做的比较不错的一个。
Checkpoint/restart技术应用场景:
1. 在分布式负载均衡方面,往往需要一个进程从一个host移到另一个host上
2. rollback:出错后可以回滚
3. 在系统关机前checkpoint,当系统重启后可以恢复程序执行
但是遗憾的是现在很多主流的商业和流行的操作系统,Unix,Linux等,都对fault-tolerance或分布式关注不够,并没有checkpoint/restart机制,这也给在其上加入这种机制带来很大的困难。虽然修改内核源码带来极大的困难,但有人想出了一个很聪明的办法:以内核可加载模块的形式引入checkpoint/restart机制。CRAK是这一理念的践行者,并可以作为模块应用在 linux kernel 2.6.25 版本 (但 2.6.24, 2.6.27 和 2.6.32 并不支持 CRAK)。
先来看一下CRAK的设计理念:
1. 不是重写OS,利用通用OS,以模块加载的形式工作在OS上
2. 支持legacy applications
3. 低的overhead,所以不依赖stub process和home node
CRAK的工作流程(讲述 process migration):
1. 加载模块到内核
2. 发出请求:checkpoint一个process
3. kernel收到请求后stop这个process,之后开始checkpoint它
4. kernel将它的state存到一个file中,然后这个process被kill掉了(因为它要开始迁移了)
5. 在要迁移到的host上创建一个新的process,将保存的state给它
CRAK提供的user interface是:
1. checkpoint:用户要做的是指明哪个process被checkpoint,创建的checkpointed imgage被存在哪里(硬盘或网络发送)。我们上面在checkpoint后kill掉了进程,用户还可以选择不kill
2. restart:当要恢复时,用户要使用那个image,让进程重生
这样,我们可以自己创建一个程序来监管你想要checkpoint的程序,定期自动去checkpoint。
Checkpoint:
当用户说要checkpoint某个进程时,都有哪些进程信息要save:
- address space
- register set
- opened files/pipes/sockets
- System V IPC structures