用 Node.js 简单体验 CRIU

论坛 期权论坛 期权     
Node地下铁   2019-6-16 23:22   3785   0
最近了解到 CRIU 这个项目,全称是 Checkpoint/Restore In Userspace,一个用户态的 Linux 进程 Checkpoint/Restore 工具。可以应用的场景很多,比如进程的热迁移、启动加速、程序调试等方面。


下面是一个用 Node.js 演示的例子,比较基础。大家可以感受一下,看看自己有没有应用场景。


[h2]安装 CRIU[/h2]

在 CentOS 7 下安装 CRIU 还是非常简单的:
  1. yum install criu
复制代码
[h2]编写一个测试用的 Node.js 程序[/h2]

编写一个测试程序 index.js,放到 ~/test 目录。下面的程序每秒钟会输出 PID 和一个递增的数字:


  1. let idx=0;
复制代码
  1. [/code][code](async () => {
复制代码
  1.   while(true) {
复制代码
  1.     console.log(process.pid, idx++);
复制代码
  1.     await sleep(1000);
复制代码
  1.   }
复制代码
  1. })().catch(console.error);
复制代码
  1. [/code][code]function sleep(n) {
复制代码
  1.   return new Promise((resolve) => {
复制代码
  1.     setTimeout(resolve, n);
复制代码
  1.   });
复制代码
  1. }
复制代码

我们运行这个程序,大致会输出:


  1. node test.js
复制代码
  1. 3501 0
复制代码
  1. 3501 1
复制代码
  1. 3501 2
复制代码
  1. ...
复制代码
[h2]创建快照[/h2]

基于上面的输出我们知道进程的 PID 是 3501,那我们对这个程序产生快照:


  1. criu dump -j -t 3501 -D ~/testSnapshot
复制代码

然后 3501 的进程就被创建了快照在 ~/testSnapshot,并且进程也被结束了。
上面的参数中,-j 表示是 shell-jobs、-t 表示 PID(代表的进程树)、-D 表示快照保存的目录。

另外,请你记住进程结束的自增数字,比如:


  1. node test.js
复制代码
  1. ...
复制代码
  1. 3501 35
复制代码
  1. 3501 36
复制代码
[h2]恢复进程[/h2]

为了恢复进程,我们运行如下:


  1. criu restore -j -D ~/testSnapshot
复制代码
然后可以观察到进程被恢复了,而且自增数字还是当时的值,并且继续进行着自增,比如:


  1. 3501 37
复制代码
  1. 3501 38
复制代码
  1. ...
复制代码
[h2]最后[/h2]

这是一个简单例子,为了让大家了解到有这么一种技术。就如开头说的一样,这项技术可以用于很多地方,详细可以参考:《Usage scenarios-CRIU》(点击阅读原文)。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:25
帖子:5
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP