【问题标题】:Whats the correct value to base the maximum number of CPU's to sched_setaffinity to?将 sched_setaffinity 的最大 CPU 数量确定为的正确值是多少?
【发布时间】:2014-03-24 00:47:17
【问题描述】:

对于在我的系统上调用CPU_SET 以调用sched_setaffinity 的CPU 数量的正确值是什么,我感到有些困惑。

我的/proc/cpuinfo 文件:

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Core(TM) i5 CPU       M 460  @ 2.53GHz
stepping    : 5
microcode   : 0x2
cpu MHz     : 1199.000
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 0
cpu cores   : 2
apicid      : 0
initial apicid  : 0
fdiv_bug    : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt lahf_lm ida arat dtherm tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5056.34
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Core(TM) i5 CPU       M 460  @ 2.53GHz
stepping    : 5
microcode   : 0x2
cpu MHz     : 1199.000
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 0
cpu cores   : 2
apicid      : 1
initial apicid  : 1
fdiv_bug    : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt lahf_lm ida arat dtherm tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5056.34
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor   : 2
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Core(TM) i5 CPU       M 460  @ 2.53GHz
stepping    : 5
microcode   : 0x2
cpu MHz     : 1199.000
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 2
cpu cores   : 2
apicid      : 4
initial apicid  : 4
fdiv_bug    : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt lahf_lm ida arat dtherm tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5056.34
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Core(TM) i5 CPU       M 460  @ 2.53GHz
stepping    : 5
microcode   : 0x2
cpu MHz     : 1199.000
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 2
cpu cores   : 2
apicid      : 5
initial apicid  : 5
fdiv_bug    : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt lahf_lm ida arat dtherm tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5056.34
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

在这个文件中,我发现processor 行编号为 0-3,用于“物理”处理器(总共 4 个处理器)。我可以从sysconf(_SC_NPROCESSORS_ONLN) 得到这个值,但是cpu cores 也有一行,每个处理器有 2 个。我相信这代表了“逻辑”处理器或超线程。我应该只使用“物理”值还是可以使用“逻辑”计数?

我不清楚这一点,因为如果我转到 /proc/PID/status 则有 Cpus_allowed_list 行,范围可以从 0 到 7(总共 8 个处理器)但是,我还编写了一个脚本来调用 taskset -c -p PID每个“PID”都在运行,这表明每个进程的亲和度列表最大为 0-3。

【问题讨论】:

  • 您的计算机拥有的 CPU(内核)数。
  • taskset 报告每个进程都有一个 0-3 的关联列表是怎么回事,这是创建大多数进程的默认值吗?
  • 是的,进程默认可以在任何处理器上运行。
  • 所以你们俩都说这里可以设置的“核心”是“物理”核心 0-3,而“Cpus_allowed_list: 0-7”的 /proc/PID/status 行是其中的一半被认为是“逻辑的”(来自超线程)并且无法设置?

标签: c linux process-management


【解决方案1】:

对于超线程,每个核心有 2 个逻辑 CPU。这意味着,如果一个逻辑 CPU 因任何原因(缓存未命中、分支错误预测、指令依赖等)停止运行,则内核可以执行来自另一个逻辑 CPU 的指令,而不会坐在那里等待/被浪费。此外,通常核心能够比单个逻辑 CPU 执行更多的并行操作,因此即使没有任何(常见的)停顿,您仍然可以获得好处(通过提高核心资源的利用率)。在这种情况下;您想使用所有逻辑 CPU。

对于编写不佳的多线程软件(具有严重可扩展性问题的软件),超线程的收益可能会因可扩展性差而丧失。例如,该过程可能会导致“缓存线弹跳”(缓存线经常在内核之间“弹跳”),并且使用亲和性来减少内核数量会有所帮助。再举一个例子,内核的 RAM 带宽可能是瓶颈(导致进程无法从超线程中获益),并且使用亲和性来防止进程在每个内核中使用两个逻辑 CPU 可以提高性能。对于这些情况;您只想使用一些逻辑 CPU(但不知道哪些)。

对于单线程进程,你做什么并不重要。

基本上(假设是多线程的);流程的最佳设置取决于流程;因此,您应该运行一些测试来了解亲和力如何影响您的流程。

杂项。备注

当超线程首次引入时(Netburst/Pentium 4),它“不太理想”,并且大多数操作系统中的调度程序都没有经过优化以有效地调度超线程的负载(这使得情况变得更糟) .这导致很多人认为超线程在很多情况下都是不好的。现代 Intel CPU 没有 Netburst/Pentium 4 所存在的问题,而且现代操作系统调度程序确实对超线程进行了优化。这意味着当时正确的旧假设(“超线程可能很糟糕”)现在大多已过时且错误。

【讨论】:

  • @tijko:嘿-我会添加一个解释:-)
  • 这对于了解更多有关该主题的一般信息很有帮助,但仍然无法回答我的问题。
  • @tijko:唯一正确的答案是“您的流程的最佳设置取决于流程;因此您应该运行一些测试以查看亲和力如何影响您的流程”。
  • @tijko:如果您没有针对特定/重要进程调整操作系统,那么您可能应该将其设置为“所有逻辑 CPU”
  • 超线程 0-7 总数是多少?如果是这种情况,为什么 taskset 调用会为所有进程显示 0-3?
【解决方案2】:

ma​​n cpuset page 中关于 Cpus_allowed_list

的信息

cpuset 定义了 CPU 和内存节点的列表。系统的 CPU 包括进程可以在其上的所有逻辑处理单元 执行,包括(如果存在)包中的多个处理器内核和处理器内核中的超线程。内存节点包括所有不同的主要银行 记忆; 小型和 SMP 系统通常只有一个内存节点包含系统的所有主内存,而 NUMA(非统一内存 access) 系统有多个内存节点

Cpusets 与 sched_setaffinity(2) 调度集成 亲和机制以及 mbind(2) 和 set_mempolicy(2) 内存- 内核中的放置机制。这两种机制都不允许进程使用不支持的 CPU 或内存节点。 允许 通过该进程的 cpuset。如果对进程的 cpuset 放置的更改与这些其他机制发生冲突,则 cpuset 放置 是 强制执行,即使这意味着覆盖这些其他机制。内核通过默默地限制 这些其他机制请求的 CPU 和内存节点与调用进程的 cpuset 允许的那些相比。这可能导致 这些其他调用返回错误,例如,如果这样的调用最终请求一组空的 CPU 或内存节点, 后 该请求仅限于调用进程的 cpuset。

有关 cpuset 的其他信息以及内核如何处理更改/移动的请求 从一个 cpuset 到另一个。

系统中的每个进程都只属于一个cpuset。一个进程只能在它所属的cpuset 中的CPU 上运行,并且只能在该cpuset 中的内存节点上分配内存。当一个进程fork(2)s时,子进程被放置在 与其父级相同的cpuset。 如果有足够的权限,一个进程可以从一个 cpuset 移动到另一个,并且现有cpuset 的允许CPU 和内存节点可能会改变。

所以我认为,如果您将 Cpus_allowed_list 值设为 8,这可能意味着您的机器是 4 核并且每个核都启用了超线程。所以逻辑上它变成4 * 2。 因此,在调用 sched_setaffinity() 时我们应该使用逻辑 CPU 而不是物理 CPU,如果它无法获取有关失败原因的更多信息,我们应该检查返回值。

【讨论】:

  • 我在设置 cpu_set 时得到无效的参数,无论它对于 一些 进程设置为 7 cpus 还是 3 cpus,但不是全部。虽然不返回错误的那些在 cpu_set 中设置了 7 个核心,而taskset 仍然报告他们的设置为 0-3???
  • @tijko:这取决于很多因素,比如父 cpuset、足够的权限等等。我不知道 taskset 命令,但是一旦 sched_setaffinity() 成功完成,它确保 cpuset 已设置为用户提供的特定逻辑 CPU。
  • 我在这里有适当的权限,但是我不确定父 cpuset。我还没有把get_schedaffinity 放在一起,我刚刚用taskset 看看输出是否仍然相同。对于能够成功进行调用的进程,我现在确实得到了 1-3(而不是像调用之前那样的 0-3),但是就像我提到的那样,掩码设置为 1-7?
  • 跟进:我确实从一个成功设置为 7 的 cpu_set 的进程中得到了一组 3 个 cpu(没有返回错误)。我还做了一个strace taskset -c -p PID,它表明它也在调用sched_getaffinity 并获得相同的数据。所以现在我可以在/proc/PID/status 在线Cpus_allowed_list 中看到它显示0-7 是“允许的”,我用一个有7 个CPU 的cpuset 调用sched_setaffinity,这不会返回一个错误但是,get_schedaffinity 显示进程集中只有 3 个???
猜你喜欢
  • 2020-02-07
  • 2012-12-02
  • 2011-10-21
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多