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 = 看录像 → 能回答“为什么发生”。
✅ 改动说明:
-
删除“被删原因 / 历史变动”列
-
完整补充软中断和硬中断触发条件表 + 流程说明
-
保持表格风格、字段、shell 示例、输出、判断标准、潜在影响
浙公网安备 33010602011771号