sched_setaffinity терпит неудачу после того, как я использовал cset shield
Я использую 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
звонок не получается?
1 ответ
Код вашего приложения выглядит правильно. Быстро, попробуйте это без --kthread on
когда вы создаете свои щиты процессора. Смотрите, если вы получаете ту же ошибку "Недопустимый аргумент". Мне интересно, есть ли проблема с потоками ядра.
Кроме того, это RHEL? Что такое аппаратная настройка (количество ядер)? Я видел проблемы с sched_setaffinity
вызов приложений, перенесенных из Gentoo в системы Red Hat.