저는 임베디드 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/status
RT 프로세스가 예정되어 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
다른 더 좋은 방법이 있나요?