【问题标题】:Why does sched_setaffinity work on one system, fails on another?为什么 sched_setaffinity 在一个系统上工作,在另一个系统上失败?
【发布时间】:2018-12-21 08:57:57
【问题描述】:

我有两块具有不同 ARM CPU 的板,一个 2x 内核 - 运行 Linux 内核 4.1.x,另一个 4x 内核 - 运行 3.10。 在那些 Linux 安装中,我总是以 root 身份登录。 在我的程序中,我为调用进程设置了 CPU 亲和性,就像 here,通过 sched_setaffinity(0, ... ),只是我总是将它设置为 cpu 1。 在 Linux 4.1 上,它按预期工作。 Linux 3.1 给了我一个负返回值,并且 perror(..): "Invalid argument"。

为什么会这样?四核肯定有cpu 1?

【问题讨论】:

  • 如果关联位掩码掩码不包含当前物理上在系统上并且根据 cpuset cgroups 或所述“cpuset”机制可能施加的任何限制允许线程使用的处理器,则返回 EINVAL在 cpuset 中。
  • 哦,根据我在这里读到的内容,linux.die.net/man/7/cpuset,如果支持的话,/proc/filesystems 中应该有一个“nodev cpuset”——在有问题的系统上它不支持。 IE。主板供应商选择为无法设置 CPU 亲和性的四核系统组合 Linux 映像?为什么有人会这样做……所以这意味着我必须构建一个自定义 Linux 映像,或者可以以某种方式启用它吗? (板子有一些封闭的驱动程序,我不能只安装任何发行版映像)
  • 现在我真的很困惑 - 设置 cpu 亲和性的板显然有效,not 也有 /proc/filesystems 条目中所述的“nodev cpuset”手册页。
  • 增加混乱:在两个系统的 /proc/config.gz 中,我发现:“#CONFIG_CPUSETS 未设置”。那为什么它可以在4.1系统上运行呢?我没有收到任何错误,很多 CPU 活动显然被推到了另一个核心。

标签: linux multiprocessing


【解决方案1】:

默认情况下未启用其他 CPU 内核。

如果它们像here 描述的那样被启用(但写的是 1 而不是 0),它会起作用。

#echo 1 > /sys/devices/system/cpu/cpu1/online

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2021-10-16
    • 2015-07-08
    • 1970-01-01
    • 2017-07-11
    • 2013-02-03
    相关资源
    最近更新 更多