Linux中CPU时间片非固定参数,而是由调度器动态计算;CFS基于vruntime调度,实时任务可通过chrt和/proc/sys/kernel/sched_rr_timeslice_ms调整,CFS行为受sched_latency_ns等参数影响。

Linux 中 CPU 时间片并非一个固定可调的独立参数,而是由调度器动态计算得出的结果。真正能影响任务获得 CPU 时间长短的,是调度策略(如 SCHED_FIFO、SCHED_RR、SCHED_OTHER)和相关优先级/权重参数。直接“调整时间片”在 CFS(完全公平调度器)下并不适用,但可以通过调节调度行为来间接控制任务的 CPU 占用节奏与响应性。
理解 CFS 下的“虚拟运行时间”机制
CFS 不使用固定时间片,而是基于 vruntime(虚拟运行时间) 进行调度:每个任务按其权重(由 nice 值决定)累积运行时间,调度器总是选择 vruntime 最小的任务运行。这意味着:
- 高 nice 值(低优先级)→ 权重小 → 同样实际运行时间下 vruntime 增长更快 → 被调度频率降低
- 低 nice 值(高优先级)→ 权重大 → vruntime 增长更慢 → 更容易被选中执行
- 时间片长度会随系统负载动态变化,典型范围在 1–10ms 之间,用户不可直接配置
调整实时任务的时间分配(SCHED_FIFO / SCHED_RR)
对于实时进程,可通过 chrt 设置调度策略与静态优先级(1–99),其中 SCHED_RR 还隐含轮转行为:
- SCHED_FIFO:一旦运行,直到主动让出或被更高优先级抢占;无时间片概念
- SCHED_RR:每个实时进程在一个时间片内运行后让出 CPU,时间片默认为 100ms,可通过 /proc/sys/kernel/sched_rr_timeslice_ms 修改(需 root)
- 示例:将进程 PID 1234 设为 SCHED_RR、优先级 50,时间片设为 50ms:
echo 50 > /proc/sys/kernel/sched_rr_timeslice_ms<br> chrt -r 50 1234
影响 CFS 行为的关键 tunable 参数
虽然没有“时间片”开关,但以下内核参数可显著改变 CFS 的调度粒度与响应倾向:
- sched_latency_ns:调度周期,默认约 6ms(48×125000ns)。周期内所有可运行任务应尽量各执行一次。增大它会让每个任务单次运行更久,适合吞吐场景;减小则提升交互响应(但增加调度开销)
- min_granularity_ns:最小调度粒度,默认约 0.75ms。限制单个任务单次最少运行时间,防止过于频繁切换。调小可提高实时性,但可能加剧上下文切换
- 修改方式(临时):
echo 10000000 > /proc/sys/kernel/sched_latency_ns<br> echo 500000 > /proc/sys/kernel/sched_min_granularity_ns
实用建议:按场景选择调优方向
不必盲目修改内核参数。多数情况下,优先用好用户态工具:
- 对延迟敏感服务(如音视频处理):用 chrt -r 提升为实时策略,并绑定 CPU(taskset)减少迁移开销
- 对公平性要求高的多租户环境:保持默认 CFS,用 nice/ionice 区分优先级,配合 cgroups v2 限制 CPU 带宽(
cpu.max) - 调试调度行为:用 perf sched、chrt -p、ps -eo pid,comm,cls,pri,nice,rtprio 查看实际策略与优先级


















