最近在 TK1 上用一个节点从飞控里读数据。单独跑的时候非常好,可是算法起来以后就各种延时,于是给这个节点提高优先级。
绑核
在我们的系统里,主要的算法都绑定了核,所以首先将节点绑定到空闲的 CPU 核上。有两种方式:
CPU_SET
待补充taskset
taskset
是一个 shell 命令,我直接在节点的 launch 文件里加了一行1
launch-prefix="taskset -c 1"
renice
renice
改的是进程的优先级,取值范围应该为 -20..0,越小优先级越高。用 top
命令观察 NI 项可以看到变化。
1 | int pid = getpid(); |
pthread 参数
线程参数里可以指定调度策略及优先级。
调度策略有普通及实时之分。普通策略有 OTHER, BATCH 及 IDLE,没有优先级参数; 实时策略有 FIFO 和 RR,优先级取值 1..99。 top
命令 PI 项可以看到变化,当优先级设为 99 时, PI 项直接显示 rt。
1 | int priority = 40; |
特别注意!!!
在代码里调进程或线程优先级需要特殊权限,否则会提示 sched_setscheduler: Operation not permitted
之类的东西。可以通过 PAM (Pluggable Authentication Modules) 模块 做这件事。
PAM 会读取 /etc/security/limits.conf,暴力一点,直接加一行
1 | * - rtprio 100 |