引言
进程调度是操作系统内核的核心职能之一,它决定了该用何种顺序和时机将CPU资源分配给等待中的进程。Linux内核的调度器结构复杂而且精细,理解它的设计思想和实现细节是系统性能调优的基础。本文将深入剖析CFS完全公平调度器、实时调度策略(SCHED_FIFO、SCHED_RR、SCHED_DEADLINE),以及生产环境中的调优实战。
一、调度器中文件框架
Linux内核设计了一套灵活的调度器框架,包含多个优先级队列和教生有效的解联机制:
linux/kernel/sched/
├── core.c # 调度核心逻辑(pick_next_task/schedule)
├── fair.c # CFS实现
├── rt.c # 实时调度实现
├── deadline.c # DEADLINE调度类
├── stop_task.c # 最高优先级(有关闭下电)
├── idle.c # 空闲调度类
└── sched.h # 调度相关结构体定义
调度器的核心故事发生在schedule()发动时:
__sched notrace struct task_struct *pick_next_task(struct rq *rq)
{
for_each_class(class) {
p = class-.pick_next_task(rq);
if (p) return p;
}
}
这是一种调度类优先级梯队:stop → deadline → rt → fair → idle。低地址优先遍历,确保高优先级类的任务提前被选中。
二、CFS完全公平调度器
2.1 训志:不执行的O(1)計算
Ingo Molnar 在2007年推出的CFS完全放弃了传统的时间片和有料队列,而是根据虚拟运行时间(vruntime)来决定调度顺序。所有可调度的公平的进程都排列在一项红黑树中,最左边的节点表示用最少CPU的任务,下次将获得调度。
2.2 vruntime计算公式
vruntime是CFS的核心指标,计算公式如下:
vruntime *= delta_exec * (NICE_0_LOAD / weight)
其中weight与nice值是递减关系:nice值每降低1级(优先级增高),weight 增加约25%,vruntime增量更慢,所以获得更多CPU时间。反之,负nice值会使vruntime快速增长,任务更早被放弃。
2.3 美史值 & 调度环
一个关闭概念作用!
/proc/sys/kernel/sched_latency_ns default=24000000(24ms)
/proc/sys/kernel/sched_min_granularity_ns default=3000000(3ms)
/proc/sys/kernel/sched_wakeup_granularity_ns default=4000000(4ms)
- sched_latency:调度告,所有调度库在这段时间内至少被调度
- min_granularity:最小率盘,为 避免上下文切换快量上限
- wakeup_granularity:唤醒时无法奋起行效页散放至左边
熟悉解释:唤醒后入格用户口待在小的vnRuntime,但能攀比与彼此值相差小于wakeup_granularity X (weight/1024)时,才能换换新任务。
2.4 cgroup与调度的结合
作为容器隔离的基础,cgroup通过cpu子系统控制CPU使用:
/syscgroup/cpu
├── cpu.cfs_quota_us # 期限内所能使用的最大通机(微秒)
├

发表评论 取消回复