プロセスがCPUを完全に占有する方法は?

プロセスがCPUを完全に占有する方法は?

私は組み込みLinuxシステム(kernel-5.10.24)を開発しています。予約されておらず、CPUを完全に占有するプロセスを取得しようとしています。

#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char **argv)
{
    int cpus = 0;
    int  i = 0;
    cpu_set_t mask;
    struct sched_param schedp;

    cpus = sysconf(_SC_NPROCESSORS_ONLN);
    printf("cpus: %d\n", cpus);

    CPU_ZERO(&mask);
    CPU_SET(1, &mask);
    if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {
        printf("Set CPU affinity failue, ERROR:%s\n", strerror(errno));
        return -1;
    }

    memset(&schedp, 0, sizeof(schedp));
    schedp.sched_priority = sched_get_priority_max(SCHED_FIFO);
    if (sched_setscheduler(0, SCHED_FIFO, &schedp) == -1) {
        perror("error: Failed to set the thread priority");
        return -1;
    }

    while(1)
       ;

    return 0;
}

SCHED_FIFO(優先順位99)をCPU1にバインドしました。
私もsysctl -w kernel.sched_rt_runtime_us=1000000
確認してみると、/proc/sched_debugまだ/proc/PIDxxx/statusRTプロセスが予定されていてnonvoluntary_ctxt_switches増えることがわかりました。

それでは、予約なしでプロセスがCPUを完全に占有できるようにするにはどうすればよいですか?

ベストアンサー1

スケジュールされておらず、プロセスがCPUを完全に占有できる方法を見つけました。
質問で行った操作に加えて、isolcpus=1 rcu_nocbs=1 nosoftlockupカーネルコマンドラインでも設定しました。
これにより、nonvoluntary_ctxt_switchesプロセスは変更されません。

私の方法が良い方法かどうかはわかりません。次のような内容を語るカーネルログがあることを発見しました。

[  271.620046] BUG: workqueue lockup - pool cpus=1 node=0 flags=0x0 nice=0 stuck for 219s!
[  271.620083] Showing busy workqueues and worker pools:
[  271.620088] workqueue events: flags=0x0
[  271.620093]   pwq 2: cpus=1 node=0 flags=0x0 nice=0 active=1/256 refcnt=2
[  271.620110]     pending: cache_reap

他に良い方法がありますか?

おすすめ記事