检查是否启用了超线程?


Answers:


27

2014年7月8日添加注释:正如Riccardo Murri指出的那样,我在下面的回答仅显示处理器是否报告支持超线程。通常,* nix O / S被配置为启用超线程(如果支持)。但是,要以编程方式进行实际检查,请参见例如Nils的答案

---- 2012年3月25日的原始答案:

您确实在正确的轨道上:)与

dmidecode -t processor | grep HTT

在Linux上,我通常只在的“标志”行中寻找“ ht” /proc/cpuinfo。例如看

grep '^flags\b' /proc/cpuinfo | tail -1

或者如果您想在模式中包含“ ht”

grep -o '^flags\b.*: .*\bht\b' /proc/cpuinfo | tail -1

\b匹配单词边界并在“ ht”是另一个标志的一部分的情况下帮助避免误报。)


19
这只会告诉您处理器是否支持HT,而不会告诉您实际上是否正在使用HT。
Riccardo Murri 2014年

3
HTT字段并不表示处理器实际上在其内核中具有超线程。检查/ proc / cpuinfo中的“兄弟姐妹”和“ cpu核心”的值
Silver Moon,

@ Silver-Moon您能说明一下吗?dmidecode读取SMBIOS并应告知处理器功能。它不告诉操作系统是否看到或使用了超线程。但这已被评论。另请参见Nils答案
xebeche 2014年

1
我的系统dmidecode输出上的@xebeche显示“ HTT(多线程)”,但我的处理器是“ Core 2 Quad Q8400”,其中没有超线程。检查英特尔规格。
银月

1
+1里卡多 我在支持HT的服务器上禁用了HT,我看到它显示“ HTT”。lscpu是检查的方法。
sudo

96

我一直只是使用以下内容,并研究了“每个核心的线程:”。

hostname:~ # lscpu
Architecture:          x86_64
CPU(s):                24
Thread(s) per core:    2                <-- here
Core(s) per socket:    6
CPU socket(s):         2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 44
Stepping:              2
CPU MHz:               1596.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              12288K

但是请注意,如果通过简单的操作关闭了任何逻辑处理器,此技术将失败

echo 0 > /sys/devices/system/cpu/cpuX/online

4
这是最好的答案。它不需要阅读茶叶,不需要很多有用的信息,也不需要grepping。
MrMas 2015年

11
OMG,您使用Shell命令来获得答案吗?!那太老派了--1。好的Python脚本呢?写作只需要一个下午。由于不是Python,因此另加-1。但是,为了简洁起见,+ 3。
Mike S

@Mike S颇有讽刺意味,但是... 例如,只有1个超线程内核在4核CPU上出现故障时,lscpu的输出不正确(这是完全有效的方案)。因此,尽管实际上有3个内核是超线程的(总共7个线程),它将报告“每个内核的线程:1”
Cedric Martin

@Cedric Martin,您注意到了。:-) ...哦!很好...我做到了!拿了一个双8核机器(Dell R620 / E5-2667 v2 CPU)...它报告32个CPU ...已执行echo 0 > /sys/devices/system/cpu/cpu31/online,现在lscpu报告Thread(s) per core: 1。不好lscpu!猜猜我不会再使用这个了。
Mike S

3
@Mike S您仍然可以使用lscpu,但我猜不是那一行。例如,使用“ lscpu -e -a”正确列出每个线程并告知其是否处于活动状态。这只是“主题(S)每核”并没有太大的意义时,你可以在每个核心不同的启用/禁用线程。
Cedric Martin

18

如果逻辑处理器的数量是内核数量的两倍,则您具有HT。使用以下脚本解码/ proc / cpuinfo

#!/bin/sh
CPUFILE=/proc/cpuinfo
test -f $CPUFILE || exit 1
NUMPHY=`grep "physical id" $CPUFILE | sort -u | wc -l`
NUMLOG=`grep "processor" $CPUFILE | wc -l`
if [ $NUMPHY -eq 1 ]
  then
    echo This system has one physical CPU,
  else
    echo This system has $NUMPHY physical CPUs,
fi
if [ $NUMLOG -gt 1 ]
  then
    echo and $NUMLOG logical CPUs.
    NUMCORE=`grep "core id" $CPUFILE | sort -u | wc -l`
    if [ $NUMCORE -gt 1 ]
      then
        echo For every physical CPU there are $NUMCORE cores.
    fi
  else
    echo and one logical CPU.
fi
echo -n The CPU is a `grep "model name" $CPUFILE | sort -u | cut -d : -f 2-`
echo " with`grep "cache size" $CPUFILE | sort -u | cut -d : -f 2-` cache"

如果$NUMCORE > $NUMLOG我们可以说启用了超线程,对吗?事实确实如此2 * $NUMCORE = $NUMLOG,这是否总是对的,还是某些CPU的内核可能多4倍?
Tombart

@Tombart当前HT是因素2。我可以想象,将来它还会更多。核心被标记为物理的。每个插槽的核心数可以从同级中得出。
尼尔斯

如果lscpu有空的话,lscpu将提供相同的信息以及大量额外的元数据,并且lscpu更容易解析其输出。但是此解决方案确实有效并且仅使用/proc/cpuinfo
Trevor Boyd Smith

8

上面的示例显示了CPU是否具有HT能力,但没有显示是否正在使用HT。最后一种方法有效,但双插槽服务器和虚拟机在Xenserver没有显示物理CPU的地方进行了测试,因为没有任何方法。

我发现这是最简单,最少的代码方式,它也适用于所有测试环境。但要求bc

echo "testing ################################### "

nproc=$(grep -i "processor" /proc/cpuinfo | sort -u | wc -l)

phycore=$(cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l)

if [ -z "$(echo "$phycore *2" | bc | grep $nproc)" ]

then

echo "Does not look like you have HT Enabled"

if [ -z "$( dmidecode -t processor | grep HTT)" ]

 then

echo "HT is also not Possible on this server"

 else

echo "This server is HT Capable,  However it is Disabled"

fi

else

   echo "yay  HT Is working"

fi


echo "testing ################################### "

我相信这将在所有平台上都有效,并会告诉您它的CPU是否支持和启用。可能有点混乱,不过我是脚本编写的初学者。我使用centos XENSERVER vm,Ubuntu和Openfiler(rpath)进行了测试


只需阅读即可大大简化您的脚本/sys/devices/system/cpu/smt/control。另请参见奥斯卡的答案
maxschlepzig,

6

您可以使用此命令检查CPU的HT能力

# grep ht /proc/cpuinfo

您可以使用以下命令列出内核看到的物理和逻辑处理器CPU:

# egrep -i "processor|physical id" /proc/cpuinfo

它在启用单核HT的CPU上提供以下输出:

processor   : 0
physical id : 0
processor   : 1
physical id : 0

您可以像这样读取结果:

processor   : 0 (CPU 0, first logical)
physical id : 0 (CPU 0 is on the first physical)
processor   : 1 (CPU 1, second logical)
physical id : 0 (CPU 1 is on the first physical)
=> It means I have HT enabled

1
这只会告诉您处理器是否支持HT,而不会告诉您实际上是否正在使用HT。处理器具有HT功能但未启用HT的节点仍会ht在CPU标志中通告。
Riccardo Murri 2014年

据我所知,@ RiccardoMurri据我所知,当禁用HT时,/ proc / cpuinfo中不会出现ht标志
Coren 2014年

6
我敢肯定不是。我同时具有启用HT和禁用HT的服务器,并且所有服务器均显示ht标志。
Riccardo Murri 2014年

2
如果您使用的Xeon处理器具有4个内核,它将显示为一个物理ID和四个处理器。因此,您每个物理ID可以有多个处理器,而无需进行超级读取。
Andomar 2014年

2
我有一台2插槽的机器,physical id似乎代表了插槽/芯片。在core id似乎指向同一个物理核心
Heartinpiece

6

这个衬里似乎对我有用(需要root特权):

dmidecode -t processor | grep -E '(Core Count|Thread Count)'

输出为:

Core Count: 2
Thread Count: 4

线程数是核心数的两倍,因此我启用了超线程。

或者,如果您真的想要Perl脚本,请按要求...

perl -e 'print grep(/Core Count/ || /Thread Count/, `dmidecode -t processor`);'

1
我在基于Intel的具有HT的系统上关闭了HT,但是dmidecode返回的线程计数是Core Count的两倍。看起来好像显示了CPU是否支持HT,而不显示是否启用HT。
德米特里·丘巴罗夫

@Dmitri Weird。我只是在禁用超线程的具有HT功能的服务器(具有两个Intel Xeon E5-2670 v3)上运行了该服务器,并且核心和线程数相同。我不确定是什么导致了行为上的差异。我将不得不进一步研究它。
Billyw

我只是在具有两个X5680处理器的Dell R610上运行了此功能,关闭了超线程功能,并且线程数是核心数的两倍。stephaniea的答案(lscpu)似乎有效。我仔细检查了iDRAC(戴尔的灯火通明,带外处理器(对于那些不了解的人)),它说超线程已关闭。所以我认为这dmidecode是不可靠的。
Mike

我检查了Dell 1950(x5460 CPU,没有超线程),lscpu是正确的。也是Dell R620(E5-2690 [v1,我相信]),它是正确的。
Mike

但是@Cedric Martin在上述答案之一中的评论表明,lscpu这并不总是可靠的。我喜欢斯科特布的回答。
Mike S

3
perl -ne'
  $i++ if /^\s*$/;
  push @{$x[$i]}, [/^(.+?) \s*:\s* (.+)/x] if /core|sibling|physical id/; }{
  $r= shift @x; 
  for $i (0..$#$r) {
    $$r[$i][1] .= " ".$$_[$i][1] for @x;
    printf "%-15s: %s\n", @{$$r[$i]};
  }
' /proc/cpuinfo

此结果表明HT已启用,因为siblings数字(12)大于cpu cores(6)

physical id    : 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1
siblings       : 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
core id        : 0 1 2 8 9 10 0 1 2 8 9 10 0 1 2 8 9 10 0 1 2 8 9 10
cpu cores      : 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6

2

如果您阅读/sys/devices/system/cpu/cpu0/topology/thread_siblings_list,它将返回以逗号分隔的CPU 0线程同级列表(即,超线程“核心”)。

例如,在我的2插槽6核Xeon上,启用了超线程,我得到:

cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,12

但是在BIOS中关闭超线程后,我得到:

cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0

假设CPU 0始终可用,然后检查CPU 0的thread_sibling_listprocfs文件中是否有多个节点,或者查找逗号,甚至只是0,都将指示是否启用了超线程。


我会在Perl中回答,但是1)我不了解Perl,2)我认为解决方案是一个非常琐碎的单行代码。


2

在Linux上,这很好用:

$ lscpu -e  
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE  
0   0    0      0    0:0:0:0       yes  
1   0    0      1    1:1:1:0       yes  
2   0    0      2    2:2:2:0       yes  
3   0    0      3    3:3:3:0       yes  
4   0    0      4    4:4:4:0       yes  
5   0    0      5    5:5:5:0       yes  
6   0    0      6    6:6:6:0       yes  
7   0    0      7    7:7:7:0       yes  
8   1    1      8    8:8:8:1       yes  
9   1    1      9    9:9:9:1       yes  
10  1    1      10   10:10:10:1    yes  
11  1    1      11   11:11:11:1    yes  
12  1    1      12   12:12:12:1    yes  
13  1    1      13   13:13:13:1    yes  
14  1    1      14   14:14:14:1    yes  
15  1    1      15   15:15:15:1    yes  
16  0    0      0    0:0:0:0       yes  
17  0    0      1    1:1:1:0       yes   
18  0    0      2    2:2:2:0       yes  
19  0    0      3    3:3:3:0       yes  
20  0    0      4    4:4:4:0       yes  
21  0    0      5    5:5:5:0       yes  
22  0    0      6    6:6:6:0       yes  
23  0    0      7    7:7:7:0       yes  
24  1    1      8    8:8:8:1       yes  
25  1    1      9    9:9:9:1       yes  
26  1    1      10   10:10:10:1    yes  
27  1    1      11   11:11:11:1    yes  
28  1    1      12   12:12:12:1    yes  
29  1    1      13   13:13:13:1    yes  
30  1    1      14   14:14:14:1    yes  
31  1    1      15   15:15:15:1    yes  

在上面的示例中,我们有2个NUMA套接字(SOCKET = 1或2)。我们有16个物理核心(CORE = 0到15)。每个CORE都有一个同级超线程(例如CORE = 0包含CPU 0,16。

我们可以像这样验证超线程:

$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list  
0,16

缓存内存层次结构为:

CPU 0 --> L1D_0|L1I_0 -> L2_0 -> L3_0  
          ^                      ^
CPU 16 ---|                      |     
                                 |         
CPU 1 --> L1D_1|L1I_1 -> L2_1 ---> 
          ^    
CPU 17 ---|   
...    

lscpu -p给出csv格式输出,以便于程序解析。

$ lscpu -p  
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,4,0,0,,4,4,4,0
...

2

这是基于python的方法-如果需要,它还建议了禁用它的方法。

import re    

total_logical_cpus = 0
total_physical_cpus = 0
total_cores = 0

logical_cpus = {}
physical_cpus = {}
cores = {}

hyperthreading = False

for line in open('/proc/cpuinfo').readlines():
    if re.match('processor', line):
        cpu = int(line.split()[2])

        if cpu not in logical_cpus:
            logical_cpus[cpu] = []
            total_logical_cpus += 1

    if re.match('physical id', line):
        phys_id = int(line.split()[3])

        if phys_id not in physical_cpus:
            physical_cpus[phys_id] = []
            total_physical_cpus += 1

    if re.match('core id', line):
        core = int(line.split()[3])

        if core not in cores:
            cores[core] = []
            total_cores += 1

        cores[core].append(cpu)

if (total_cores * total_physical_cpus) * 2 == total_logical_cpus:
    hyperthreading = True

print("  This system has %d physical CPUs" % total_physical_cpus)
print("  This system has %d cores per physical CPU" % total_cores)
print("  This system has %d total cores" % (total_cores * total_physical_cpus))
print("  This system has %d logical CPUs" % total_logical_cpus)

if hyperthreading:
    print("  HT detected, if you want to disable it:")
    print("  Edit your grub config and add 'noht'")
    print("  -OR- disable hyperthreading in the BIOS")
    print("  -OR- try the following to offline those CPUs:")

    for c in cores:
        for p, val in enumerate(cores[c]):
            if p > 0:
                print("    echo 0 > /sys/devices/system/cpu/cpu%d/online" % (val))

禁用超线程的建议不是最优的-禁用超线程的直接方法是echo off > /sys/devices/system/cpu/smt/control(除了在bios中将其关闭)。另请参阅奥斯卡的答案以进行直接检查。
maxschlepzig

1

有很多警告,如果在这里的答案中有很多……答案似乎不是那么明显。lscpu有它的陷阱,适用于任何“计数内核和逻辑处理器,然后比较”的答案。因为您可以使用简单的echo命令关闭逻辑处理器(例如,...这在您依赖于Turbo模式的大型企业环境中可能至关重要)。

这是我的尝试;感谢@scottbb的启发:

printf "HT is "; egrep -q [:punct:] /sys/devices/system/cpu/cpu0/topology/thread_siblings_list && echo on || echo off 

在基于Dell Xeon的计算机上,打开HT时,同级列表包含一个逗号。在我的笔记本电脑上,它包括连字符(i5-3210m处理器)。所以我要标点符号。

有什么想法吗?批评?

请求者要求perl,因此您可以在这里进行:

perl -ane 'chomp; print "Hyperthreading is "; if (/\D/) { print "ON\n" } else { print "OFF\n" }' < /sys/devices/system/cpu/cpu0/topology/thread_siblings_list

我只用它,grep -q [-.]因为它很少键入。FWIW,我检查了几个Xeons / i5 / i7(包括移动版本),但它们中都没有连字符thread_siblings_list。这是不够的只是检查CPU0 -因此,这样的事情会比较稳健:grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list。但是,仅此grep 1 /sys/devices/system/cpu/smt/active -q而已-cf. 奥斯卡的答案
maxschlepzig

1

检查SMT(HT的通用名称,即Intel品牌)是否处于活动状态的最简单方法是:

cat /sys/devices/system/cpu/smt/active

给你0表示不活跃或1表示活跃

您实际上可以在运行时使用以下命令打开或关闭它:

echo [on|off] > /sys/devices/system/cpu/smt/control

Catting /sys/devices/system/cpu/smt/control还可以和产量on|off|forceoff|notsupported|notimplemented
maxschlepzig

0

最好检查一下lscpu,在这里您可以看到“每核线程数:1”,意味着每1核只有一个线程。

    # lscpu
    Architecture:          x86_64
    CPU op-mode(s):        32-bit, 64-bit
    Byte Order:            Little Endian

CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Model name:            Intel(R) Xeon(R) CPU E5-2623 v3 @ 3.00GHz
Stepping:              2
CPU MHz:               1200.000
BogoMIPS:              5992.82
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              10240K
NUMA node0 CPU(s):     0,1,4,5
NUMA node1 CPU(s):     2,3,6,7

0

斯蒂芬妮娅已经提到了lscpu。我想再增加一点。

在我的AMD Epyc处理器上,只要有脱机逻辑核心,就会lscpu显示一条新的附加行,称为Off-line CPU(s) list:

# echo 0 > /sys/devices/system/cpu/cpu9/online
# echo 0 > /sys/devices/system/cpu/cpu16/online
# 
#lscpu
CPU(s):                64
On-line CPU(s) list:   0-8,10-15,17-63
Off-line CPU(s) list:  9,16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.