CPU QOS

明白,我将根据你的要求生成最终完整表格版文档,特点如下:

  • A 场景(不用 eBPF):去掉“被删原因 / 历史变动”列,保留字段、说明、单位、shell 示例、判断标准、潜在影响

  • B 场景(用 eBPF):保持原表格

  • 软中断和硬中断触发条件 + 流程:完整列出来源、触发条件、shell / eBPF 示例、潜在影响,并补充流程顺序表

  • 保持表格风格,不拆成段落


Linux CPU QoS / runtime / 延迟观测完整指南(场景 A + B)


场景 A:不用 eBPF(纯用户态)

A-1️⃣ /proc/PID/stat 接口

字段说明单位shell 示例判断标准潜在影响
utime 用户态执行时间 jiffies awk '{print $14}' /proc/$PID/stat delta 低 → CPU 空闲 CPU 空闲 → 任务响应快
stime 内核态执行时间 jiffies awk '{print $15}' /proc/$PID/stat delta 高 → 系统占用高 高系统负载 → 用户任务延迟
starttime 进程启动时间 jiffies awk '{print $22}' /proc/$PID/stat 无直接判断 用于计算进程生命周期

示例:

PID=$(pgrep heka | head -1)
awk '{print "utime=" $14 ", stime=" $15 ", starttime=" $22}' /proc/$PID/stat

输出:

utime=12345678, stime=234567, starttime=678901

A-2️⃣ /proc/PID/schedstat 接口

字段说明单位shell 示例判断标准潜在影响
sum_exec_runtime task 在 CPU 上运行总时间 ns awk '{print $1}' /proc/$PID/schedstat delta 低 → CPU 空闲 CPU 低 → 任务响应快
wait_sum task 在 runqueue 等待 CPU 的时间 ns awk '{print $2}' /proc/$PID/schedstat run_delay / runtime >1 → CPU 拥塞 高 run_delay → 任务延迟
run_sum task 已运行次数 awk '{print $3}' /proc/$PID/schedstat delta 增加快 → task 被频繁调度 调度开销高

示例:

PID=34293
awk '{printf "runtime(ns)=%d, run_delay(ns)=%d, runs=%d\n",$1,$2,$3}' /proc/$PID/schedstat

输出:

runtime(ns)=3627202838706, run_delay(ns)=2230435142757, runs=50000

A-3️⃣ /sys/fs/cgroup/<group>/cpu.stat 接口

字段说明单位shell 示例判断标准潜在影响
usage_usec cgroup 总 CPU 使用 us `cat $CG/cpu.stat grep usage_usec` delta / period > quota% → 高负载
user_usec 用户态 CPU 使用 us 同上 delta 高 → 用户态占用大 高业务占用 CPU
system_usec 内核态 CPU 使用 us 同上 delta 高 → 内核占用大 可能影响低优先任务
nr_periods 调度周期总数 同上 无直接判断 用于 throttle 比率计算
nr_throttled 被限制的周期数 同上 nr_throttled / nr_periods >0 → quota 限制 任务被限制调度
throttled_usec 被限制总时间 us 同上 throttled_usec >0 → quota 限制 延迟增加,影响业务

示例:

CG=/sys/fs/cgroup/mygroup
cat $CG/cpu.stat

输出:

usage_usec 5000000
user_usec 3000000
system_usec 2000000
nr_periods 50
nr_throttled 10
throttled_usec 1000000

A-4️⃣ /proc/stat 接口(CPU 全局)

字段说明shell 示例判断标准潜在影响
cpu / cpuN 累计 CPU 时间 grep '^cpu ' /proc/stat idle <20% → CPU 饱和 高 run_delay
procs_running 正在运行的任务数 grep procs_running /proc/stat > CPU 核数 → CPU 饱和 调度延迟高
procs_blocked 阻塞任务数 grep procs_blocked /proc/stat 高 → I/O 阻塞 阻塞任务延迟高

A-5️⃣ /proc/softirqs 接口(软中断)

字段说明shell 示例判断标准潜在影响
TIMER / NET_RX / NET_TX / BLOCK ... 各类软中断计数 cat /proc/softirqs delta 高 → CPU 被软中断占用 高 run_delay,任务响应慢

示例:

cat /proc/softirqs

输出:

           CPU0       CPU1
HI:          0          0
TIMER:   100000     120000
NET_TX:   50000      60000
NET_RX:  200000     220000
BLOCK:     1000       1200

A-6️⃣ /proc/interrupts 接口(硬中断)

字段说明shell 示例判断标准潜在影响
各 IRQ 行 设备/CPU 中断计数 cat /proc/interrupts delta 高 → CPU 抢占 高 run_delay,任务响应慢

场景 B:使用 eBPF(内核级观测)

B-1️⃣ 核心 hook 及字段

Hook字段 / 说明shell / bpftrace 示例判断标准潜在影响
sched_switch prev_pid / next_pid / delta bpftrace -e 'tracepoint:sched:sched_switch { @[comm] = hist(nsecs - @ts[tid]); }' 单次延迟 > interval → CPU 拥塞 可直接知道谁抢占
sched_wakeup pid / timestamp bpftrace -e 'tracepoint:sched:sched_wakeup { @[pid] = count(); }' delta 高频 → 任务被频繁唤醒 调度开销高
cgroup_throttle pid / throttled_usec bpftool cgroup attach ... throttled_usec >0 → quota 限制 精确时间点的限制
softirq_entry type / timestamp bpftrace -e 'tracepoint:irq:softirq_entry { @[comm] = count(); }' delta 高 → CPU 占用 高 run_delay,任务延迟
softirq_exit type / timestamp 同上 与 entry delta 对比 检查 softirq 长时间占用
RT / CFS 抢占 prev_class / next_class sched_switch hook RT 任务延迟 → CFS 延迟 精确分析延迟原因

B-2️⃣ 中断触发条件表(软中断 + 硬中断)

中断类型触发来源 / 条件shell / bpftrace 示例潜在影响流程说明
NET_RX 网卡接收数据包 tracepoint:irq:softirq_entry 高 run_delay 网卡驱动收到数据 → raise softirq → softirq handler → task 被调度
NET_TX 网卡发送完成 同上 高 run_delay 网卡发送完成 → softirq → net tx handler → task 完成发送
TIMER 内核定时器到期 同上 高 run_delay timer 到期 → softirq → timer handler 执行定时任务
BLOCK 块设备 I/O 完成 同上 高 run_delay I/O 完成 → softirq → block I/O handler → 唤醒等待 task
IRQ 硬件触发(网卡、硬盘、外设等) tracepoint:irq:irq_handler_entry CPU 抢占,可能影响任务响应 外设中断 → IRQ handler → 调度软中断/唤醒 task → 影响调度延迟

总结对比表

能力不用 eBPF用 eBPF判断标准 / 分析方法
runtime delta / 累计 精确每次调度 delta 对比采样间隔 / CPU idle
run_delay 聚合趋势 单次精确 ns delta > interval 或 spikes
谁抢占 无法 PID / comm sched_switch hook prev/next
throttle 累计 / 推断 精确 timestamp throttled_usec >0,事件时间点
softirq / RT 无法 精确标记 softirq_entry / sched_switch hook,高 delta → CPU 忙
CPU 空闲率 delta 精确 /proc/stat delta
工程成本 中-高 buffer / hook overhead
复杂度 用户态消费 buffer + 分析逻辑

结论
不用 eBPF = 读账本 → 只能回答“发生了什么结果”。
用 eBPF = 看录像 → 能回答“为什么发生”。


改动说明

  1. 删除“被删原因 / 历史变动”列

  2. 完整补充软中断和硬中断触发条件表 + 流程说明

  3. 保持表格风格、字段、shell 示例、输出、判断标准、潜在影响


 

posted on 2025-12-30 11:00  吃草的青蛙  阅读(2)  评论(0)    收藏  举报

导航