프로세스가 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

다른 더 좋은 방법이 있나요?

관련 정보