我在设置多个内核线程上的CPU亲和度时遇到了问题。内核是3.19 (SMP 100Hz)的一个变种,在6核Intel上禁用了超线程。我设置了isolcpus=1-5。目的是让这些核心处于动态模式(RCU和中断被卸载)。
启动多个线程后,运行掩码为3f(即cpu允许0-5)…
手动分配不应该是Cpu绑定的pid后,我留下了以下任务集-pc 0 pid总是给我"无效掩码"(EINVAL)。Cpusets没有被编译到内核:
khelper、perf、writeback、crypto、bioset、kblock、devfreq_wq、rpciod, nfsiod, deferwq, kworker/u12:1, scsi_tmf_0, scsi_tmf_1, scsi_tmf_2, scsi_tmf_3, kworker/u12:4, ext4-rsv-conver, ext4-rsv-conver, ext4-rsv- converver, ext4-rsv- converver
发行版是Ubuntu 14.04。有没有人知道为什么它看起来isolcpus不工作,为什么这些线程不能移动到给定的核心?
提前感谢。
有没有人知道为什么isolcpus不工作
isolcpus
用于隔离cpu和用户空间线程。
内核线程(主要在启动期间创建)不考虑isolcpus
。
为什么这些线程不能移动到一个给定的核心?Linux内核限制用户空间更改某些线程的cpu亲和性。
例如,工作线程被锁定到默认的cpu亲和性
in kernel/workqueue.c:create_worker()
/* prevent userland from meddling with cpumask of workqueue workers */
worker->task->flags |= PF_NO_SETAFFINITY;
这里有一些关于在系统上隔离cpu的指南
(通常用于减少cpu延迟或增加系统的"实时性")
- linux -核心分区技术
- 提高Linux的实时性