perf sched 提供迁移统计与延迟分析,但需结合 perf record -e sched:sched_migrate_task 和 /proc/sched_debug 定位具体迁移路径;old_cpu/new_cpu 为逻辑 cpu,须映射物理拓扑;关键指标包括 avg/max 延迟、migrations 次数及 load_balance 行为。

直接用 perf sched 可以观察进程在不同物理核心间的迁移行为,但需配合正确参数和上下文理解——它不显示“哪个进程从 core 3 迁到了 core 7”的原始日志,而是提供统计视图与延迟分析。真正定位迁移路径,要结合 perf record -e sched:sched_migrate_task 和 /proc/sched_debug 交叉验证。
抓取迁移事件的原始记录
内核调度迁移动作由 sched:sched_migrate_task 跟踪点捕获,这是最直接的信号:
- 运行命令:
perf record -e sched:sched_migrate_task -a sleep 10
(-a表示全系统采集,适合观察跨核迁移) - 回放时过滤迁移事件:
perf script | awk '/sched_migrate_task/ {print $1,$9,$11,$13}'
输出类似:bash/12345 [003] ... migrate: pid=12345 old_cpu=3 new_cpu=7 - 注意:
old_cpu和new_cpu是逻辑 CPU 编号,需查lscpu或cat /sys/devices/system/cpu/cpu*/topology/core_id映射到物理核心
用 perf sched 统计迁移频次与延迟
perf sched 是专用子命令,聚焦调度器行为建模:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 生成迁移统计摘要:
perf sched record -a sleep 30perf sched latency→ 查看各进程平均调度延迟、最大延迟、迁移次数(nr_migrations列) - 识别“乒乓迁移”:
perf sched map显示进程在哪些 CPU 上频繁切换;若某进程在cpu3/cpu7/cpu3/cpu7循环出现,大概率是负载均衡过于激进或sched_migration_cost_ns设置过低 - 关键指标含义:
•avg:进程被唤醒到实际运行的平均延迟
•max:单次最长延迟,常由跨 NUMA 迁移或中断抢占引发
•migrations:该进程在采样期内迁移总次数
关联物理拓扑与迁移代价
单纯看到“从 cpu3 到 cpu7”不够,必须确认它们是否同属一个物理核心、同一 NUMA 节点:
- 查物理布局:
lscpu | grep -E "(CPU\(s\)|Core|Socket|NUMA)"
或更细粒度:for i in /sys/devices/system/cpu/cpu[0-9]*; do echo "$(basename $i): $(cat $i/topology/core_id) core, $(cat $i/topology/physical_package_id) package, $(cat $i/topology/numa_node) node"; done | sort -k4,4n - 检查迁移成本设置:
cat /proc/sys/kernel/sched_migration_cost_ns
默认值通常为 500000(500μs),若观察到大量短间隔迁移(如间隔 - 验证 NUMA 影响:
若old_cpu和new_cpu属于不同 NUMA 节点,perf sched latency中的max值往往突增(因远程内存访问延迟达百纳秒级)
交叉验证:用 /proc/sched_debug 看实时队列状态
该接口提供迁移发生后的快照,补全 perf 的“事后统计”视角:
- 查看某 CPU 的 CFS 队列迁移历史:
grep -A5 "cpu#3" /proc/sched_debug | grep "nr_migrations"
输出如nr_migrations: 1245,表示该 CPU 总共执行过 1245 次任务入队(含本地唤醒和远端迁移入队) - 对比多 CPU 的
nr_switches和nr_migrations比值:
若某 CPU 的nr_migrations占nr_switches比例 >30%,说明大量任务不是自然调度切换,而是被强制迁移过来的——可能负载不均或亲和性配置冲突 - 检查
load_balance计数:
全局 section 中的load_balance: XXX表示触发了多少次负载均衡尝试,若其失败率(load_balance_failed)高,说明迁移受阻(如任务绑核、缓存热度未过期)










