Go
golang

GolangのプロセスをFIFO priorityにセットする

センサーのデータを読み取って処理するプロセスをGolangで書いたとします。
たくさんあるプロセスの中で、そのプロセスはあまり後回しにはして欲しくないので、プライオリティをFIFOレベルにセットしたいとします。

Golangのgoroutineはどのスレッドで動作するのかはコントロールすることはできません。なので、goroutineの中からスレッドのプライオリティを設定するシステムコールを呼んでもどういう結果になるか不定です。

なので、最初に自分のプロセスの優先度を設定してから、Golangの実行ファイルをexecするツールを作成しました。

run_fifoprio.c
#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, &param) < 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]));
}

使い方

fooというGolangの実行ファイルをFIFO priority 10 で実行する

$ run_fifo_prio 10 foo

制限事項

一般ユーザーの権限ではFIFOプライオリティにセットすることはできないので、root権限で実行する必要があります。

追加情報

root権限以外でGolangのプロセスを動かしたい場合は、run_fifoprio にCAP_SYS_NICEのケーバビリティを与えておけばうまくいきそうです。(ただしARM Linuxでは動作未確認。)

ケーパビリティの設定

sudo setcap cap_sys_nice=ep run_fifoprio