进程调度与绑核

本文对应 成长路径 高优先级:理解 CFS实时调度类,并能与 DPDK 绑核isolcpus 对照使用。


学习目标

  • 说明 CFS 如何分配 CPU 时间,nice权重 的关系。
  • 使用 chrtSCHED_FIFO 时注意 饿死优先级反转
  • 配置 isolcpustaskset 与 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 ./app

isolcpus(内核启动参数)

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 与网卡队列亲和

延伸阅读