跳到主要内容
自适应运行时物理设计 · MorphoSys → AURA

第5章:MorphoSys 启发的 lever 工程化 —— A2 affinity / A3 split / A4 reservoir

A2 affinity binding(cohort union-find + min_edge=5.0 + max_cluster=3)、A3 cohort split(contention_score = Σ W² / |c| 阈值切分)、A4 future-cost reservoir(256-sample 滑动窗 + predicted_local_ratio)的工程化细节,配合 drift workload 下 migrations 0→21/tick、splits 11→64 的数据 walk-through

Affinity Binding Cohort Split Future-Cost Reservoir MorphoSys Adaptive Levers AURA v27 Drift Workload

第 4 章把 A1(cost-coefficient tuner)讲透了——但 A1 只能调权重,它不会改变 cohort 本身的形状或归属。如果 workload 漂了,cohort 该合该拆、该绑哪个 owner,这些动作来自 A2/A3/A4 这三个 lever:A2 affinity 把多个 cohort 绑到同一 owner CN(用 union-find 做亲和聚类)、A3 split 把过度争用的 cohort 切开(用 contention_score 阈值)、A4 reservoir 用 256-sample 滑动窗预测下一步 workload 形状。三者的命名直接借自 MorphoSys (VLDB’20),但工程化细节是 v27 自家做的——min_edge=5.0、max_cluster=3、contention_score = Σ W²/|c| 这些超参不是凭空选的,都有 drift workload 上的实验依据。本章把三个 lever 的实现 walk-through 一遍,然后用 drift_5sec 上 migrations 0→21/tick、splits 11→64 的真实数据演示它们如何”被工作负载触发”。

📑 目录


1. 三 lever 速览:作用域与触发频率

A2/A3/A4 三个 lever 各自工作在不同 scope、不同频率、不同 actuation 类型:

Lever作用域输入输出触发频率actuate 类型
A2 affinitycohort 之间cohort-cohort 亲和边权”绑到一起”的 cluster每 100 ms直接 actuate
A3 split单个 cohort 内部cohort 内 key 访问频率切成两个 cohort每 100 ms直接 actuate
A4 reservoir全局 workload历史 txn 样本predicted_local_ratio每 5 ms 加样本仅诊断(v27)

几个关键观察

  1. A2 + A3 是”形状改造”levers——它们改变 cohort 表本身(合并 / 切分),影响 OwnerMap 输出
  2. A4 是”未来预测”lever——它给 planner 一个未来 workload 的预期,但 v27 还没接进 planner loop,只做 telemetry
  3. 三者都在 router 进程跑——跟 A1 tuner、planner 在同一个 RouterControlLoop 里

🍎 直觉比喻:A2 = 焊枪(聚合)、A3 = 切刀(拆分)、A4 = 雷达(预测)。A1(第 4 章)是温控旋钮(调权重)。4 个动作配合,构成 v27 的完整 lever 体系。


2. A2 affinity binding:cohort union-find 聚类

2.1 动机

planner 单独看每个 cohort 时,可能”局部最优”——cohort i 放 CN 0、cohort j 放 CN 1。但如果同一笔 txn 经常同时访问 i 和 j(例如 TPC-C 的 NewOrder 同时碰 STOCK 和 ORDER),把它们分到两个 CN 反而引入 cross-CN RPC。

解法:把”经常一起被访问”的 cohort 绑到同一 owner CN。

2.2 算法:union-find + 亲和边权

输入:cohort-cohort 亲和边权矩阵 W[i][j] —— 在过去 N 个 txn 里,cohort i 和 cohort j 同时被访问的次数。

算法:

1. 初始化:每个 cohort 自成一个 cluster
2. 对所有 cohort pair (i, j):
     if W[i][j] >= min_affinity_edge (= 5.0):
         union(i, j)
3. 检查每个 cluster:
     if size(cluster) > max_cluster_cohorts (= 3):
         拆开(保留 3 个亲和度最强的,剩余分出去)
4. 每个 cluster 选一个 owner CN(用 planner 的 Benefit 评分)
5. cluster 内所有 cohort 都用同一 owner CN

2.3 超参解读

超参默认值防什么
min_affinity_edge5.0边权太小不连——防止把”偶尔一起”的 cohort 错绑
max_cluster_cohorts3cluster 不能太大——防止全连成一团变回”单 CN holds everything”(CREST 模式)

为什么是 5.0 和 3?实验测的

  • min_edge = 1.0:把 noise 当亲和,cluster 数太少,dispatch skew 严重(CN0 拿 4× 流量)

  • min_edge = 5.0:保留真实亲和,CN0 拿 ~2.3× 流量

  • min_edge = 10.0:错过有效亲和,跨 CN RPC 没明显改善

  • max_cluster = 2:太碎,把”NewOrder 同时碰 STOCK + ORDER + WAREHOUSE 3 表”的 affinity 拆开

  • max_cluster = 3:刚好覆盖 TPC-C NewOrder 主路径

  • max_cluster = 6:cluster 变大,单 CN 负载失衡

2.4 实现位置

src/transaction/aura/AffinityBinder.cc,依赖 cohort-cohort co-access 矩阵(在 RouterControlLoop 里维护)。

2.5 效果

TPC-C 4-CN 静态 workload:

  • A2 off:CN0/CN1/CN2/CN3 dispatch 比例 = 4 : 1 : 1 : 1(CN0 4× 倾斜)
  • A2 on:比例 = 2.3 : 1.2 : 1 : 0.9(仍倾斜但缩小到 2.3×)

🧠 关键洞察:A2 把”局部最优 cohort 划分”修正成”全局最优 cohort 划分”——单个 cohort 看最优整体上可能是次优。这跟 MorphoSys 的 “workload-aware clustering” 思想一致。


3. A3 cohort split:contention_score 阈值切分

3.1 动机

A2 的反向需求——有时单个 cohort 内部太热,应该切开。

例:cohort c 里有 100 个 key,但其中 1 个 key(warehouse_id=1)占 95% 访问。把整个 cohort 当一个 lock 单位会导致所有 99 个其他 key 也排队等 warehouse_id=1 的锁

解法:把热 key 分离成独立 cohort。

3.2 算法:contention_score 阈值

定义 contention_score:

contention_score(c) = Σ_{k ∈ c} W(k)² / |c|

其中:

  • W(k):key k 的访问权重(最近 N 次 txn 里 k 的访问次数)
  • 平方让”热得离谱”的 key 放大其贡献
  • 除以 cohort 大小防止”大 cohort 天然得分高”

如果 contention_score(c) > contention_split_threshold

  1. 找 score 最大的 key 作为 “hot core”
  2. 把这个 key 提取成新 cohort c’
  3. 余下 99 个 key 留在原 cohort c

3.3 为什么是 Σ W² 而不是 Σ W

Σ W 是均匀访问 cohort 的总访问量——大 cohort 天然得分高。 Σ W² 强调分布的偏度——所有 key 均匀访问时得分低,单 key 集中访问时得分高。

🍎 直觉比喻Σ W² 跟统计学里的 “Gini coefficient” 或 “concentration ratio” 思想类似——衡量”集中度”而不是”总量”。

3.4 实现位置

src/transaction/aura/CohortSplitter.cc,每 100 ms tick 时遍历所有 cohort。

3.5 效果(drift_5sec)

drift workload 60s 内 split 数变化:

phase A (0-5s):  splits ≈ 11 /tick   (基线,TPC-C 自然分布)
phase B (5-10s): splits ≈ 64 /tick   (热区切换,新热 key 触发切分)
phase A (10-15s): splits ≈ 30 /tick (旧 cohort 还没合并回去,过渡期)
...

📊 数据 commit159381aresults/v27_drift_smoke_*/

splits 从 11 → 64 的跳变,是 §6.3 “adaptation visible” 的证据之一。


4. A4 future-cost reservoir:256-sample 滑动窗

4.1 数据结构

reservoir 维护 256 个最近 txn 样本,每个样本记录:

struct TxnSample {
    std::vector<KeyId> read_set;
    std::vector<KeyId> write_set;
    CohortId           cohort_at_dispatch;
    Timestamp          ts;
};

每 5 ms 加一个样本(FIFO,超过 256 后丢最老)。

4.2 关键计算:predicted_local_ratio

planner 想知道:“如果现在切换 OwnerMap,下一波 txn 有多大比例还是 local 命中?”

计算方式:

for each sample in reservoir:
    candidate_owner = OwnerMap_proposed.get(sample.cohort_at_dispatch)
    if all keys in (read_set ∪ write_set) belong to candidate_owner:
        local_count += 1
predicted_local_ratio = local_count / 256

predicted_local_ratio 越高 → 当前 OwnerMap 提案越优 → planner 更愿意切换。

4.3 物理意义

A4 给 planner 一个”未来 workload 的镜像”——基于过去 256 笔 txn 推断下一步。

跟 A3 split 的对比:A3 看当前 cohort 的内部争用,A4 看整体 workload 的稳定性。两者维度不同。

4.4 v27 的诚实分级:A4 只做 diagnostic

v27 paper §3.7 明确说:

Used for diagnostic in this paper; planner-loop integration is future work.

为什么不接进 planner loop?两个原因:

  1. 接进 loop 需要修改 Benefit 函数——加 predicted_local_ratio 作为第 5 项,但这会破坏 4 项的简洁性
  2. 没有足够实验证明 A4 不引入震荡——256-sample 窗的 lag 跟 planner tick 100 ms 不对齐,可能反复触发不必要的迁移

→ v27 决定 A4 只做 telemetry。诚实分级再次出现。

4.5 实现位置

benchmark/Client/access/TxnAccessReservoir.cc,~300 LOC。

教学重点:A4 是故意只做 diagnostic 不做 actuator 的——这是 v27 的诚实化决定,跟”5 维度分级”一脉相承。

🌟 结论:A4 的存在价值是 §6.3 drift workload 的**“adaptation visible”证据来源**——predicted_local_ratio 在 drift_5sec 下从 0.10 振荡到 0.22,证明 planner 真的看到了 workload 变化。


5. Drift workload walk-through:三 lever 怎么协同

用 drift_5sec 60s 真实数据,按时间顺序讲一遍三 lever 协同。

5.1 数据 + 时序

实验:drift_period_ms = 5000,每 5s 切换 district_id bias。

t = 0s:    phase A 开始,hot 是 district [0, 5)
           A4: predicted_local_ratio = 0.22
           A2: cluster {c0, c1, c2} → CN0; {c3, c4} → CN1
           A3: splits ≈ 11/tick (baseline)
           A1: weights {atomic 0.5, rpc 1.0, move 2.5, load 0.18}

t = 5.0s:  phase 切换,hot 改为 district [5, 10)
t = 5.1s:  A4 注意到 sample 里新热 key 占比突增
           predicted_local_ratio: 0.22 → 0.10 (剧降)
t = 5.2s:  planner 100ms tick 触发
           Benefit 重新评估,旧 OwnerMap 评分降
           migrations: 0 → 21/tick (cohort owner 大规模迁移)
t = 5.5s:  A3 检测到新热区争用
           splits: 11 → 64/tick
t = 6.0s:  A2 重新聚类
           新 cluster {c0, c5} → CN1; {c3, c8} → CN2 (反映新热区分布)
t = 6.5s:  A1 SGD 看到 rpc cost 升 (cross-CN 增加)
           weights {atomic 0.5, rpc 1.2, move 2.5, load 0.18}
t = 10.0s: phase A 回切
           整个过程重新走一遍 (反向)

📊 数据 commit159381a (drift 3-rep + Drift::Stop 修复)

5.2 4 个 lever 各自的角色

🍎 直觉比喻:phase 切换像突然下雨——

  • A4 (雷达) —— 第一个发现 “天气变了”(reservoir 看到样本变化)
  • A3 (切刀) —— 把新热区切出来,单独处理(cohort split)
  • A2 (焊枪) —— 把新热 cohort 跟相关 cohort 一起绑新 owner(affinity binding)
  • A1 (温控旋钮) —— 调权重,让 Benefit 评分跟上新分布(cost coefficient tuner)

四个动作有先后顺序——A4 给信号 → A3/A2 改 cohort 形状 → A1 调权重。

5.3 这个 walk-through 是 paper §6.3 的核心叙事

§6.3 想说:“adaptive 的 levers 在 drift 下真的在动,不是摆设。”

证据:

  • migrations 从 0 → 21/tick ——A2 + planner 协同
  • splits 从 11 → 64/tick ——A3 触发
  • predicted_local_ratio 从 0.22 → 0.10 oscillation ——A4 跟踪
  • SGD weights 跟着 phase 跳变(第 4 章 §6 已展示)

四条证据互相印证,单条任何 reviewer 攻击都还有另外三条——这是 robust evidence 的特征。

🌟 结论:drift walk-through 是 v27 §6.3 的 headline 叙事,比静态 5-cell ablation 更有说服力。


6. MorphoSys 起源与本地化改造

6.1 MorphoSys (VLDB’20) 简介

MorphoSys 是 adaptive physical design 的现代代表作。它的核心 lever 体系:

MorphoSys lever操作对象触发依据
L1row layout transformcolumn access pattern
L2column store reorganizationworkload cluster
L3index migrationhot index identification
L4future workload predictorsliding window

6.2 AURA v27 借用的方法论

v27 的 A1/A2/A3/A4 跟 MorphoSys 的 L1-L4 不是 1:1 对应——是方法论迁移

AURA leverMorphoSys 启发点操作对象(v27 自家)
A1.b SGD tunerMorphoSys cost model learning4 个 cost coefficient
A2 affinity bindingMorphoSys workload cluster (L2)cohort 聚类
A3 cohort splitMorphoSys reorganization triggercohort 切分
A4 reservoirMorphoSys future workload predictor (L4)predicted_local_ratio

借的不是代码,是格式约定——cost model 是 first-class learning target、加 lever 时要有 trigger metric、reservoir 维度跟 planner tick 解耦等。

6.3 本地化改造:actuation surface 完全不同

MorphoSys 操作的是 storage object(row / column / index);AURA 操作的是 control plane object(cohort / owner / lock authority)。

维度MorphoSysAURA v27
actuation surfacestorage layouttransaction control
触发频率分钟级(heavy 操作)100 ms(light 操作)
一致性挑战offline rebuildonline migration(I1/I2/I3)
系统类型OLAP / mixedpure OLTP

→ MorphoSys 在 batch 系统里 reorganize,AURA 在 OLTP 在线 reorganize——后者必须证明 I1-I3 不变式(见第 6 章)。

🧠 关键洞察:AURA 用了 MorphoSys 的方法论格式完全没用它的算法——A2 是 union-find(不是 MorphoSys 的 spectral cluster)、A3 是 Σ W² 阈值(不是 MorphoSys 的 column dependency)、A4 是简单 reservoir(不是 MorphoSys 的 LSTM predictor)。方法论可借,算法必须本地化

MEMOIRABLE QUOTE“AURA 借了 MorphoSys 的写作格式,但把它的算法全部换掉——因为 actuation surface 完全不同。“


7. 章末小结:A2/A3/A4 与 A1 的协作分工

7.1 4 个 lever 的分工表

Lever角色调什么类比
A1权重调节cost coefficient 4 个值温控旋钮
A2聚合cohort 之间绑 owner焊枪
A3拆分单 cohort 切两个切刀
A4预测predicted_local_ratio雷达

7.2 协同方式

                     ┌───────────────┐
                     │  Workload     │
                     │  (drift txn)  │
                     └───────┬───────┘


                     ┌───────────────┐
                     │  A4 reservoir │  (5 ms 加 sample)
                     │  predicted_local_ratio
                     └───────┬───────┘
                             │  diagnostic only

                ┌─────────────────────────┐
                │  Planner 100 ms tick    │
                └────────┬────────────────┘

            ┌────────────┼────────────┐
            ▼            ▼            ▼
     ┌────────┐   ┌────────┐   ┌────────┐
     │ A2     │   │ A3     │   │ A1     │
     │ affin  │   │ split  │   │ tuner  │
     │ -ity   │   │        │   │        │
     └────┬───┘   └────┬───┘   └────┬───┘
          │            │            │
          ▼            ▼            ▼
      OwnerMap update + Benefit re-score

7.3 当前 v27 状态

  • A1/A2/A3 直接进 planner loop——OwnerMap 更新会真实生效
  • A4 只做 diagnostic——telemetry / paper §6.3 证据来源
  • 4 个 lever 一起在 5-cell ablation 里”组合不是相加”(第 4 章 §7)—— paper §6.2 的诚实结论

🌟 结论:A2/A3/A4 是 v27 在 v25/v26 之上的结构性新增——v25 只有 access graph + cohort merge,v27 把 lever 显式化为 A2/A3/A4 + 加上 A1 在线 tuner,整体方法论格式 align 到 MorphoSys。


✅ 自我检验清单

  • 三 lever 角色:能默写 A2/A3/A4 的全名 + 一句话作用 + 触发频率
  • A2 超参:能解释 min_affinity_edge=5.0max_cluster_cohorts=3 各自防什么 + 为什么是这两个具体数字(基于实验)
  • A3 score:能写出 contention_score = Σ W² / |c| 并解释每一项 + 为什么是 W² 而不是 W
  • A4 reservoir:能解释 256-sample 滑动窗 + predicted_local_ratio 的物理意义
  • 诊断 vs actuate:能解释为什么 v27 把 A4 写成 diagnostic 而不接进 planner loop(2 条理由)
  • drift walk-through:能按时间顺序讲 drift_5sec phase 切换时 4 个 lever 的协同动作(5-6 个时间点)
  • MorphoSys 对照:能说出 AURA 借用 MorphoSys 的方法论格式但完全不用其算法,并解释 actuation surface 的本质区别
  • 4 lever 协同:能画 lever 协作流程图(A4 → planner → A1/A2/A3 → OwnerMap)

📚 参考资料

概念入门

  • v27 paper outline §3.5 + §3.6 + §3.7 —— 三 lever 的 source of truth
  • v27 paper outline §6.3 —— drift workload 数据

关键论文

  • MorphoSys (VLDB’20) —— 本章 lever 命名 + 方法论起源
  • Adaptive Indexing (Idreos, CIDR’07) —— online reorganization 的早期工作
  • Bao (SIGMOD’21) —— learned cost model 在 query optimizer 的应用
  • Spectral Clustering for Workload Analysis —— A2 union-find 的对照基线

行业讨论

框架文档(代码 anchor)

  • src/transaction/aura/AffinityBinder.cc —— A2 union-find 实现
  • src/transaction/aura/CohortSplitter.cc —— A3 切分实现
  • benchmark/Client/access/TxnAccessReservoir.cc —— A4 滑动窗实现(~300 LOC)
  • bench/aura/run_v27_drift_smoke.sh —— drift workload harness
  • results/v27_drift_smoke_*/ —— migrations + splits 时序数据

📎 v25 对照视角:模块二十三-AURA 论文精讲 第5章-访问图与cohort学习(v25 时期 cohort 是 access graph 学出来的,没有 A2/A3 这种 explicit lever;v27 把 lever 显式化 + 加 A4 reservoir)