Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

センサーのデータを読み取って処理するプロセスを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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away