我正在使用cset shield
创建一个用户带有一组 CPU 的屏蔽
cset shield --cpu 1,3,5,7 --kthread on
其背后的想法是将这些 CPU 保留给我的应用程序代码,并将所有其他任务以及可移动内核线程推送到其他 CPU 上。
在我的应用程序中,我创建了 4 个线程,并在每个线程的上下文中尝试将sched_setaffinity
每个线程固定到其中一个保留的 CPU 上。
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
您的应用程序代码看起来正确。快速地,在创建 CPU 屏蔽时尝试一下。看看您是否收到相同的“无效参数”错误。我想知道内核线程是否存在问题。
另外,这是 RHEL 吗?硬件设置是什么(核心数)?我发现sched_setaffinity
从 Gentoo 移到 Red Hat 系统的应用程序调用存在问题。