12. 调度 Scheduler
Scheduler 调度 CRoutine(Reader 回调、Component Proc、Timer 等)。支持 classic 与 choreography。
本文 §12 |
相关文档 |
|---|---|
任务调度 |
12.1 调度流程
Component::Initialize 末尾向 Scheduler 注册任务;任务名与 choreography 配置中 tasks[].name 对应。
12.2 AUTOLINK_SCHED_CONF
export AUTOLINK_SCHED_CONF=autolink/autolink/conf/compute_sched_choreography.conf
mainboard -d foo.dag
未设置时使用 autolink.pb.conf 内默认调度配置。
配置模板(autolink/autolink/conf/):
文件 |
说明 |
|---|---|
|
classic 教学示例 |
|
choreography 教学示例 |
|
计算管线 |
|
计算管线绑核 |
|
控制管线 |
深度文档:autolink/docs/source/autolink_scheduler_cn.md。
12.3 classic
线程池按 group 划分,任务按名称落入 group,组内按 prio 优先级调度:
scheduler_conf {
policy: "classic"
process_level_cpuset: "0-7,16-23"
threads: [
{ name: "async_log", cpuset: "1", policy: "SCHED_OTHER", prio: 0 }
{ name: "shm", cpuset: "2", policy: "SCHED_FIFO", prio: 10 }
]
classic_conf {
groups: [
{
name: "group1"
processor_num: 16
affinity: "range"
cpuset: "0-7,16-23"
processor_policy: "SCHED_OTHER"
tasks: [{ name: "E", prio: 0 }]
},
{
name: "group2"
processor_num: 16
affinity: "1to1"
cpuset: "8-15,24-31"
tasks: [
{ name: "A", prio: 0 }
{ name: "B", prio: 1 }
{ name: "C", prio: 2 }
{ name: "D", prio: 3 }
]
}
]
}
}
字段 |
含义 |
|---|---|
|
组内工作线程数 |
|
|
|
可用 CPU 核列表 |
|
与内部任务名匹配 |
|
组内优先级,数值越大越优先 |
适合通用负载;可为 async_log、shm 等基础设施线程单独绑核(见 §8 日志 Log)。
12.4 choreography
关键任务指定 processor 编号(专用线程),其余任务进入 pool:
scheduler_conf {
policy: "choreography"
choreography_conf {
choreography_processor_num: 8
choreography_cpuset: "0-7"
choreography_processor_policy: "SCHED_FIFO"
choreography_processor_prio: 10
pool_processor_num: 8
pool_cpuset: "16-23"
pool_processor_policy: "SCHED_OTHER"
tasks: [
{ name: "A", processor: 0, prio: 1 }
{ name: "B", processor: 0, prio: 2 }
{ name: "C", processor: 1, prio: 1 }
{ name: "E" }
]
}
}
未指定 processor 的任务(如 E)落入 pool。
感知 / 控制等 延迟敏感链路 应将任务名绑定到专用 processor,减少与日志、通用逻辑的核争抢。
12.5 联调要点
控制环: Channel
pending_queue_size=1,只处理最新帧。Proc 非阻塞:I/O、重计算移出 Scheduler 线程。
绑核:control 场景用
control_sched_choreography.conf。TimerComponent:
interval短于Proc耗时会导致任务堆积,需缩短Proc或增大间隔。
12.6 任务命名
内部任务名通常来自 Component 配置 config.name 或 channel 相关工厂。修改 choreography 前,用日志或 autolink_monitor 确认实际任务名,再写入 tasks[].name。