Я использую cset shield
создать пользователь щит с набором процессоров
cset shield --cpu 1,3,5,7 --kthread on
Идея состоит в том, чтобы зарезервировать эти процессоры для кода моего приложения и передать все другие задачи, а также подвижные потоки ядра на другой процессор.
В моем приложении я создаю 4 потока и в контексте каждого потока пытаюсь использовать sched_setaffinity
чтобы закрепить каждый поток на одном из зарезервированных процессоров.
int cpuNum = 1; // each thread gets one of the cpus
pid_t threadId = static_cast<pid_t>(syscall(SYS_gettid));
cpu_set_t cpuSet;
CPU_ZERO(&cpuSet);
CPU_SET(cpuNum, &cpuSet);
if (sched_setaffinity(threadId, sizeof(cpu_set_t), &cpuSet) == -1)
perror("sched_setaffinity");
Тем не мение, sched_setaffinity
терпит неудачу с Invalid argument
Если я запустил свое приложение, используя cset shield --exec ./TestApp
тогда закрепление работает
Как получилось голое sched_setaffinity
звонок не проходит?
Код вашего приложения выглядит правильно. Быстро, попробуйте это без --kthread on
когда вы создаете щитки процессора. Посмотрите, появится ли такая же ошибка «Недопустимый аргумент». Мне интересно, есть ли проблема с потоками ядра.
Кроме того, это RHEL? Какая настройка оборудования (количество ядер)? Я видел проблемы с sched_setaffinity
вызов приложений, перенесенных из Gentoo в системы Red Hat.