2

我在多个内核线程上设置 CPU 亲和性时遇到问题。该内核是 6 核 Intel 上禁用超线程的 3.19(SMP 100Hz)的变体。我设置了isolcpus=1-5。目的是让这些内核处于 dyntick 模式(卸载 RCU 和中断)。

启动多个线程后,使用掩码 3f 运行(即 Cpus 允许 0-5)...

在手动对不应该受 Cpu 约束的 pid 进行任务分配后,我留下了以下内容,taskset -pc 0 pid 总是给我“无效掩码”(EINVAL)。cpuset 没有编译到内核中:

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-转换, ext4-rsv-convere

该发行版是 Ubuntu 14.04。有谁知道为什么 isolcpus 不起作用以及为什么这些线程不能移动到给定的核心?

先感谢您。

4

1 回答 1

1

有谁知道为什么它看起来 isolcpus 不起作用

isolcpus用于将 CPU 与用户空间线程隔离开来。
内核线程(主要在启动期间创建)不考虑isolcpus在内。

为什么这些线程不能移动到给定的核心?Linux 内核限制用户空间更改某些线程的 cpu 关联性。

例如,工作线程被锁定为其默认的 cpu-
affinitieskernel/workqueue.c:create_worker()

         /* prevent userland from meddling with cpumask of workqueue workers */
         worker->task->flags |= PF_NO_SETAFFINITY;

以下是一些在系统上隔离 CPU 的指南
(通常用于减少 CPU 延迟增加系统的“实时性”)

于 2019-01-29T17:48:20.560 回答