进程调度与绑核
本文对应 成长路径 高优先级:理解 CFS 与 实时调度类,并能与 DPDK 绑核、isolcpus 对照使用。
学习目标
- 说明 CFS 如何分配 CPU 时间,nice 与 权重 的关系。
- 使用
chrt、SCHED_FIFO时注意 饿死 与 优先级反转。 - 配置
isolcpus、taskset与 DPDK-l掩码一致。
调度类概览
| 策略 | 适用 | 要点 |
|---|---|---|
| SCHED_OTHER (CFS) | 普通进程 | 默认,公平共享 CPU |
| SCHED_FIFO / RR | 实时 | 高优先级先运行,需 CAP_SYS_NICE |
| SCHED_DEADLINE | 周期性实时 | 带宽/周期约束 |
| SCHED_BATCH / IDLE | 后台 | 降低干扰 |
查看:
chrt -p <pid>
ps -o pid,cls,pri,ni,cmd -p <pid>CFS 与 nice
- CFS 用 虚拟运行时间 vruntime 选择最「欠账」的任务。
- nice 范围 -20~19(越小越优先),改变 权重 而非固定时间片。
- 多核 下每 CPU 一个 runqueue;负载均衡会迁移任务。
调试:
nice -n 10 ./workload
renice -n -5 -p <pid>实时调度风险
SCHED_FIFO 在同优先级下 一直运行 直到阻塞或让出;错误使用会导致 软 lockup(其他任务饿死)。
建议:
- 仅对 明确周期、短临界 的线程使用 RT。
- 记录
/proc/sched_rt_runtime_us(RT 带宽限制,默认 95%)。 - 与 优先级继承 mutex 配合,避免反转。
绑核与隔离
taskset(用户态)
taskset -c 2,3 ./appisolcpus(内核启动参数)
isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3将 CPU 从 通用 CFS 迁移 中隔离,供 DPDK polling 或 低抖动 线程专用。
与 DPDK 对照
| Linux 侧 | DPDK 侧 |
|---|---|
isolcpus 保留核 | lcore 掩码 -l 2-3 |
| 管理进程跑在非隔离核 | testpmd / 业务线程占满隔离核 |
| 中断可 smp_affinity 到非数据面核 | RSS 将流量分到数据队列 |
避免 同一物理核 既跑 内核软中断 又跑 busy poll,见 DPDK 教程 4:Offload、Flow、NUMA、IOVA 与性能剖析。
上下文切换关联
调度切换涉及 寄存器、栈、MMU ASID 等,见 深入了解上下文切换。
实践清单
- 用
chrt -f 50跑一小段循环,观察其他进程延迟(实验后恢复) - 画一张本机 CPU 拓扑(
lscpu)并标出 DPDK / 内核线程占用的核 - 对照一次
/proc/interrupts与网卡队列亲和