pthread设置SCHED_FIFO等调度策略与优先级跨进程不生效问题问询
跨进程调度优先级不生效的核心原因
1. 无抢占场景:CPU核心数足够承载所有线程
如果你运行程序的设备CPU逻辑核心数 ≥ 256,两个进程的256个线程可以同时分配到独立核心上运行,不存在调度抢占的场景,优先级规则自然不会触发,两个程序会同步执行完成。
2. 实时调度带宽限流限制
Linux内核默认开启实时调度限流机制:
/proc/sys/kernel/sched_rt_period_us默认为1000000(单位微秒,即1秒)/proc/sys/kernel/sched_rt_runtime_us默认为950000(即0.95秒)
也就是说所有实时线程加起来最多只能占用95%的CPU时间,剩下5%的时间必须留给非实时任务运行。当你两个进程的线程数远大于CPU核心数时,高优先级进程的线程占满95%的配额后,内核会强制调度低优先级的线程执行,最终两者总执行时间差异很小。
3. Cgroup分组调度隔离
当前绝大多数采用systemd管理的Linux发行版,会默认将不同会话启动的独立进程划分到不同的CPU cgroup分组中,cgroup层级的调度配额默认是均等分配的:即使你在组内将线程优先级设到最高,跨cgroup调度时两个进程的分组能拿到的CPU时间片是接近的,所以不会出现高优先级进程完全抢占低优先级进程的情况。
而同进程下的所有线程都归属同一个cgroup分组,所以你观测到同进程内优先级规则可正常生效。
4. SCHED_OTHER策略的优先级参数不生效
SCHED_OTHER是Linux默认的分时调度策略,该策略下sched_priority参数必须设为0,优先级调整要通过nice值实现,你通过pthread调度属性设置的优先级对SCHED_OTHER本来就无效,所以修改策略后看不到差异属于正常现象。
验证方案
你可以通过以下测试验证上述逻辑:
- 用
taskset命令将两个程序都绑定到同一个CPU核心上运行,此时核心数不足会触发抢占,就能观测到高优先级进程先执行完成 - 临时关闭实时限流:执行
sudo sysctl -w kernel.sched_rt_runtime_us=-1,再用root权限启动两个优先级不同的程序,高优先级程序会先跑完
内容的提问来源于stack exchange,提问作者Amir Fakhim Babaei
相关产品推荐
相关产品推荐

