Linux C 程序优先级设置

最近在 TK1 上用一个节点从飞控里读数据。单独跑的时候非常好,可是算法起来以后就各种延时,于是给这个节点提高优先级。

绑核

在我们的系统里,主要的算法都绑定了核,所以首先将节点绑定到空闲的 CPU 核上。有两种方式:

  1. CPU_SET
    待补充
  2. taskset
    taskset 是一个 shell 命令,我直接在节点的 launch 文件里加了一行
    1
    launch-prefix="taskset -c 1"

renice

renice 改的是进程的优先级,取值范围应该为 -20..0,越小优先级越高。用 top 命令观察 NI 项可以看到变化。

1
2
3
4
int pid = getpid();
char renice_cmd[128];
sprintf(renice_cmd, "sudo renice -20 %d", pid);
ROS_INFO("renice ncore_bridge: %d", system(renice_cmd));

pthread 参数

线程参数里可以指定调度策略及优先级。

调度策略有普通及实时之分。普通策略有 OTHERBATCHIDLE,没有优先级参数; 实时策略有 FIFORR,优先级取值 1..99top 命令 PI 项可以看到变化,当优先级设为 99 时, PI 项直接显示 rt。

1
2
3
4
5
6
int priority = 40;
struct sched_param param;
param.sched_priority = priority;
if(pthread_setschedparam(pthread_self(), SCHED_FIFO, & param)) {
ROS_ERROR("error while setting thread priority to %d", priority);
}

特别注意!!!

在代码里调进程或线程优先级需要特殊权限,否则会提示 sched_setscheduler: Operation not permitted 之类的东西。可以通过 PAM (Pluggable Authentication Modules) 模块 做这件事。

PAM 会读取 /etc/security/limits.conf,暴力一点,直接加一行

1
* - rtprio 100