私は組み込み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
他に良い方法がありますか?