Facebook 发布 Hermit,一个用于可重复程序执行的工具包

Facebook(在俄罗斯联邦被禁止)发布了 Hermit 工具包的代码,该工具包创建了一个确定性执行程序的环境,允许不同的运行获得相同的结果,并使用相同的输入数据重复执行。 该项目代码是用 Rust 编写的,并在 BSD 许可证下分发。

在正常执行期间,结果受到各种无关因素的影响,例如当前时间、线程调度、虚拟内存地址、来自伪随机数生成器的数据以及各种唯一标识符。 Hermit 允许您在容器中运行程序,其中这些因素在后续运行中保持不变。 可重复执行,完全重现环境的非持久参数,可用于错误诊断、重复运行的多步调试、为回归测试创建固定环境、压力测试、识别多线程和可重复构建系统中的问题。

Facebook 发布 Hermit,一个用于可重复程序执行的工具包

通过拦截系统调用来创建可重现的环境,其中一些系统调用被替换为它们自己的处理程序,产生永久结果,一些被重定向到内核,然后清除结果中的非持久数据。 为了拦截系统调用,使用了 reverie 框架,其代码也由 Facebook 发布。 为了防止文件系统和网络请求的变化影响执行进度,使用固定的FS镜像执行,并且禁止访问外部网络。 当访问伪随机数生成器时,Hermit 会生成一个预定义的序列,每次启动时都会重复该序列。

对执行进度影响最复杂的变量之一是线程调度程序,其行为取决于许多外部因素,例如 CPU 核心的数量和其他执行线程的存在。 为了确保调度程序的可重复行为,所有线程仅与一个 CPU 核心相关地串行执行,并保持控制权转移到线程的顺序。 每个线程被允许执行固定数量的指令,之后执行停止并转移到另一个线程(以限制CPU PMU(性能监控单元),它在指定数量的条件分支后停止执行)。

为了诊断由于竞争条件导致的线程问题,Hermit 有一种模式可以识别执行顺序无序并导致异常关闭的操作。 为了识别此类问题,对记录正确操作和异常终止执行的状态进行比较。

来源: opennet.ru

添加评论