将Golang进程设置为FIFO优先级
假设我们用Golang编写了一个读取并处理传感器数据的进程。
在众多进程中,我们希望该进程不被太过拖后腿,因此我们想将其优先级设置为FIFO级别。
Golang的goroutine无法控制在哪个线程上运行。因此,即使在goroutine内部调用设置线程优先级的系统调用,结果也是不确定的。
因此,我先设置了自己流程的优先级,然后创建了一个用于执行Golang可执行文件的工具。
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <unistd.h>
int run_fifoprio(int fifoprio, char** cmd)
{
struct sched_param param;
param.sched_priority = fifoprio;
if (sched_setscheduler(0, SCHED_FIFO, ¶m) < 0) {
perror("sched_setscheduler");
return -1;
}
return execvp(cmd[0], cmd);
}
int main(int argc, char** argv)
{
if (argc < 3) {
printf("usage: %s fifo_prio command ... \n", argv[0]);
return 0;
}
return (run_fifoprio(atoi(argv[1]), &argv[2]));
}
使用方法 (shǐ fǎ)
使用FIFO优先级10执行名为foo的Golang可执行文件。
$ run_fifo_prio 10 foo
限制事项
普通用户没有权限设置为FIFO优先级,所以需要以root权限来执行。
附加信息
如果你想在没有root权限的情况下运行Golang进程,可以尝试给run_fifoprio分配CAP_SYS_NICE的能力,这样应该可以成功(但在ARM Linux上尚未经过验证)。
使用sudo设置权限
sudo setcap cap_sys_nice=ep run_fifoprio