论文:Idleness is Relative: Exploiting Tool-Call Idle Windows for Offloading in Agentic Systems with MORI 作者:Tian Xia, Hanchen Li, Zhifei Li, Xiaokun Chen, Hao Kang, Yifan Qiao, Yi Xu, Ion Stoica(UC Berkeley 等) 发表:arXiv 2026
TL;DR
问题:LLM serving 系统处理 agentic 工作负载时,KV cache 总量轻易超过 GPU HBM 容量,需要 offload 到 CPU DRAM。但 tool-call 持续时间差异巨大(毫秒到分钟),每次调用都重新放置 KV cache 不切实际。
方案:MORI 提出"idleness 是相对的连续光谱"——按 idleness 排序所有活跃程序,最忙的放 GPU,最闲的放 CPU,动态调整分区边界。
贡献:在 Claude Code 真实编码代理工作负载上,MORI 相比最佳 baseline 实现 20-71% 吞吐量提升 和 18-43% TTFT 降低。
核心洞察
1. Agentic 程序呈现两阶段结构
Agentic 程序在 System Prompt 和 User Input 之后,交替出现:
- 推理 token(Reasoning Tokens)
- 工具调用结果(Tool Call Results)
这种 推理 → 工具调用 → 推理 → 工具调用 的循环模式意味着 KV cache 需要在多个推理步骤间保持可用。

2. Tool-call 持续时间差异巨大
Tool-call 可以短至毫秒级(如简单计算),也可以长至分钟级(如等待用户反馈、文件 I/O)。这导致:
- 无法用固定的 timer 触发 offloading
- 短的 idle 窗口不值得转移 KV cache
- 长的 idle 窗口可以充分利用
3. Idleness 是连续的相对光谱
传统方法的问题:
| 方法 | 问题 |
|---|---|
| LRU | 只考虑访问时间,无法区分 busy/idle phases |
| 二元 busy/idle 标签 | 不考虑程度——一个"稍微 idle"的程序和"完全 idle"的程序被同等对待 |
MORI 的核心洞察:idleness 是相对的。一个程序是否"idle"取决于它与其他活跃程序的相对比较,而非绝对阈值。
核心方法
Idleness 指标
MORI 定义程序的 idleness 为:
其中 是程序处于等待 tool-call 完成的累计时间, 是总时间。
三层队列架构
MORI 将程序按 idleness 分配到三个层级:

| 层级 | 存储位置 | 特征 | 淘汰策略 |
|---|---|---|---|
| GPU Queue | GPU HBM | 最忙的程序 | Promote 最忙的 |
| CPU Queue | CPU DRAM | 较闲的程序 | Demote 最闲的 |
| Swap | Disk/NVM | 极度空闲的程序 | 淘汰到磁盘 |
动态分区边界
MORI 动态调整 GPU/CPU 分区容量以匹配硬件容量比:
if GPU_pressure > CPU_pressure:
# GPU 紧张,缩小 GPU 分区
demote_top_k(k = f(GPU_pressure))
else:
# CPU 紧张,缩小 CPU 分区
promote_top_k(k = f(CPU_pressure))
准入控制
每层实施 admission control:
- GPU 层容量 = GPU HBM / 平均 KV cache size
- CPU 层容量 = CPU DRAM / 平均 KV cache size
- 超过容量的程序被 swap out
实验分析
实验设置
- 工作负载:Claude Code 真实编码代理任务
- GPU:H200 (80GB)、B200
- 模型:Qwen-2.5 7B、Qwen-3 30B-A3B、Llama-3.1 70B
- Baseline:
- SMG(SOTA 通用方法)
- TA(Token Attention)
- TA+O(TA + Offloading)
性能对比
H200 + Qwen-2.5 7B (DP=1)

| 指标 | MORI vs SMG | MORI vs TA+O |
|---|---|---|
| Throughput | +71% | +20% |
| TTFT | -43% | -18% |
H200 + Qwen-3 30B-A3B (DP=3)

在高并发(80 用户)场景下,MORI 的优势更加明显。
消融实验
MORI 的性能提升来自三个核心设计:
- 连续 idleness 排序:避免二元标签的粗粒度
- 动态分区边界:适应不同 GPU:CPU 容量比
- 分层队列架构:减少 promote/demote 开销
深度理解问答
Q1: 为什么 LRU 在 agentic 场景下效果差?
Agentic 程序有明显的 phase 特征——一个程序可能在一个阶段非常活跃(连续推理),在另一个阶段完全空闲(等待工具返回)。LRU 只考虑"最近访问",不考虑"当前是否在 busy phase"。一个刚被访问但正在等待 tool-call 的程序,应该被优先 demote 到 CPU,而不是留在 GPU。
Q2: 二元 busy/idle 标签为什么不充分?
假设系统有 5 个程序:3 个稍微 busy(idleness=0.2),2 个完全 idle(idleness=1.0)。如果 GPU 只能放 4 个程序,二元标签会把 3 个 busy 程序都放 GPU,但实际上可以放 2 个最忙的(idleness=0.2 的)和 2 个次忙的。把完全 idle 的程序 demote 到 CPU,GPU 上腾出的空间可以服务更多正在工作的程序。
Q3: MORI 的调度开销如何?
MORI 的调度开销主要来自:
- Idleness 计算:基于采样,需要周期性更新
- 队列维护:需要 O(N log N) 的排序开销
- 数据迁移:KV cache 在 GPU/CPU 间的拷贝
论文未给出具体数值,但作者强调调度决策的频率远低于 tool-call 的频率,因此 amortized 开销可接受。
Q4: MORI 能扩展到更多 offloading 层吗?
论文 Discussion 部分提到,理论上可以扩展到 GPU → CPU → NVMe → Disk 的四级架构,但需要考虑:
- 每增加一层,数据迁移延迟增加
- 分区边界调整的搜索空间增大
- 需要更精细的 idleness 预测模型
当前 MORI 只在 GPU+CPU 两层上验证。
Q5: MORI 对非 agentic 工作负载有效吗?
论文主要针对 agentic 工作负载(多轮推理+工具调用)。对于纯推理负载(无工具调用),MORI 的 idleness 指标会退化为请求间隔,无法发挥优势。但 MORI 的分层架构本身仍然有效,只是 idleness 的来源不同。
总结
核心贡献
- 问题发现:揭示了 agentic 工作负载的两阶段结构和 tool-call 持续时间的巨大差异
- 核心洞察:"idleness 是相对的连续光谱"这一新视角
- 系统实现:MORI——动态分层队列 + 相对 idleness 排序 + 自适应分区边界
局限性
- 只在 GPU+CPU 两层验证,多层 offloading 需要进一步研究
- Idleness 指标基于历史采样,对突发 workload 可能响应不及时
- 调度开销未在论文中量化分析
适用场景
| 场景 | 适用性 |
|---|---|
| ✅ Agentic AI serving | 强烈推荐 |
| ✅ 多租户 LLM 服务 | 推荐 |
| ✅ 纯推理服务 | 不适用(MORI 优势不明显) |
| ❌ 单用户、低并发场景 | 不需要(直接放 GPU 即可) |
实践注记:MORI 的思想可以迁移到其他资源调度场景——当资源竞争时,不仅考虑"最近使用",还要考虑"当前是否真正需要"。