DAX#

一个 L2 适配器,映射设备 DAX 路径,例如 /dev/daxX.X/dev/daxY.Y,并在固定大小的槽中存储 KV Cache 对象。该适配器旨在用于字节可寻址内存设备,例如持久内存或 CXL 内存。

在此版本中,MP dax 适配器是易失性的。它将键索引保存在服务器内存中,并在重启时重建一个空索引。旧字节可能仍保留在 DAX 设备上,但在 LMCache 服务器重启后无法访问。

旧版单设备形式的必填字段:

  • device_path: 可映射的 DAX 设备或测试文件的路径。

  • max_dax_size_gb: 从 device_path 映射的 GiB 数量。

  • slot_bytes: 固定槽大小(以字节为单位)。该值必须足够大,能够容纳一个完整的 LMCache 块,因为 MP 内存描述符不公开非 MP 模式下完整块的大小。

多设备形式的必填字段:

  • devices:包含 device_pathmax_dax_size_gb 的对象列表。只有在 hotplug_enabledtrue 时,列表可以为空。

  • slot_bytes: 适配器门面中所有 DAX 设备共用的固定槽大小(以字节为单位)。

可选字段:

  • hotplug_enabled (bool, 默认 false): 启用运行时 /reconfigure/dax/status/reconfigure/dax/add/reconfigure/dax/remove/reconfigure/dax/resize

  • num_store_workers (int, default 1): 存储工作线程数量。

  • num_lookup_workers (int, default 1): 查找工作线程数量。

  • num_load_workers (int, default min(4, os.cpu_count())): 加载工作线程数量。

  • persist_enabled (bool): 通用 L2 配置解析会接受该字段,但对 dax 无效,因为重启恢复功能尚未实现。

配置示例:

# Backward-compatible single-device form.
--l2-adapter '{
  "type": "dax",
  "device_path": "/dev/dax1.0",
  "max_dax_size_gb": 100,
  "slot_bytes": 268435456,
  "num_store_workers": 1,
  "num_lookup_workers": 1,
  "num_load_workers": 4,
  "eviction": {
    "eviction_policy": "LRU",
    "trigger_watermark": 0.9,
    "eviction_ratio": 0.1
  }
}'
# Multi-device hotplug-ready form.
--l2-adapter '{
  "type": "dax",
  "devices": [
    {"device_path": "/dev/daxX.X", "max_dax_size_gb": 100},
    {"device_path": "/dev/daxY.Y", "max_dax_size_gb": 100}
  ],
  "slot_bytes": 268435456,
  "hotplug_enabled": true,
  "num_store_workers": 1,
  "num_lookup_workers": 1,
  "num_load_workers": 4
}'

运行时管理使用 JSON 请求体,因为 DAX 路径包含斜杠。完整示例请参阅 Device-DAX 后端指南。这些路由使用 StorageManager 的通用 L2 适配器重新配置 API:HTTP 路径用于选择后端和操作,DAX 适配器负责解析操作负载,未来的适配器(如 P2P)也可复用同一接口。

curl http://127.0.0.1:9000/reconfigure/dax/status
curl -X POST http://127.0.0.1:9000/reconfigure/dax/add \
  -H 'Content-Type: application/json' \
  -d '{"device_path": "/dev/daxX.X", "size": "100GiB"}'

当前限制:

  • 运行时热插拔仅更改 LMCache 映射和元数据。它不会创建、销毁或重新配置内核 CXL 或 DAX 设备。

  • 每个 TP 的分区和设备重启元数据尚未实现。

  • 仅支持单缓冲区对象。多张量对象被拒绝。

  • 容量以槽为单位计算,而非以负载字节计算。L2 逐出和使用量指标均基于已占用的槽数。

  • 查找操作会持有 DAX 侧的外部锁。submit_unlock 在加载/检索完成后释放这些锁,使对应条目重新可被逐出。

  • mode="evict" 执行移除操作会破坏 DAX 层中的数据。以 mode="migrate" 执行移除操作则要求另一个活跃 DAX 设备具有足够的剩余容量。