超线程是一个相对来说有些争议的技术,在某些任务场景下,可能可以提高系统整体的效率,有些时候则不然,由于任务对同一 CPU 核心资源的争抢,效率反而会下降。因此如何正确地分配任务就是一个需要研究的问题。
通常来说,我们认为在 Windows 系统上,一个物理内核的两个逻辑核心在序号上是连续分配的,比如一个 2C4T 的处理器,Thread 0、1 为同一物理核心,Thread 2、3 为同一物理核心;在 Linux 系统上则是间隔分配,比如同样的 2C4T 处理器,Thread 0、2 为同一物理核心,Thread 1、3 为同一物理核心。但是现在我发现并不是这样。
我们可以执行 for file in /sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_list; do echo -n "$file "; cat $file; done |sort -k2 -n
这样一个命令来查看核心的相邻情况。
在我的一台 E3v3 上,结果是这样的:
/sys/devices/system/cpu/cpu0/topology/thread_siblings_list 0-1 /sys/devices/system/cpu/cpu1/topology/thread_siblings_list 0-1 /sys/devices/system/cpu/cpu2/topology/thread_siblings_list 2-3 /sys/devices/system/cpu/cpu3/topology/thread_siblings_list 2-3 /sys/devices/system/cpu/cpu4/topology/thread_siblings_list 4-5 /sys/devices/system/cpu/cpu5/topology/thread_siblings_list 4-5 /sys/devices/system/cpu/cpu6/topology/thread_siblings_list 6-7 /sys/devices/system/cpu/cpu7/topology/thread_siblings_list 6-7
可以发现,分布和 Windows 有些类似。
但是在我的另一台 i3-2130 上,结果却是这样的:
/sys/devices/system/cpu/cpu0/topology/thread_siblings_list 0,2 /sys/devices/system/cpu/cpu2/topology/thread_siblings_list 0,2 /sys/devices/system/cpu/cpu1/topology/thread_siblings_list 1,3 /sys/devices/system/cpu/cpu3/topology/thread_siblings_list 1,3
可以看到是典型的 Linux 分配。
更奇怪的是,这个核心分配并不是稳定的,所以如果有对 CPU 资源要求严格的应用,重启之后需要再次检查逻辑核心的分配,以免效率降低。