如何使用 perl 脚本检查 Linux 计算机上是否启用了超线程?
我正在尝试以下方法:
dmidecode -t processor | grep HTT
让我知道我是否走在正确的轨道上。
答案1
我一直只使用以下内容并查看“每个核心的线程:”。
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
答案2
2014 年 7 月 8 日添加的注释:作为里卡多·穆里指出,我下面的回答仅显示处理器是否报告支持超线程。一般来说,*nix 操作系统配置为启用超线程(如果支持)。然而,要实际以编程方式检查这一点,请参见例如尼尔斯的回答!
---- 2012年3月25日原始回答:
你确实走在正确的道路上:)
dmidecode -t processor | grep HTT
在 Linux 上,我通常只是在 的“flags”行上查找“ht” /proc/cpuinfo
。参见例如
grep '^flags\b' /proc/cpuinfo | tail -1
或者如果您想在模式中包含“ht”
grep -o '^flags\b.*: .*\bht\b' /proc/cpuinfo | tail -1
(\b
匹配单词边界,并有助于避免在“ht”是另一个标志的一部分的情况下出现误报。)
答案3
如果逻辑处理器的数量是 HT 核心数量的两倍。使用以下脚本进行解码/proc/cpu信息:
#!/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"
答案4
如果您阅读/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)我认为解决方案是一个非常简单的单行代码。