第9章:端到端实战 v27 复现 —— CloudLab 5-node 一条龙 + 日志到 paper 表格的 cookbook
从 0 到 KOPS 跑通 AURA v27 §6 所有正向数据的端到端实战:CloudLab 5-node 集群 setup(OFED 4.9 + IOMMU passthrough + mlx5_2 校验)、3 条 smoke 脚本(5-cell / a1b / drift)的运行方式、日志到 paper §6 表格的 cookbook、故障速查表
前 8 章把 v27 的 thesis、设计、负结果、方法论都讲透了。最后一章是实战——从拿到 CloudLab 5-node 集群、跑通 OFED + IOMMU 配置、build CREST、启动 MN + 4 CN + client,到 3 条 smoke 脚本(5-cell / a1b / drift)的产出日志怎么变成 paper §6 表格中的数字,全流程都给出可复制粘贴的命令。本章不讲设计哲学,只讲怎么把 v27 的 §6 数据一字不漏地复现出来——读完你拿到任意 CloudLab c6525-25g 5-node experiment,理论上 1.5 小时内可以跑出 RQ1 + RQ2 + RQ3 三份正向数据。
📑 目录
- 1. CloudLab 5-node 集群 setup 速通
- 2. OFED 4.9 + IOMMU passthrough + mlx5_2 校验
- 3. CREST 部署与 build
- 4. 三条 smoke 脚本:5-cell / a1b / drift
- 5. 日志到 paper §6 表格的 cookbook
- 6. 故障速查表
- 7. 5/12 节点 punt 决定为什么是对的
1. CloudLab 5-node 集群 setup 速通
1.1 Profile + 节点角色
申请 small-lan profile, 5 × c6525-25g (Utah cluster)。
5 节点角色固定(这套配置已在 v27 全套实验上验证稳定):
| 角色 | 节点 | Hostname | 控制 IP | RDMA IP (ens1f0, mlx5_2 gid 3) | 状态 |
|---|---|---|---|---|---|
| MN | node2 | amd103.utah.cloudlab.us | 128.110.219.14 | 10.10.1.3 | ✅ 稳定 |
| CN0 | node3 | amd118.utah.cloudlab.us | 128.110.219.29 | 10.10.1.4 | ✅ 稳定 |
| CN1 | node1 | amd107.utah.cloudlab.us | 128.110.219.18 | 10.10.1.2 | OK |
| CN2 | node4 | amd112.utah.cloudlab.us | 128.110.219.23 | 10.10.1.5 | OK (不做 MN) |
| 备用 | node0 | amd119.utah.cloudlab.us | 128.110.219.30 | 10.10.1.1 | 不稳定 |
警告:amd119 / amd112 历史上多次因 MR 溢出导致 kernel panic 而死机——尽量避免做 MN。当前稳定配置:MN=amd103, CN0=amd118。
1.2 SSH 配置
CL_KEY=/Users/yanchaomei/Desktop/Working/id_ed25519
# 直连测试(Clash TUN 关闭时)
ssh -i $CL_KEY chaomei@128.110.219.14 'hostname' # 应输出 amd103
ssh -i $CL_KEY chaomei@128.110.219.29 'hostname' # 应输出 amd118
如果直连失败:Clash TUN 模式劫持所有 TCP 包括 SSH——解法:
- 关闭 Clash TUN 模式;或
- Clash 规则最前面加
IP-CIDR,128.110.219.0/24,DIRECT
🍎 直觉比喻:Clash TUN 像在所有出口装关卡——ping (ICMP) 不查,但所有 TCP(包括 SSH)都被截。CloudLab 的 IP 不在 Clash 白名单 → SSH 被吞。
1.3 SSH 长连接保护
实验跑 60 s+,必须开 keepalive:
SSH_OPTS="-i $CL_KEY \
-o ServerAliveInterval=20 \
-o ServerAliveCountMax=15 \
-o TCPKeepAlive=yes \
-o LogLevel=QUIET \
-o StrictHostKeyChecking=no"
ssh $SSH_OPTS chaomei@128.110.219.14 ...
详见第 8 章 §7.3。
2. OFED 4.9 + IOMMU passthrough + mlx5_2 校验
CloudLab profile 默认装 Ubuntu 但没装 OFED——需要手动装。
2.1 OFED 4.9 安装
CREST 依赖 ibv_exp_* verbs(experimental verbs),必须 OFED 4.9 而不是 OFED 5.x(5.x 把 exp verbs 去掉了)。
# 下载 MLNX_OFED 4.9-7.1.0.0
wget https://content.mellanox.com/ofed/MLNX_OFED-4.9-7.1.0.0/MLNX_OFED_LINUX-4.9-7.1.0.0-ubuntu20.04-x86_64.tgz
tar -xzf MLNX_OFED_LINUX-4.9-7.1.0.0-ubuntu20.04-x86_64.tgz
cd MLNX_OFED_LINUX-4.9-7.1.0.0-ubuntu20.04-x86_64
# Ubuntu 20.04 (kernel 5.4) 需要 add-kernel-support
sudo ./mlnxofedinstall --add-kernel-support --without-fw-update
sudo /etc/init.d/openibd restart
⚠️ CloudLab 旧 5-node experiment 用的是 Ubuntu 18.04,OFED 直接装就行。
⚠️ CloudLab 新 7-node experiment(new.intelisys-pg0)是 Ubuntu 20.04,必须 --add-kernel-support。
2.2 IOMMU passthrough
这步漏掉 = RDMA read 全 0:
sudo vi /etc/default/grub
# 在 GRUB_CMDLINE_LINUX_DEFAULT 加 iommu=pt
# 例如:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash iommu=pt"
sudo update-grub
sudo reboot
reboot 后验证:
dmesg | grep -i "iommu.*pass"
# 应输出: AMD-Vi: ... pass-through (or similar)
🧠 关键洞察:如果 IOMMU 不是 passthrough,RDMA WRITE 会返回 SUCCESS 但数据是全 0——这是 CloudLab 上 CREST 的最大隐性陷阱。WC 状态 IBV_WC_SUCCESS 误导调试方向。
2.3 mlx5_2 校验
CloudLab c6525-25g 有 两张 RDMA 网卡:
mlx5_0→ bonded toeno33(control network) ← 禁用mlx5_2→ bonded toens1f0(experiment network, 10.10.1.x) ← 正确数据通路
走错网卡的代价:
- 用 mlx5_0 跑大流量 → CloudLab 检测到 control network 流量过载 → 强制停实验
验证 mlx5_2 配置:
ibstatus mlx5_2
# 应见:
# Infiniband device 'mlx5_2' port 1 status:
# state: PORT_ACTIVE
# phys_state: LINK_UP
ibv_devinfo -d mlx5_2 -v | grep -E "active_mtu|gid|state"
# active_mtu: 1024 (注意:默认 4096,但 CREST 代码改成 1024)
# GID[3]: RoCEv2 IPv4 = 10.10.1.x
2.4 Atomic IOPS 上限验证
跑 ib_atomic_bw 测当前硬件 atomic 上限:
# Server (MN)
ssh -i $CL_KEY chaomei@128.110.219.14 'ib_atomic_bw -d mlx5_2 -F'
# Client (CN0)
ssh -i $CL_KEY chaomei@128.110.219.29 'ib_atomic_bw -d mlx5_2 -F 10.10.1.3'
输出应在 5-10 Mpps 量级(ConnectX-6 Dx 物理上限,第 2 章 §1)。
3. CREST 部署与 build
3.1 仓库 + 部署目录
- 本地仓库:
/Users/yanchaomei/Desktop/Working/2026科研/DisaggTxn/CREST-aura-impl/CREST-Opensource-0007/ - 远程部署:
/users/chaomei/CREST-Opensource-0007/(每个节点都要)
3.2 同步代码
CL_KEY=/Users/yanchaomei/Desktop/Working/id_ed25519
CREST_LOCAL=/Users/yanchaomei/Desktop/Working/2026科研/DisaggTxn/CREST-aura-impl/CREST-Opensource-0007
# 同步到所有 5 节点
for IP in 128.110.219.14 128.110.219.29 128.110.219.18 128.110.219.23 128.110.219.30; do
rsync -avz --exclude='.git' --exclude='build' --exclude='core' --exclude='*.o' \
-e "ssh -i $CL_KEY -o StrictHostKeyChecking=no" \
$CREST_LOCAL/ chaomei@$IP:/users/chaomei/CREST-Opensource-0007/
done
⚠️ rsync 静默 SIGSEGV:在 CloudLab CN 节点上 rsync 偶尔会静默 SIGSEGV(参考 memory feedback)。如发现部分文件没同步,改用 scp + grep 校验:
ssh -i $CL_KEY chaomei@$IP 'grep -c "v27" /users/chaomei/CREST-Opensource-0007/PROGRESS.md'
# 应输出 > 0
3.3 Build
每个节点都要 build(client 在 MN 节点跑,但所有 binary 必须一致):
for IP in 128.110.219.14 128.110.219.29 128.110.219.18 128.110.219.23 128.110.219.30; do
ssh -i $CL_KEY chaomei@$IP \
"cd /users/chaomei/CREST-Opensource-0007 && \
rm -rf build && mkdir build && cd build && \
cmake -DCMAKE_BUILD_TYPE=Release .. && \
make -j40"
done
5 节点 × 5 min 编译 ≈ 25 min,可以并行用 &。
3.4 Memcached(只在 MN)
ssh -i $CL_KEY chaomei@128.110.219.14 \
"sudo systemctl stop memcached; \
memcached -d -p 11211 -u chaomei -m 256 -c 1024 -l 0.0.0.0; \
sleep 1; \
ss -tlnp | grep 11211"
# 应输出 0.0.0.0:11211 LISTEN
⚠️ 系统自启的 memcached 绑 127.0.0.1——CN 远程连不上。必须手动 stop + 用 -l 0.0.0.0 重启。
4. 三条 smoke 脚本:5-cell / a1b / drift
4.1 RQ1 静态 5-cell ablation
cd /Users/yanchaomei/Desktop/Working/2026科研/DisaggTxn/CREST-aura-impl/CREST-Opensource-0007
bash bench/aura/run_v27_step6.sh 3 200000 # 3 reps × 5 cells × 200K txn
参数:
$1 = REPS:每 cell 跑几次$2 = TXN_NUM:每次跑多少 txn(cap,时间到也停)
输出:
/tmp/aura_v27_step6_<timestamp>/
├── baseline_rep0/ m_client.log, m_cn{0..3}.log, m_mn.log, *.details.txt
├── baseline_rep1/
├── baseline_rep2/
├── +a1_rep0/ ... +a3_rep2/
├── full_v27_rep0/ ... full_v27_rep2/
└── summary.csv # 5 cells × 3 reps × {tried_kops, commit_kops, atomic_per_txn, cn balance}
完整跑约 15 cells × 80 sec ≈ 20 min。
4.2 RQ3 A1 tuner ablation
bash bench/aura/run_v27_a1b_smoke.sh 3 200000
3 cells × 3 reps:fixed / rule / sgd。
输出:
/tmp/aura_v27_a1b_<timestamp>/
├── fixed_rep{0,1,2}/
├── rule_rep{0,1,2}/
└── sgd_rep{0,1,2}/ # log 含 "self-tuned.*sgd" 行(权重演化)
完整跑约 9 cells × 80 sec ≈ 12 min。
4.3 RQ2 drift workload
bash bench/aura/run_v27_drift_smoke.sh 3 200000 # 60s duration in script
3 cells × 3 reps:no_drift / drift_5sec / drift_2sec。
输出:
/tmp/aura_v27_drift_<timestamp>/
├── no_drift_rep{0,1,2}/
├── drift_5sec_rep{0,1,2}/
└── drift_2sec_rep{0,1,2}/
summary.csv 额外列:n_sgd_logs(self-tuned 计数)
完整跑约 9 cells × 90 sec ≈ 14 min(60 s 实验 + 30 s setup)。
4.4 完整 §6 数据采集
三条脚本串起来:
bash bench/aura/run_v27_step6.sh 3 200000 # ~20 min
bash bench/aura/run_v27_a1b_smoke.sh 3 200000 # ~12 min
bash bench/aura/run_v27_drift_smoke.sh 3 200000 # ~14 min
# 总计 ~46 min
加上数据回收 + 清理 ≈ 1 小时。
5. 日志到 paper §6 表格的 cookbook
5.1 提取 KOPS / commit rate
cd /tmp/aura_v27_step6_*/full_v27_rep0/
grep -oE 'Tried Throughput: [0-9.]+' m_client.log | head -1
# Tried Throughput: 14.32
grep -oE 'Commit Troughput: [0-9.]+' m_client.log | head -1
# Commit Troughput: 13.70
grep -oE 'Tried: [0-9]+' m_client.log | head -1
# Tried: 859200
grep -oE 'Committed: [0-9]+' m_client.log | head -1
# Committed: 822000
注意:CREST 日志里 “Troughput” 是拼写错(throughput 少 h)——grep 时要按它的拼写来。
5.2 提取 atomic/txn
TOTAL_ATOMIC=0
for i in 0 1 2 3; do
CN_ATOMIC=$(grep -E 'tpcc\.(NEWORDER|PAYMENT|DELIVER|ORDER_STATUS)\.rdma\.atomic\.total' \
m_cn${i}.details.txt \
| awk '{sum+=$NF} END{print sum+0}')
TOTAL_ATOMIC=$((TOTAL_ATOMIC + CN_ATOMIC))
done
COMM_NUM=$(grep -oE 'Committed: [0-9]+' m_client.log | head -1 | awk '{print $2}')
echo "scale=2; $TOTAL_ATOMIC / $COMM_NUM" | bc
# 12.10
5.3 提取 SGD 权重演化
cd /tmp/aura_v27_drift_*/drift_5sec_rep0/
# 提取每行 SGD 权重 self-tune
grep "self-tuned.*sgd" m_client.log | awk '{print $1, $5, $7, $9, $11}'
# 输出:timestamp atomic_w rpc_w move_w load_w
输出格式(示例):
[t=0.10s] atomic=0.500 rpc=1.000 move=2.500 load=0.180
[t=0.20s] atomic=0.498 rpc=1.020 move=2.500 load=0.180
[t=5.10s] atomic=0.480 rpc=1.100 move=2.520 load=0.200 ← phase 切换
[t=5.20s] atomic=0.485 rpc=0.985 move=2.667 load=0.179
...
5.4 跨 rep median + bootstrap CI
把上面提取的数字(每 cell 3 reps)算中位数 + bootstrap CI:
#!/usr/bin/env python3
import numpy as np
from numpy.random import choice
def median_with_ci(reps, n_bootstrap=1000):
reps = np.array(reps)
bootstrap = np.array([
np.median(choice(reps, size=len(reps), replace=True))
for _ in range(n_bootstrap)
])
median = np.median(reps)
ci_lo, ci_hi = np.percentile(bootstrap, [2.5, 97.5])
return median, ci_lo, ci_hi
# Full v27 3 reps
reps_full = [13.64, 13.71, 13.58]
m, lo, hi = median_with_ci(reps_full)
print(f"full_v27: {m:.2f} [{lo:.2f}, {hi:.2f}]")
# full_v27: 13.64 [13.58, 13.71]
5.5 一键 summary.csv → paper table
bench harness 已经写了 summary.csv,直接读:
import pandas as pd
df = pd.read_csv('/tmp/aura_v27_step6_*/summary.csv')
print(df.groupby('cell')['commit_kops'].agg(['median', 'std']))
paper §6.2 那张表的数字直接从 summary.csv 拼出来。
5.6 SGD 权重时间序列图
import matplotlib.pyplot as plt
import re
times, atomic_w, rpc_w, move_w, load_w = [], [], [], [], []
with open('m_client.log') as f:
for line in f:
m = re.search(r't=([\d.]+).*atomic=([\d.]+).*rpc=([\d.]+).*move=([\d.]+).*load=([\d.]+)', line)
if m:
times.append(float(m.group(1)))
atomic_w.append(float(m.group(2)))
rpc_w.append(float(m.group(3)))
move_w.append(float(m.group(4)))
load_w.append(float(m.group(5)))
plt.figure(figsize=(10, 4))
plt.plot(times, atomic_w, label='atomic_cost')
plt.plot(times, rpc_w, label='rpc_cost')
plt.plot(times, move_w, label='move_cost')
plt.plot(times, load_w, label='load_cost')
# Phase 切换垂直虚线(每 5 s)
for t in range(5, 65, 5):
plt.axvline(t, color='gray', linestyle='--', alpha=0.5)
plt.xlabel('Time (s)')
plt.ylabel('Weight value')
plt.legend()
plt.savefig('sgd_weight_evolution_drift_5sec.pdf')
这是 §6.4 headline 图。
6. 故障速查表
完整 9 条故障 + 解法(合并第 8 章 §7 + 实际运行经验):
| # | 症状 | 根因 | 解法 |
|---|---|---|---|
| 1 | RDMA read / atomic 全 0 | IOMMU 没设 passthrough | grub 加 iommu=pt + reboot |
| 2 | CN 无限 wait SyncComputeNodes | config 中 CN 数 ≠ 实际 CN 数 | 修 config 文件 (config/sanity_*.json) |
| 3 | Memcached connection refused | 系统 memcached 绑 127.0.0.1 | sudo systemctl stop + 手动 -l 0.0.0.0 |
| 4 | MR 溢出 / kernel panic | 数据量超过 mr_size | 降 MAX_PAYMENT_CNT + 升 mr_size to 32 |
| 5 | 节点 kernel panic 频发 | amd119 / amd112 历史问题 | 避免做 MN,仅做 CN |
| 6 | SSH 60s 中途断 | TCP keepalive 不够 | -o ServerAliveInterval=20 -o ServerAliveCountMax=15 |
| 7 | client crash “terminate called” | Drift::Stop 没 hit | BenchRunner.cc 早 return 路径补 Drift::Stop |
| 8 | 11GB core dump 撑满 | rm core/* glob 不展开(单 file) | sudo rm -f /users/chaomei/CREST-Opensource-0007/core /tmp/core.* |
| 9 | Clash 劫持 SSH | TUN 模式劫持所有 TCP | 关 TUN 或加 IP-CIDR,128.110.219.0/24,DIRECT |
⭐ 教学重点:这张表的每一行都对应一次”我们踩过坑、修好了”的真实经历,是 v27 paper §6.1 setup 章节的”细节增量”。
6.1 实验前 sanity 一条龙
跑实验前过这 5 条 sanity,能避开 70% 的”实验跑完发现数据不对”:
# (1) IOMMU passthrough?
ssh -i $CL_KEY chaomei@128.110.219.14 'dmesg | grep -i "iommu.*pass"'
# (2) mlx5_2 active?
ssh -i $CL_KEY chaomei@128.110.219.14 'ibstatus mlx5_2 | grep PORT_ACTIVE'
# (3) memcached 0.0.0.0?
ssh -i $CL_KEY chaomei@128.110.219.14 'ss -tlnp | grep 11211'
# (4) Binary 一致?
for IP in 128.110.219.14 128.110.219.29 128.110.219.18 128.110.219.23; do
ssh -i $CL_KEY chaomei@$IP 'md5sum /users/chaomei/CREST-Opensource-0007/build/benchmark/bench_runner'
done # 5 个 md5 应该一致
# (5) core dump 清掉
for IP in 128.110.219.14 128.110.219.29 128.110.219.18 128.110.219.23; do
ssh -i $CL_KEY chaomei@$IP 'sudo rm -f /users/chaomei/CREST-Opensource-0007/core /tmp/core.*'
done
7. 5/12 节点 punt 决定为什么是对的
7.1 决定背景
第 8 章 §6 已分析——5-node 集群只能 1 MN + 4 CN。如果想做 RQ5 (CN scale-out 1/4/8/12 CN sweep),需要 12-node cluster。
CloudLab 已申请新 7-node experiment (new.intelisys-pg0),但需要:
- OFED 4.9 +
--add-kernel-support(Ubuntu 20.04) - IOMMU passthrough + reboot
- 验证 mlx5_X = ens1f0
- 配置文件重新生成
总估时 ~10 天。
7.2 4 条 punt 标准的验证
(对照第 7 章 §6 的 4 条标准)
| 标准 | 触发情况 | 决定 |
|---|---|---|
| 1. 连续修不动 + 根因没动 | 不适用(不是修问题) | — |
| 2. 工具/环境超出可调范围 | 不适用(新 cluster 有,只是要时间) | — |
| 3. caveat 写法论证更强 | RQ5 缺失不反证 thesis(只是 future) | △ |
| 4. 机会成本超过完成成本 | 10 天 setup 占 critical path | ✓ |
→ 主要触发的是标准 4(机会成本)。
7.3 决定的合理性
- v27 主体 contribution(5 维度 framing、A1-A4 levers、I1-I3 protocol)已经被 §6.1-§6.4 充分支持
- §6.6 RQ5 是”完整性”加分项,不是”必要条件”
- 投稿可以先不带 RQ5,rebuttal 阶段再补
- 10 天 setup 跟 paper writing 抢 critical path
→ 决定:暂留在 5-node + 4 CN,新 7-node experiment 作为 follow-up。
7.4 §6.1 setup 章节的免责声明模版
### §6.1 Experimental Setup
We evaluate AURA v27 on a CloudLab small-lan profile with 5 ×
c6525-25g (Utah cluster): 1 MN (amd103) + 4 CN (amd118 / amd107 /
amd112 / amd119). All nodes have ConnectX-6 Dx 100 GbE QSFP56
network and run MLNX_OFED 4.9-7.1.0.0 with IOMMU passthrough.
CN scale-out trends (RQ5) on larger clusters are deferred to
future work in a 12-node configuration.
⭐ 教学要点:scale-out RQ 留 future work 不影响 paper 主线——只要 §6.1 setup 明确写”1 MN + 4 CN”就行。reviewer 不会因为缺 12-CN 直接拒。
🌟 结论:v27 团队 5/12 punt 的决定是 punt 标准 4(机会成本)触发的合理判断。这种 punt 留痕在 PROGRESS.md,给未来回看者一个清晰的 “为什么当时这样选” 解释。
✅ 自我检验清单
- 集群 setup:能不查资料默写 5 节点角色 + IP 映射 + 哪 2 个节点历史不稳
- OFED + IOMMU:能默写 IOMMU passthrough 配置步骤 + mlx5_2 校验命令 + 走错 mlx5_0 的代价
- build 一条龙:能给出从 rsync 到 cmake + make -j40 的完整命令 + memcached 启动命令
- 三 smoke 脚本:能默写三脚本名称 + 每个的输出目录结构 + 总耗时估计
- 日志→表格:能用 grep + awk 提取出 KOPS / atomic/txn / SGD 权重
- bootstrap CI:能写出 numpy bootstrap 计算 95% CI 的代码片段
- 故障速查:能对至少 5 个症状给出根因 + 解法(atomic 全 0 / SSH 断 / core dump 撑满 / Clash 劫持 / memcached 绑错)
- 实验前 sanity:能默写 5 条 sanity check 命令
- punt 判断:能解释 5/12 节点 punt 决定由哪条标准触发 + 为什么是合理决定
📚 参考资料
概念入门
- v27 paper outline §6.1 + cumulative commit map —— 复现的 source of truth
- CLAUDE.md “CloudLab 集群配置 (CREST 实验用)” —— 集群配置细节
关键论文
- CREST original paper —— upstream 系统的复现说明
- CloudLab paper (Ricci et al., USENIX Login’14) —— CloudLab experiment 平台使用指南
行业讨论
- 模块二十三《AURA 论文精讲》第9章-评测方法论与端到端复现 —— v25 时期复现脚本
- 模块十五《分离式事务的动态锁所有权》第9章-端到端实战CloudLab与APT复现AURA
框架文档(代码 anchor)
bench/aura/run_v27_step6.sh—— RQ1 5-cell ablationbench/aura/run_v27_a1b_smoke.sh—— RQ3 tuner ablationbench/aura/run_v27_drift_smoke.sh—— RQ2 drift adaptationbench/aura/run_v27_rdma_dispatch_smoke.sh—— RDMA dispatch smoke(第 7 章已分析)config/sanity_old_w4_4cn.json—— 5-node 4-CN 配置PROGRESS.md—— 全程实验 / 修复 / 决策记录
📎 v25 对照视角:模块二十三-AURA 论文精讲 第9章-评测方法论与端到端复现 —— v25 时期复现脚本是 run_v25_*.sh;v27 升级为 run_v27_*.sh 系列 + 加入 5/12 节点 punt 决定的工程留痕