我在许多内核线程上设置CPU关联性时遇到问题。内核是6核Intel上3.19(SMP 100Hz)的变体,禁用超线程。我设置了isolcpus = 1-5。目的是让这些内核处于dyntick模式(RCU和中断卸载)。
启动一些使用掩码3f运行的线程(即Cpus允许0-5)......
在手动设置了不应该是Cpu绑定的pid后,我留下了以下任务集-pc 0 pid总是给我“无效掩码”(EINVAL)。 cpusets没有编译到内核中:
khelper,perf,writeback,crypto,bioset,kblockd,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-convere
该发行版是Ubuntu 14.04。有没有人知道为什么它出现isolcpus不起作用以及为什么这些线程无法移动到给定的核心?
提前谢谢。
答案 0 :(得分:0)
有人知道为什么isolcpus无法正常工作吗
isolcpus
用于将CPU与用户空间线程隔离。
内核线程(主要是在引导过程中创建的)不考虑isolcpus
。
为什么这些线程无法移动到给定的内核? Linux内核限制用户空间更改某些线程的cpu亲和力。
例如,工作线程被锁定为其默认的cpu-affinities
在kernel/workqueue.c:create_worker()
/* prevent userland from meddling with cpumask of workqueue workers */
worker->task->flags |= PF_NO_SETAFFINITY;
以下是在系统上隔离CPU的一些指南
(通常是为了减少CPU延迟 OR 来增加系统的“实时性”)