MIT 6.5840 (Spring, 2024) 通关指南——入门篇
MIT 6.5840 (Spring, 2024) – Startup
👨💻 Charles
🔗 实验手册:6.5840 Home Page: Spring 2024
文章目录
- MIT 6.5840 (Spring, 2024) -- Startup
- about test
- about debug
今年学习了久仰大名的 MIT 6.5840 (Spring, 2024) (原 6.824),收获颇多,写几篇 note 记录一下各个 lab 的 受虐 实现过程。本篇会介绍一些开始实验前的准备工作。
考虑到这门课的难度,准备尝试这个 lab 的同学想必已经有了一定计算机基础,因此假设基础配置已经完成(代码编辑器,go 语言环境等)——你可以先检查是否配好了:
- Linux 环境(虚拟机 or WSL)
- go 语言环境
- 代码编辑器(vscode 等)
- Git
about test
6.5840 的各个 lab 都配备了非常多的测试样例,通过 go test
进行测试,即:
go test -run name_of_the_test
然而,在后期的分布式实验中,有些错误并不是每次测试都能遇到 (即 corner case) ,可能你跑几百甚至上千次才出现一两次——如果手动一次次的 go test
会累死😵。因此,就像本课助教 Jose Javier(亦是著名的 The Missing Semester of Your CS Education 的作者之一)说的,我们需要一个脚本来:
- 执行 N 次某组测试
- 保存测试失败时的日志以供后续检查
- 并行跑测试以提升效率
为此,助教写了个 python 脚本方便我们跑测试,具体设计详见 Debugging by Pretty Printing 。我用的是一个网上大佬修改后的版本:Utility for running MIT 6.824 lab test in parallel and saving failed logs ,实测可用。具体地,你需要:
-
将这个
dstest.py
放到每个 lab 对应的test_test.go
的相同路径下 -
安装对应 python package (主要是 typer)
我用
conda
配置的环境,但是运行的时候出现报错:TypeError: TyperArgument.make_metavar() takes 1 positional argument but 2 were given
后来发现是
conda install
的typer
和click
包版本不兼容,因此先:conda remove click typer
然后:
pip install click==8.1.3 typer==0.8.0
就可以了。
-
添加执行权限:
chmod +x dstest.py
-
运行:
./dstest.py --help
正常情况下即可输出使用说明:
实验手册 会告诉你每个 lab 各部分的测试该怎么跑,以内容最多的 lab3 为例,其 Part B 有很多测试点:

每个 lab 的具体测试点都可以在对应文件夹里面的 test_test.go
中找到。例如:
因此,当你卡在某(几)个测试点的时候,不妨来这里看看具体测试流程是什么(看不懂可以直接扔给 AI,它包看得懂的)。然后,结合上面的测试脚本,可以方便地针对某些测试点多次测试(这对于检查跑几十次才会遇到的 corner case 很有用),例如:
./dstest.py
的可选参数可以通过./dstest.py --help
了解,上文亦有展示。比如,上图采用了:
-p 4
:4 个并行 worker,并发地跑测试-n 50
:每个测试跑 50 次-r
:开启数据竞争检查
添加 -o <folder_path>
可以设置保存出错测试日志的文件夹:
💡 后面的分布式相关实验涉及大量并发,因此每个 lab 测试的时候都要记得用
-race
检查有无数据竞争:
go test -race xxx
./dstest.py -r xxx
about debug
在后续的 lab 中,盯着日志找出错原因的时间很可能会远远大于写代码的时间,因此我觉得从一开始就确定(你自己看得懂、看得清楚的)日志形式蛮重要的。默认代码中的日志打印方式为:
import "log"// Debugging
const Debug = truefunc DPrintf(format string, a ...interface{}) {if Debug {log.Printf(format, a...)}
}
使用效果为:
func main() {n := 101DPrintf("this is a log output, %d", n)
}>>> 2025/08/24 21:45:55 this is a log output, 101
如果按照助教的 Debugging by Pretty Printing 来,你的日志会是这样的:
确实 酷炫 清晰不少。但是具体还是看自己需求,我自己是仅仅加了根线和微秒级时间戳:
func DPrintf(format string, a ...interface{}) {if Debug {log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds)log.Println(strings.Repeat("-", 100))log.Printf(format, a...)}
}
使用效果为:
其中 R[x_y]
表示节点 x
,它当前 term 为 y
。对我而言这种形式就够用了。