定位优先级相关的问题需要重点关注sched_setscheduler
接口。sched_setscheduler
是 Linux 内核中用于设置进程调度策略和优先级的接口。它允许用户或程序动态调整进程的调度策略(如实时调度或普通调度)及其优先级。
作用
sched_setscheduler
的主要功能包括:
-
设置调度策略:支持多种调度策略,如:
-
SCHED_NORMAL
(普通调度,CFS) -
SCHED_FIFO
(先进先出实时调度) -
SCHED_RR
(轮转实时调度) -
SCHED_DEADLINE
(截止时间调度)
-
-
设置优先级:根据调度策略设置进程的优先级,实时调度策略的优先级范围通常为 1 到 99,数值越大优先级越高。
函数原型
#include <sched.h>
int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);
-
pid
:目标进程的 PID,0 表示当前进程。 -
policy
:调度策略(如SCHED_FIFO
)。 -
param
:指向sched_param
结构体的指针,包含优先级等信息。
示例代码
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
struct sched_param param;
param.sched_priority = 50; // 设置优先级
if (sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) {
perror("sched_setscheduler");
exit(EXIT_FAILURE);
}
printf("Scheduling policy set to SCHED_FIFO with priority %d\n", param.sched_priority);
return 0;
}
打开 Trace 点
要跟踪 sched_setscheduler
的调用,可以使用内核的 ftrace
或 perf
工具。
使用 ftrace
-
打开sched_setscheduler的trace点:
echo 1 > /sys/kernel/tracing/events/sched/sched_setscheduler/enable
-
还可以打开调用栈,观察优先级变化是什么原因引起的:
cd /sys/kernel/tracing/events/sched/sched_setscheduler echo stacktrace > trigger // 打开调用栈 echo !stacktrace > trigger // 关闭调用栈
-
用文本工具打开抓到trace,搜索sched_setscheduler关键字就可以看到优先级的变化过程以及触发原因