c - 将 sched_setaffinity 的最大 CPU 数量作为基础的正确值是多少?

标签 c linux process-management

对于我可以用来为系统上的 sched_setaffinity 调用创建 CPU_SET 的 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 个处理器总计)但是,我还编写了一个脚本来为每个运行的“PID”调用taskset -c -p PID,这显示了每个进程的亲和性列表最大为 0-3。

最佳答案

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

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

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

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

杂项。备注

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

关于c - 将 sched_setaffinity 的最大 CPU 数量作为基础的正确值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22599257/

相关文章:

c - 是否可以打印日志文件的特定部分?

c - 使用 waitpid 或 sigaction?

c - 为什么我不能通过第 11 行的赋值语句将第 0 个索引处的字符替换为第 1 个索引处的字符?

c++ - Windows 系统中是否存在未缓冲的 I/O?

c++ - 基本 C++ 套接字客户端

linux - BASH +如何验证数组中的单词是否包含在变量中

project-management - 项目管理和过程管理的区别

python - C++:如何检查外部程序是否正在运行?

linux - 如何在 Linux 中打开默认的文本编辑器?

ubuntu - 我正在使用 Ubuntu 12.04(精确)64 位,它使用 8GB RAM