跳到主要内容

MIT-6.824 Lab 1

1. 课程学习资料

2. 环境配置

2022 版安装文档 6.824 Go (mit.edu) 指出 Windows 端的 WSL 似乎存在问题,但为了方便,我打算先尝试 VSCode+WSL2 的方案。

在 Windows 平台安装 Ubuntu 22.04 LTS 版本,一些配置参考 WSL 安装 Oh My Zsh ,遇到的新问题如下:

Go 的安装参考 Download and install - The Go Programming Language

uname -a
# install
rm -rf /usr/local/go
wget -qO- https://go.dev/dl/go1.23.1.linux-amd64.tar.gz | sudo tar xz -C /usr/local
sudo apt-get install build-essential
# ~/.zshrc
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
# test
go version

参考 VsCode Go 插件配置最佳实践指南 - 知乎 (zhihu.com) ,在 VSCode 中安装官方插件,调试 6.824 程序需要进一步修改 launch.json 文件。

3. Paper Reading

Execution Overview

  • coordinater(master) 需要保存任务状态、追踪任务执行者
  • 3.3 节提供了关于容错的设计,如何保证原子性

待补充……

4. Getting started

拉取 6.824 代码后,IDE 提示多个错误,大多数是由 Go 语言限制同一包内不应存在同名函数导致的。

4.1 串行版本的运行

6.824 课程代码提供了一个简单的串行 Map Reduce 实现,使用如下命令运行:

cd src/main
go build -race -buildmode=plugin ../mrapps/wc.go
go run -race mrsequential.go wc.so pg*.txt

命令参数的含义如下:

4.2 串行版本的调试

为了在 VSCode 中调试 Go 程序,首先需要在「运行和调试」中配置 launch.json 中的调试配置:

{
    "version": "0.2.0",
    "configurations": [
        {
            "debugAdapter": "dlv-dap",
            "name": "mrsequential",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}/src/main/mrsequential.go",
            "args": [
                "wc.so",
                "pg-grimm.txt",
                "pg-frankenstein.txt"
            ],
            "buildFlags": "-race"
        }
    ]
}

args 中输入调试时的参数,需要注意的是,之前编译的 .so 共享库不能在调试模式下正常运行,参考 go - Failed in error “plugin was built with a different version of package” while debugging - Stack Overflow ,插件应与主应用程序使用相同的标志编译,需要在编译时开启 -gcflags="all=-N -l" 选项,对该插件的所有包关闭编译器优化、取消内联,以支持断点调试。

go build -race -buildmode=plugin -gcflags="all=-N -l"  ../mrapps/wc.go

而关于整体实验的调试方法论,可以参看 Lab guidance (mit.edu)

5. Your Job

5.1 GO RPC

RPC 是远程过程调用的简称,是分布式系统中不同节点间流行的通信方式。