近日,OSDI ’25 公布论文入选结果。SmartX 研发人员的研究成果 KRR 及论文《KRR: Efficient and Scalable Kernel Record Replay》成功入选。SmartX 研发工程师张天任是论文的第一作者,普渡大学博士生 Sishuai Gong 以及助理教授 Pedro Fonseca 是论文的共同作者。该研究的出发点源于日常工作中对虚拟化和内核调试的需求。

OSDI(Symposium on Operating Systems Design and Implementation)是计算机系统领域最具影响力的国际学术会议之一。本届会议共收到 327 篇投稿,最终录用 48 篇,录取率 14.6%。

背景和挑战

现代内核体积庞大、结构复杂。但正因为如此,内核故障对于开发人员来说非常难以诊断,尤其是实际部署中遇到的故障通常极其难以复现。虽然 record-replay 技术可以准确地重现失败执行过程,实现确定性重放,从而支持更高级的手动或自动化分析,但现有的 whole-VM record-replay 方法需要拦截和记录所有的硬件输入以及虚拟机状态,效率低下,无法很好地应对现代化高并发和 I/O 密集型的工作负载。

核心设计

基于此,研究团队提出了 Kernel Record and Replay(KRR) 技术,其通过将记录和重放的边界缩小到内核,实现高效的执行记录机制。

KRR 采用 split-recorder 设计,利用 Guest 与 Host 协同完成内核执行的记录。

  • In-guest Recorder:运行在虚拟机内核中,记录所有系统调用和用户数据,以及 bypass hypervisor 的硬件指令
  • Hypervisor Recorder:运行在宿主机上,记录其他的硬件指令

这种设计能够高效且低开销地记录内核所涉及的接口。两个记录器共同记录所有影响内核执行的非确定性事件,并按执行顺序生成事件记录日志。在重放时,KRR 可以通过逐个注入这些已记录事件,准确复现当时的内核执行片段。

KRR 记录以下三类事件:

  • 提供给内核的所有输入
  • 内核调度及其他非确定性因素
  • 内核的初始状态

在重放过程中,重建内核的执行会遵循精心设计的流程,即 KRR 首先加载虚拟机快照,并按照记录下来的事件轨迹恢复出原始的执行环境。系统采用了多种技术来确保执行过程与原始一致,包括:

  • 基于记录的执行顺序调度 vCPU 线程;
  • 利用虚拟机断点拦截对用户态内存的访问,从而恢复内存状态;
  • 在 I/O 操作期间复现硬件输入;
  • 通过指令计数精确控制时序,在与记录时完全相同的时间点注入异步事件。

测试结果

KRR 在多种不同负载下(包括内核编译、RocksDB、Nginx)均可高效扩展到 8 核。当在 8 核虚拟机中运行 RocksDB 和内核编译任务时,KRR 仅带来 1.52 倍至 2.79 倍的性能损耗,相比之下,传统的 whole-VM record-replay 方法会带来 8.97 倍至 29.94 倍的性能损耗。

此外,研究验证了 KRR 的实用性和广泛的记录能力,成功复现了不同 Linux 版本中的 17 个 bug,包括 6 个非确定性 bug 和 5 个高风险 CVE;除了 1 个非确定性 bug 之外,KRR 能够记录并复现其余所有问题。

研究价值

KRR 能以更高效的方式记录并回放复杂的内核错误场景,为内核开发者提供了一个强大的、可进行确定性调试的工具,极大的提升了内核故障调试的效率。

全文链接:https://www.usenix.org/conference/osdi25/presentation/zhang-tianren

继续阅读