填坑了,填坑了,我们昨天使用podman
创建“快照”并且恢复,今天我们来了解下其使用的criu
技术本身。
为避免后来者因为环境版本问题而阅读该文章实验且出错,所以特此提醒:
目前该文章实验环境基于
操作系统: CentOS Linux release 7.6.1810 (Core)
内核版本: 5.4.188-1.el7.elrepo.x86_64
criu版本: v3.16.1
什么是criu
criu 的功能
criu
项目是为了Linux
建立检查点并且恢复的项目,换句话说,可以“暂停”运行中的程序,并且将该程序的运行信息以数据的形式保留在磁盘上,而后可以“恢复”到本机或者其他机器上去,不会引起内存数据的丢失,得以保存运行态数据。
criu的历史
criu
由c
语言开发,最开始的时候是Virtuozzo
中的一个大佬在2011
年启动的项目,后台在社区的协作下,该项目得以迅速发展,目前已经被podman
、docker
等软件使用。截止今日(2022年4月7日),版本已经是v3.16.1
了。
criu使用场景
我就简单写2个吧,
- 之所以写这篇文章,是因为我们在
podman
中使用了criu
,所以其中的使用场景便是"容器迁移" 。 - 无感知内核升级(应该没人这么用)。
安装criu
使用yum安装
criu是集成在了系统中,只不过版本迭代的不会太快,我们使用yum
安装是最为方便的
当前系统环境查看
安装
yum install criu -y
查看版本
环境监测
源码安装
当前系统环境查看
从如上截图可以看到,虽然系统是centos 7.6
但是内核我已经升级到了5.4
下载criu源码包
mkdir -p soft cd soft wget https://github.com/checkpoint-restore/criu/archive/refs/tags/v3.16.1.tar.gz tar xf v3.16.1.tar.gz
安装相关依赖
yum install -y gcc make protobuf protobuf-c protobuf-c-devel \ libnl libnl3-devel libcap libcap-devel protobuf-compiler \ protobuf-devel libnet-devel libnet protobuf-python
安装criu
cd criu-3.16.1/ make
查看版本
环境监测
使用criu
案例铺垫
我们还是使用昨天的实例代码哈
代码核心为为路由/reader
统计访问次数
启动进程/刷新数据
我们得到了如下信息
pid: 3462
我们尝试请求路由信息
使用criu保存进程状态信息
命令: ./criu/criu dump --tree 3462 --images-dir /tmp/criu_test/ --shell-job --tcp-established
其中:
3462 是我们进程的PID
--images-dir 是img存放的路径
--shell-job 是告知criu程序是从shell启动并且使用shell终端
--tcp-established 是告知criu,程序有tcp连接
使用criu恢复进程信息
我们可以看到,程序已经在前台运行了
尝试请求连接
我们尝试请求连接,可以看到进程状态信息还在
查看进程树
我们可以看到,我们原先进程blogReader
父进程已经是criu
,但是pid
还是3462
感想
criu
太强了,通过podman
才了解的,意识到自己真是“井底之蛙”,之前一直听说,某大厂游戏,能够玩家无感知迁移,那时候很好奇,这是怎么做到的,因为在我固有的认知中,进程迁移,或者说网络连接无感知迁移,一直是一个匪夷所思的事情,今天了解了criu
基础,让我认识到,这个事情有可能成为可能,就是不知道有没有大厂在此基础上做更一步优化,比如: 游戏故障迁移,对于玩家而言,只是闪断一下,不会将玩家踢出房间。
哎呀,好了,溜了,溜了