Jak mohu zkontrolovat, zda je v počítači se systémem Linux povoleno hyperthreading pomocí kontroly skriptem Perl?
Snažím se následujícím způsobem:
dmidecode -t processor | grep HTT
Dejte mi vědět, jestli jsem na správné cestě.
Poznámky přidané 8. července 2014: Jak poukázal Riccardo Murri , moje odpověď níže ukazuje, zda procesor hlásí podporu hyperthreading. Obecně platí, že * nix O/S je nakonfigurován tak, aby povolil hyperthreading, pokud je podporován. Chcete-li to skutečně programově zkontrolovat, podívejte se například na Nilsova odpověď !
---- Původní odpověď z 25. března 2012:
Jste opravdu na správné cestě :) s
dmidecode -t processor | grep HTT
V systému Linux obecně hledám „ht“ na řádku „flags“ /proc/cpuinfo
. Viz například
grep '^flags\b' /proc/cpuinfo | tail -1
nebo pokud chcete do vzoru zahrnout „ht“
grep -o '^flags\b.*: .*\bht\b' /proc/cpuinfo | tail -1
(\b
odpovídá hranicím slova Word a pomáhá vyhýbat se falešným pozitivům v případech, kdy "ht" je součástí jiné vlajky.)
Vždy jsem použil následující a podíval jsem se na téma „Závity na jádro:“.
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
Tato technika však selže, pokud byl jakýkoli logický procesor vypnut pomocí jednoduchého
echo 0 > /sys/devices/system/cpu/cpuX/online
Pokud je počet logických procesorů dvojnásobkem počtu jader, máte HT. Pomocí následujícího skriptu můžete dekódovat / 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"
Výše uvedené příklady ukazují, zda je procesor schopen HT, ale ne, pokud je používán. Poslední metoda funguje, ale ne duální soketové servery a VM testované na Xenserver
, kde nezobrazuje fyzický procesor, protože žádné neexistují.
Zjistil jsem, že to je nejjednodušší a méně kódový způsob, který také pracoval ve všech mých testovacích prostředích. ale vyžaduje 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 ################################### "
Věřím, že to bude fungovat na všech platformách a řekne vám, zda je jeho procesor schopný a zda je povolen. Může být trochu chaotický, ale jsem začátečník ve skriptování. Testoval jsem s centos XENSERVER vm, Ubuntu a Openfiler (rpath)
Zdá se, že tento jeden parník pro mě dělá trik (vyžaduje oprávnění root):
dmidecode -t processor | grep -E '(Core Count|Thread Count)'
Výstup je:
Core Count: 2
Thread Count: 4
Počet vláken je dvojnásobek počtu jádra, proto mám povoleno hyperthreading.
Nebo pokud opravdu chcete svůj skript Perl, jak je požadováno ...
Perl -e 'print grep(/Core Count/ || /Thread Count/, `dmidecode -t processor`);'
Tímto příkazem můžete zkontrolovat HT schopnost CPU
# grep ht /proc/cpuinfo
Fyzický a logický procesor, který viděl Kernel, můžete vypsat pomocí následujícího příkazu:
# egrep -i "processor|physical id" /proc/cpuinfo
Poskytuje tento výstup na jednojádrovém procesoru s podporou HT:
processor : 0
physical id : 0
processor : 1
physical id : 0
Výsledek si můžete přečíst takto:
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
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
Tento výsledek ukazuje, že HT je povoleno, protože číslo siblings
(12) je větší než 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
Pokud čtete /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
, vrátí čárkami oddělený seznam sourozenců vlákna (tj. Hyperthread "jádra") CPU 0.
Například na mém 2-soketovém 6jádrovém Xeonu s povoleným hyperthreadingem dostanu:
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,12
Ale po vypnutí hyperthreadingu v BIOSu dostanu:
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0
Předpokládejme, že CPU 0 bude vždy k dispozici, a poté zkontrolujte CPU 0's thread_sibling_list
procfs soubor pro více než jeden uzel, nebo hledat čárku, nebo jen něco víc než 0
, indikuje, zda je povoleno hyperthreading.
Odpověděl bych v Perlu, ale 1) Neznám Perla a 2) Předpokládám, že řešení je docela triviální jednoplášťové.
Nejjednodušší způsob, jak zkontrolovat, zda je aktivní SMT (obecný pro HT, což je značka Intel), je pouze udělat:
cat /sys/devices/system/cpu/smt/active
dává 0 pro neaktivní nebo 1 pro aktivní
Můžete ji ve skutečnosti za běhu zapnout nebo vypnout pomocí:
echo [on|off] > /sys/devices/system/cpu/smt/control
Zde je přístup založený na python) - v případě potřeby také navrhuje způsoby, jak jej deaktivovat.
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))
Na Linuxu to funguje dobře:
$ 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
Ve výše uvedeném příkladu máme 2 zásuvky NUMA (SOCKET = 1 nebo 2). Máme 16 fyzických jader (CORE = 0 až 15). Každý CORE má sourozenecký hyperthread (například CORE = 0 obsahuje CPU 0,16.
Můžeme ověřit hyperthread takto:
$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,16
Hierarchie mezipaměti je:
CPU 0 --> L1D_0|L1I_0 -> L2_0 -> L3_0
^ ^
CPU 16 ---| |
|
CPU 1 --> L1D_1|L1I_1 -> L2_1 --->
^
CPU 17 ---|
...
lscpu -p poskytuje výstup ve formátu CSV pro snadnou analýzu programu.
$ 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
...
Stephaniea již zmínila lscpu
. Chtěl jsem k tomu přidat ještě něco víc.
Na mém procesoru AMD Epyc, kdykoli existuje logické jádro offline, zobrazí lscpu
nový další řádek s názvem 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
Spousta námitek a co - pokud je v odpovědích zde ... zdá se, že odpověď není tak zřejmá. lscpu
má svá gotcha, která se vztahují na všechny „počet jader a logické procesory, poté porovnejte“ odpověď. Protože můžete logické procesory vypnout jednoduchým příkazem echo (... to by mohlo být kritické ve velkém podnikovém prostředí, kde jste například závislí na režimu turbo).
Tady je můj pokus; díky @scottbb za inspiraci:
printf "HT is "; egrep -q [:punct:] /sys/devices/system/cpu/cpu0/topology/thread_siblings_list && echo on || echo off
Na počítačích se systémem Dell Xeon obsahuje seznam sourozenců čárku, když je zapnutá HT. V mém notebooku obsahuje pomlčku (procesor i5-3210m). Takže jsem na prahu interpunkce.
Myšlenky? Kritiky?
Žadatel požádal o Perla, takže tady máte:
Perl -ane 'chomp; print "Hyperthreading is "; if (/\D/) { print "ON\n" } else { print "OFF\n" }' < /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
a co lscpu. Pak získáte spoustu informací o procesorech, včetně počtu vláken na jádro. Pokud je to 1, multithreading je vypnutý.
lscpu | grep Thread
Vrací -> Závity na jádro: 1
Pokud NENÍ povoleno 1 hyperzávitování.
Lepší kontrolu lscpu, kde vidíte "Závity na jádro: 1", znamená pouze jedno vlákno na 1 jádro.
# 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