Linux criu

简介: Linux criu

填坑了,填坑了,我们昨天使用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的历史

criuc语言开发,最开始的时候是Virtuozzo中的一个大佬在2011年启动的项目,后台在社区的协作下,该项目得以迅速发展,目前已经被podmandocker等软件使用。截止今日(2022年4月7日),版本已经是v3.16.1了。


criu使用场景

我就简单写2个吧,

  1. 之所以写这篇文章,是因为我们在podman中使用了criu,所以其中的使用场景便是"容器迁移" 。
  2. 无感知内核升级(应该没人这么用)。




安装criu


使用yum安装

criu是集成在了系统中,只不过版本迭代的不会太快,我们使用yum安装是最为方便的


当前系统环境查看

image.png


安装
yum install criu -y


查看版本

image.png


环境监测

image.png



源码安装


当前系统环境查看

image.png

从如上截图可以看到,虽然系统是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


查看版本

image.png


环境监测

image.png




使用criu


案例铺垫

我们还是使用昨天的实例代码哈

代码核心为为路由/reader统计访问次数

image.png


启动进程/刷新数据

我们得到了如下信息

pid: 3462

image.png


我们尝试请求路由信息

image.png


使用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连接

image.png



使用criu恢复进程信息

image.png

我们可以看到,程序已经在前台运行了


尝试请求连接

我们尝试请求连接,可以看到进程状态信息还在

image.png


查看进程树

我们可以看到,我们原先进程blogReader父进程已经是criu,但是pid还是3462


image.png



感想


criu太强了,通过podman才了解的,意识到自己真是“井底之蛙”,之前一直听说,某大厂游戏,能够玩家无感知迁移,那时候很好奇,这是怎么做到的,因为在我固有的认知中,进程迁移,或者说网络连接无感知迁移,一直是一个匪夷所思的事情,今天了解了criu基础,让我认识到,这个事情有可能成为可能,就是不知道有没有大厂在此基础上做更一步优化,比如: 游戏故障迁移,对于玩家而言,只是闪断一下,不会将玩家踢出房间。


哎呀,好了,溜了,溜了




相关文章
|
网络协议 网络性能优化 算法
iptables深入解析-mangle篇
      讲了filter、ct、nat 现在剩下最后一个知名模块mangle,但是自身虽然知道内核支持修改数据包的信息,它主要用在策略路由和qos上.我们就具体分析一下.      mangle表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(T...
8197 0
|
Kubernetes Ubuntu Linux
超详细的 Vagrant 上手指南,搭建Linux虚拟机别再用VMware Workstation了!
超详细的 Vagrant 上手指南,搭建Linux虚拟机别再用VMware Workstation了!
5115 0
超详细的 Vagrant 上手指南,搭建Linux虚拟机别再用VMware Workstation了!
|
2月前
|
人工智能 安全 机器人
📘 2026 AI Agent 职业路线图:从研发范式到商业闭环
📘2026 AI Agent职业路线图:AI进入“大航海时代”,从LLM迈向自主智能体。涵盖核心技术栈、四大热门赛道(架构师、具身智能、安全专家、行业产品经理)、实战构建与职业发展路径,助你掌握Agent时代核心竞争力,实现职业跃迁。
938 6
|
API 容器 Kubernetes
当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?
作者 | 阿里云容器平台高级技术专家 曾凡松(逐灵) 本文主要介绍阿里巴巴在大规模生产环境中落地 Kubernetes 的过程中,在集群规模上遇到的典型问题以及对应的解决方案,内容包含对 etcd、kube-apiserver、kube-controller 的若干性能及稳定性增强,这些关键的增强是阿里巴巴内部上万节点的 Kubernetes 集群能够平稳支撑 2019 年天猫 618 大促的关键所在。
|
3月前
|
人工智能 安全 Serverless
AgentRun Sandbox SDK 正式开源!集成 LangChain 等主流框架,一键开启智能体沙箱新体验
AgentRun Sandbox SDK 开源发布,基于阿里云函数计算打造安全、弹性的智能体运行环境。支持代码执行、浏览器操作等多模态沙箱能力,无缝集成 LangChain、AgentScope 等主流框架,让开发更轻盈,云端更安全。
|
监控 Linux 数据处理
Linux中的nsenter命令:深入容器内部,实现无缝交互
`nsenter`是Linux工具,用于进入容器的命名空间,实现与容器内环境的交互。它基于Linux内核的命名空间功能,支持网络、PID等多类型隔离。`nsenter`允许在不停止容器的情况下调试和操作,如 `-t` 指定PID进入命名空间,`-n` 进入网络命名空间。示例包括使用`nsenter`查看容器进程或网络配置。使用时注意目标进程状态,理解命名空间类型,并谨慎操作。
|
缓存 Java 调度
使用scheduleAtFixedRate进行定时任务调度
使用scheduleAtFixedRate进行定时任务调度
|
Kubernetes 关系型数据库 网络架构
ray集群部署vllm的折磨
概括如下: 在构建一个兼容多种LLM推理框架的平台时,开发者选择了Ray分布式框架,以解决资源管理和适配问题。然而,在尝试集成vllm时遇到挑战,因为vllm内部自管理Ray集群,与原有设计冲突。经过一系列尝试,包括调整资源分配、修改vllm源码和利用Ray部署的`placement_group_bundles`特性,最终实现了兼容,但依赖于非官方支持的解决方案。在面对vllm新版本和Ray部署的`reconfigure`方法问题时,又需权衡和调整实现方式。尽管面临困难,开发者认为使用Ray作为统一底层仍具有潜力。
|
前端开发 数据库 Python
Django入门全攻略:从零搭建你的第一个Web项目
Django入门全攻略:从零搭建你的第一个Web项目
|
存储 Ubuntu 网络协议
从Ubuntu-base构建ubuntu rootfs系统(以x86_64和arm为例)
本文介绍了基于Ubuntu-base构建自定义Linux系统的过程,适合嵌入式设备。Ubuntu-base是最小文件系统,包含软件包管理器,可以从Ubuntu源轻松安装软件。文章详细阐述了构建步骤,包括准备宿主系统(确保使用与目标系统相同架构的Ubuntu系统)、创建和挂载分区、配置Ubuntu源、设置DNS、添加用户配置、进入chroot环境以及安装软件(如内核、X-window系统等)。对于arm架构,还提供了通过qemu在X86_64系统上构建arm rootfs的方法。整个过程强调了定制和灵活性,适合对Linux系统有深入了解的开发者。
5160 0

热门文章

最新文章