CFS(Completely Fair Scheduler,完全公平调度器)是Linux内核默认的进程调度器,由Ingo Molnár在2007年引入。它基于红黑树实现,以O(log n)的时间复杂度保证调度的公平性。
CFS使用红黑树维护可运行进程队列:
每个进程维护vruntime值:
vruntime += 实际运行时间 * (NICE_0_LOAD / 进程权重)
关键点:
#include <sched.h> #include <stdio.h> #include <unistd.h> #include <sys/resource.h> void set_realtime_priority() { struct sched_param param; param.sched_priority = 99; // 最高优先级 // 设置FIFO实时调度策略 if (sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler"); return; } printf("进程 %d 已设置为实时优先级\n", getpid()); } int main() { set_realtime_priority(); // 执行实时任务 while (1) { // 执行关键任务代码 usleep(1000); } return 0; }
| 策略 | 特点 | 适用场景 |
|---|---|---|
| SCHED_NORMAL | 普通分时调度 | 一般应用 |
| SCHED_BATCH | 批处理调度 | 后台任务 |
| SCHED_IDLE | 空闲时调度 | 低优先级任务 |
| SCHED_FIFO | 实时FIFO | 硬实时系统 |
| SCHED_RR | 实时轮转 | 软实时系统 |
某VoIP应用遇到音频卡顿问题,通过进程优先级优化解决:
问题分析:
解决方案:
// 设置音频线程为实时优先级 void set_audio_thread_priority(pthread_t thread) { struct sched_param param; param.sched_priority = 80; pthread_setschedparam(thread, SCHED_RR, ¶m); // 锁定内存页避免换页 mlockall(MCL_CURRENT | MCL_FUTURE); }
优化效果:
# 查看当前调度延迟 cat /proc/sys/kernel/sched_min_granularity_ns cat /proc/sys/kernel/sched_latency_ns # 优化为低延迟场景 echo 1000000 > /proc/sys/kernel/sched_min_granularity_ns echo 5000000 > /proc/sys/kernel/sched_latency_ns
// 绑定进程到特定CPU核心 void set_cpu_affinity(int cpu_id) { cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(cpu_id, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); }
# 记录调度事件 perf sched record -- sleep 60 # 分析调度延迟 perf sched latency # 查看调度映射 perf sched map
# 跟踪进程调度 bpftrace -e 'tracepoint:sched:sched_switch { printf("%s -> %s\\n", str(prev_comm), str(next_comm)); }'