一、简介:为什么 AI 开发者也要关心内核延迟?

  • AI 推理落地=算法+算力+系统

    • 1 ms 的调度抖动,就可能让 8 ms 的推理 SLA 直接超标。

    • 上下文切换、锁竞争、NUMA 远程内存,都会让 GPU 空等 CPU。

  • 传统 top/htop 只能看“结果”,看不到“过程”:

    • 线程为何被抢?被谁抢?阻塞在哪个函数?

  • LTTng(Linux Trace Toolkit Next Generation) = 内核事件 + 用户空间事件 一站式抓取,< 100 ns 时间戳精度,图形化定位热点。

掌握 LTTng,让 AI 系统优化从“盲猜”变成“看图说话”


二、核心概念:5 个关键词先搞懂

关键词 一句话 本文出现形式
tracepoint 内核静态埋点,开销极低 sched_switchirq_handler_entry
context switch CPU 从一个线程跳到另一个线程 LTTng 可视化折线
blocking call 线程因锁/IO 主动让出 CPU 在 trace 中显示为“sleep”状态
channel LTTng 内存缓冲区,每 CPU 一个 lttng create my-ai --live
Trace Compass Eclipse 可视化工具,打开 CTF 格式 拖文件即出甘特图

三、环境准备:10 分钟搭好“追踪工作台”

1. 硬件

  • x86_64 多核(≥4 核),Intel/AMD 均可

  • 预留 4 GB 磁盘空间(1 分钟 trace ≈ 200 MB)

2. 软件

组件 版本 一键安装命令
Ubuntu 22.04 LTS sudo apt update
实时内核 5.15.x-rt 可选,非必须
LTTng-modules 2.13.8 官方 PPA
Trace Compass 2023-12 解压即用

3. 一键脚本(可复制)

#!/bin/bash
# install_lttng.sh
set -e
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:lttng/stable-2.13
sudo apt update
sudo apt install -y lttng-tools lttng-modules-dkms liblttng-ust-dev
# 可视化
wget https://www.eclipse.org/downloads/download.php?file=/tracecompass/releases/2023-12/trace-compass-2023-12-linux-gtk-x86_64.tar.gz -O tc.tar.gz
tar -xf tc.tar.gz && mv trace-compass ~/tools/
echo "安装完成,请重启到 RT 内核(如已安装)"

重启后验证:

sudo lttng list
# 应输出 Available kernel events...

四、应用场景(300 字):AI 推理引擎的 1 ms 抖动排查

某边缘计算盒子运行 YOLOv5 推理引擎,batch=1,要求端到端 ≤ 10 ms。
压测时发现 P99 延迟 11.2 ms,GPU 日志显示“kernel launch 仅 6 ms”,怀疑 CPU 侧卡顿。
使用本文方法:

  1. 启动 LTTng 抓取 30 s trace;

  2. Trace Compass 加载,筛选“推理线程 TID=1234”;

  3. 甘特图显示每 100 ms 出现一次 0.9 ms 阻塞,状态为 TASK_INTERRUPTIBLE,回溯 sched_switch 事件,发现线程被 kworker/flush 抢占,等待 mutex_lock 保护的 ext4_journal_start

  4. 结论:日志文件系统 journal 造成延迟;

  5. 解决:把模型权重移到 tmpfs,journal 改为 writeback,P99 降至 8.1 ms,一次过标。


五、实际案例与步骤:从抓 trace 到看图说话

实验目录统一:~/lttng-ai,全部脚本可直接复制运行。

5.1 创建会话 & 启用内核事件

mkdir -p ~/lttng-ai && cd ~/lttng-ai
# 创建会话,每 CPU 4 MB 缓冲区
sudo lttng create ai-infer --output=./traces
sudo lttng enable-event -k sched_switch,sched_wakeup,irq_handler_entry,irq_handler_exit
# 可选:用户空间事件(UST)
sudo lttng enable-event -u -a

5.2 启动 AI 推理负载(模拟)

/* infer_dummy.c */
#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>

static void *infer(void *arg) {
    struct timespec ts = {0, 1000000}; /* 1 ms */
    while (1) {
        nanosleep(&ts, NULL);          /* 模拟推理计算 */
    }
    return NULL;
}

int main() {
    pthread_t tid;
    pthread_create(&tid, NULL, infer, NULL);
    pthread_join(tid, NULL);
    return 0;
}
gcc infer_dummy.c -o infer_dummy -pthread

5.3 开始追踪

sudo lttng start
./infer_dummy &                # 后台跑负载
sleep 10
sudo lttng stop
sudo lttng destroy             # 关闭会话,文件已落盘

5.4 可视化分析

# 启动 Trace Compass(GUI)
~/tools/trace-compass/trace-compass &

步骤:

  1. File → Open Trace → 选 ~/lttng-ai/traces

  2. 双击 KernelOverview

  3. 打开 Histogram 窗口,选 Thread Status

    • 绿色 = Running,红色 = Blocked

  4. 选中推理线程 → 放大时间轴 → 查看红色段

  5. 双击红色 → 自动跳转到 sched_switch 事件

    • 可看到“prev_state=1 (TASK_INTERRUPTIBLE)”

    • 下一行显示被 kworker/1:1 抢占

5.5 导出延迟统计(CLI 一键)

# 用 babeltrace 转文本,再 awk 统计
babeltrace traces/ | \
awk -F'[ :]' '/sched_switch.*prev_comm==infer.*prev_state==1/ \
{print $2}' | \
awk '{delta=$1-prev; prev=$1; if(delta>0) print delta*1000}' | \
sort -n | tail -1

输出:

0.917 ms ← 最大阻塞


六、常见问题与解答(FAQ)

问题 现象 解决
lttng create 报“Permission denied” 未加 sudo 全程用 sudo 或在 tracing 组
Trace Compass 打不开 trace 版本不兼容 确保 LTTng 2.13 + TC 2023-12 以上
看不到用户空间事件 无 UST 支持 编译时加 -llttng-ust 并 #include <lttng/tracepoint.h>
缓冲区溢出丢事件 “Lost 123 events” 增大缓冲区:lttng create --num-subbuf=8 --subbuf-size=4M
实时内核无法加载 lttng-modules 符号不匹配 用 DKMS 重新编译:sudo dkms autoinstall

七、实践建议与最佳实践

  1. 生产环境长期追踪
    使用 lttng-relayd 把 trace 实时送到远端 NAS,避免本地磁盘打满。

  2. 自动化脚本
    把 5.1-5.3 封装成 record_trace.sh,CI 里每晚跑 30 s,第二天邮件推送最大延迟图表。

  3. 与 ftrace 互补
    快速验证用 echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable 更轻量;深度分析再切 LTTng。

  4. 添加自定义 UST 事件
    在推理前后插入 tracepoint(infer, start)tracepoint(infer, end),可直接测量“纯算法”耗时,去掉调度噪声。

  5. 权限最小化
    给 CI 节点加 tracing 组,避免全 root;setcap cap_sys_admin+ep 单独授权。


八、总结:一张脑图带走全部要点

LTTng 追踪 AI 线程
├─ 环境:LTTng 2.13 + Trace Compass
├─ 步骤:create → enable → start → 负载 → stop → 可视化
├─ 关键:sched_switch 找红色阻塞段
├─ 统计:babeltrace + awk 输出 P99/Max
└─ 落地:CI 每晚自动化,邮件推送延迟图

实时 AI 不是“算法独角戏”,而是“软硬协同交响”。
当你能用 LTTng 把 0.9 ms 的抖动精准定位到 ext4_journal_start,优化就再也不是“玄学”。
立刻打开实验机,跑一遍本文脚本,生成你的第一张“线程甘特图”——让每一次上下文切换,都在你的掌控之中!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐