Назад | Перейти на главную страницу

sched_setaffinity не работает после того, как я использовал щит cset

Я использую 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.