一、简介:为什么 AI 实时推理需要“缓存分区”?
背景:工业视觉、自动驾驶、语音识别等场景,需要< 1 ms 级 AI 推理延迟。
痛点:Linux 默认L3 Cache 共享,Batch 任务(视频编码、数据预处理)随机抢占缓存 → 实时任务cache-miss↑ → 抖动 100~500 μs,模型推理超时。
Intel RDT(Resource Director Technology)提供硬件级隔离:
CAT (Cache Allocation Technology):按 Way 切分 L3 Cache
MBA (Memory Bandwidth Allocation):按百分比限制内存带宽
收益:同 CPU 上混跑 AI 推理 + 预处理,抖动下降 80%,无需额外硬件成本。
二、核心概念:4 张图看懂 RDT
| 术语 | 一句话 | 本文接口 |
|---|---|---|
| Resctrl 文件系统 | Linux 内核暴露 RDT 配置的前端 | /sys/fs/resctrl |
| CLOS (Class of Service) | 资源配额单元,0~N 编号,任务echo PID > tasks即绑定 | schemata文件 |
| Cache Way | L3 物理切片,常见 11-way、16-way | L3:0=ff;1=f0前 8 way 给 CLOS0 |
| MBA % | 内存带宽百分比,10% 步进 | MBA:0=50;1=30 |
口诀:一个 CLOS = 一份硬件资源包,任务绑定即享受配额。
三、环境准备:10 分钟搭好“缓存实验室”
1. 硬件
Intel Xeon / Core ≥ Skylake(
cat /proc/cpuinfo | grep rdt出现rdt_a代表支持)建议≥6 核,方便分 2 组:AI 实时核 + 批处理核
2. 软件
| 组件 | 版本 | 安装 |
|---|---|---|
| Ubuntu Server | 22.04 | 默认内核 ≥5.15 已内置 RDT |
| 实时内核 | 5.15.x-rt | 可选,上一篇有脚本 |
| 工具 | resctrl-utils | sudo apt install resctrl-utils |
3. 一键检查支持能力(可复制)
#!/bin/bash # check_rdt.sh set -e grep -q rdt_a /proc/cpuinfo && echo "✔ RDT(CAT+MBA) supported" || exit 1 [[ -d /sys/fs/resctrl ]] && echo "✔ resctrl mounted" || sudo mount -t resctrl resctrl /sys/fs/resctrl cat /sys/fs/resctrl/info/L3/cbm_mask # 例如 0000ffff = 16 way cat /sys/fs/resctrl/info/L3/MBA/min_bandwidth # 例如 10 (%)返回示例:
0000ffff ← 16 way 可用 10 ← 最小粒度 10%四、应用场景(≈300 字)
场景:工业 AI 视觉质检机
6 核 CPU 同节点部署:
核 0-1:实时相机触发 + YOLOv5-nano 推理(周期 4 ms,deadline 1 ms)
核 2-5:图像预处理、JPEG 编码、HTTP 上传(批量任务,可接受 10 ms+ 延迟)
问题:预处理线程随机冲刷 L3,导致推理任务 cache-miss 从 2% → 15%,尾部延迟 1.2 ms → 超时误检。
解决方案:
通过 resctrl 创建 CLOS0(AI 组):L3 Way=前 8 way(50%),MBA=40%
创建 CLOS1(Batch 组):L3 Way=后 8 way(50%),MBA=60%
将推理进程绑核 0-1 并写入 CLOS0/tasks;预处理绑核 2-5 并写入 CLOS1/tasks
结果:推理 cache-miss 降回 2%,尾部延迟 0.35 ms,抖动 < 30 μs,质检节拍提升 8%,无需额外硬件成本,即满足产线 4 ms 硬实时需求。
五、实际案例与步骤:30 分钟实战
实验目录:~/rdt-lab,所有脚本可直跑。
mkdir -p ~/rdt-lab && cd ~/rdt-lab5.1 创建 CLOS 并分配资源
#!/bin/bash # setup_clos.sh RESCTRL=/sys/fs/resctrl # 清除默认组(可选) echo $$ > $RESCTRL/tasks # 把当前 shell 放回根组 rmdir $RESCTRL/CLOS[0-9]* 2>/dev/null # CLOS0:AI 实时 → 8 way + 40% 内存带宽 mkdir -p $RESCTRL/CLOS0 echo "L3:0=00ff" > $RESCTRL/CLOS0/schemata # 低 8 way echo "MBA:0=40" > $RESCTRL/CLOS0/schemata # CLOS1:Batch → 后 8 way + 60% 带宽 mkdir -p $RESCTRL/CLOS1 echo "L3:0=ff00" > $RESCTRL/CLOS1/schemata # 高 8 way echo "MBA:0=60" > $RESCTRL/CLOS1/schemata5.2 任务绑定脚本(可嵌入 systemd)
#!/bin/bash # bind_ai.sh PID 为推理进程号 echo $1 > /sys/fs/resctrl/CLOS0/tasks taskset -cp 0,1 $1 # 同时绑核#!/bin/bash # bind_batch.sh echo $1 > /sys/fs/resctrl/CLOS1/tasks taskset -cp 2-5 $15.3 实时验证:cyclictest 对比
# 终端 1:AI 组 sudo taskset -c 0 cyclictest -p95 -m -Sp90 -i200 -d60s > ai.log & sudo ./bind_ai.sh $! # 终端 2:Batch 干扰 sudo taskset -c 2-5 stress-ng --cpu 4 --timeout 60s & # 终端 3:Batch 组 cyclictest sudo taskset -c 3 cyclictest -p50 -m -Sp45 -i200 -d60s > batch.log & sudo ./bind_batch.sh $!5.4 结果解读(实测示例)
| 分组 | Max Latency | L3 Miss | MBA % |
|---|---|---|---|
| AI (CLOS0) | 28 μs | 2.1% | 40 |
| Batch (CLOS1) | 5800 μs | 18% | 60 |
| 无 RDT (baseline) | 155 μs | 14% | – |
结论:AI 尾部延迟下降82%,cache-miss 回到理想水平。
5.5 一键清理(恢复默认)
#!/bin/bash # cleanup.sh echo $$ > /sys/fs/resctrl/tasks rmdir /sys/fs/resctrl/CLOS[0-9]* 2>/dev/null echo "已恢复共享模式"六、常见问题与解答(FAQ)
| 问题 | 现象 | 解决 |
|---|---|---|
/sys/fs/resctrl不存在 | 内核未开启 CONFIG_RESCTRL | 换内核或modprobe intel_rdt |
| schemata 写入报 Invalid argument | way 掩码超界 | cat info/L3/cbm_mask确认有效位 |
| MBA 写入无效 | 仅整数 + 10 的倍数 | 按最小粒度取整,如 40→ok,35→失败 |
| 任务写入后 latency 无改善 | 未同时绑核 | taskset与echo PID > tasks双操作 |
| AMD CPU 是否可用 | 无 CAT,仅有 QoS 带宽 | 本文方法仅限 Intel |
七、实践建议与最佳实践
CLOS 数量 ≤ 4
过多导致 way 切片太细,反而降低命中率。AI 任务固定大页 + 锁内存
echo 1024 > /proc/sys/vm/nr_hugepages sudo -rt taskset ...与 RDT 组合,延迟更稳定。
systemd 集成
在.service文件加:[Service] ExecStartPost=/usr/local/bin/bind_ai.sh $MAINPID CPUAffinity=0,1监控落地 Prometheus
node-exporter 已导出resctrl_occupancy_bytes,Grafana 画热力图,提前发现 way 冲满。热升级策略
修改 schemata 立即生效,无需重启;但降低 way 数时需确认 occupancy < 新限额。容器场景
Kubernetes 可用
resource-management-policy+rdt-config-operator自动注入 CLOS。Docker:
docker run --cpuset-cpus 0-1 --security-opt apparmor=unconfined后手动写 tasks。
八、总结:一张脑图带走全部要点
Intel RDT (Resctrl) ├─ CAT:L3 way 分区 → 减少 cache-miss ├─ MBA:内存带宽 % → 抑制 noisy neighbor ├─ 工具:resctrl fs + cyclictest + stress-ng ├─ 实战:CLOS0=AI实时,CLOS1=批量任务 └─ 效果:尾部延迟↓82%,零硬件成本实时 Linux + AI 场景下,缓存即性能。
掌握 Resctrl,你便拥有“硬件级 QoS”利器——同 CPU 混跑也不再抖动,让推理任务始终稳稳地 < 1 ms。
立刻复制脚本到实验机,跑一遍 cyclictest,亲眼见证 latency 从百微秒级降到十微秒级——真正的“缓存分区”魔法,现在开始!