如何使用perl脚本检查Linux机器上是否启用了超线程?
我正在尝试以下方式:
dmidecode -t processor | grep HTT
让我知道我是否走上正轨。
如何使用perl脚本检查Linux机器上是否启用了超线程?
我正在尝试以下方式:
dmidecode -t processor | grep HTT
让我知道我是否走上正轨。
Answers:
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”是另一个标志的一部分的情况下帮助避免误报。)
lscpu
是检查的方法。
我一直只是使用以下内容,并研究了“每个核心的线程:”。
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
echo 0 > /sys/devices/system/cpu/cpu31/online
,现在lscpu报告Thread(s) per core: 1
。不好lscpu
!猜猜我不会再使用这个了。
如果逻辑处理器的数量是内核数量的两倍,则您具有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倍?
lscpu
有空的话,lscpu
将提供相同的信息以及大量额外的元数据,并且lscpu
更容易解析其输出。但是此解决方案确实有效并且仅使用/proc/cpuinfo
。
上面的示例显示了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
。另请参见奥斯卡的答案
您可以使用此命令检查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
ht
在CPU标志中通告。
physical id
似乎代表了插槽/芯片。在core id
似乎指向同一个物理核心
这个衬里似乎对我有用(需要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`);'
dmidecode
是不可靠的。
lscpu
这并不总是可靠的。我喜欢斯科特布的回答。
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
如果您阅读/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_list
procfs文件中是否有多个节点,或者查找逗号,甚至只是0
,都将指示是否启用了超线程。
我会在Perl中回答,但是1)我不了解Perl,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
...
这是基于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中将其关闭)。另请参阅奥斯卡的答案以进行直接检查。
有很多警告,如果在这里的答案中有很多……答案似乎不是那么明显。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. 奥斯卡的答案
检查SMT(HT的通用名称,即Intel品牌)是否处于活动状态的最简单方法是:
cat /sys/devices/system/cpu/smt/active
给你0表示不活跃或1表示活跃
您实际上可以在运行时使用以下命令打开或关闭它:
echo [on|off] > /sys/devices/system/cpu/smt/control
最好检查一下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
dmidecode
你必须是根。