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.

Другие вопросы по тегам