版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。CRIU 可以检测一个或多个任务从某一时刻开始,哪些内存页发生了改变。本文介绍为什么要有这个功能以及它是如何工作的。
为什么我们要追踪进程虚拟内存的改变怎样追踪进程虚拟内存的改变在CRIU工具中怎么使用此功能
1、为什么我们要追踪进程虚拟内存的改变
我们有理由需要我们追踪进程虚拟内存的改变。下面列举了3个典型优势
优势1:增量备份
当你正在对一个进程树做备份时,最佳方式就是备份自上次备份点开始,那些发生改变的进程内存页,而不是每次都备份这个进程所有的内存页。
这就像我们对代码打patch,只关心被修改的部分。这样即可以减少备份后的文件大小,又提高了备份时的速度。这就是增量备份的优点。
优势2:更小冻结时间
当一个任务正在使用大量内存时,备份它将花费一定时间并且备份它的过程中,任务是被冻结住的,就像是我们对音乐按了暂停键。为了降低这个冻结时间,我们就要降低备份它的时间。
优势3:热迁移
热迁移(Live Migration),又叫动态迁移、实时迁移,即虚拟机保存/恢复,通常是将整个虚拟机的运行状态完整保存下来,同时可以快速的恢复到原有硬件平台甚至是不同硬件平台上。恢复以后,虚拟机仍旧平滑运行,用户不会察觉到任何差异。
当我们做热迁移时,大量的时间被花在拷贝当前机器上的程序内存镜像到另一个目标机器上,而这段时间内,这个程序的进程还在冻结状态。如果我们能减少这个内存镜像的大小,就是减少了跨机器的拷贝时间,也就是减少了进程的冻结时间。
2、如何跟踪内存变化
为了在一般用户程序(用户态程序)里就能找到哪些内存页发生了变化,需要内核里的相关支持。整个跟踪内存变化过程分如下两步:
第一步:内核检测内存变化。当某个程序的内存发生改变时,内核就把数值4写入/proc/$pid/clear_refs节点。pid就是进程号。
在这个过程中,内核会以只读方式重新映射所有任务的内存。如果此时有进程试着向本进程的某个内存页写入数据,会发生PAGE FAULT错误。
第二步:我们通过读取/proc/$pid/pagemap文件来获取一个进程中被修改的内存页的列表。然后查看pagemap中成为
s