it-swarm-eu.dev

Kontrola, zda je funkce HyperThreading povolena nebo ne?

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ě.

57
doubledecker

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.)

28
xebeche

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
106
stephaniea

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"
19
Nils

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)

9
user63814

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`);'
7
billyw

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
5
Coren
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
4
mpapec

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é.

3
scottbb

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
3
Oscar Tiderman

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))
2
Neil McGill

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
...
2
edW

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
1
talekeDskobeDa

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
1
Mike S

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ý.

0
Martijn
lscpu | grep Thread

Vrací -> Závity na jádro: 1

Pokud NENÍ povoleno 1 hyperzávitování.

0
mannoj

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
0
Gineesh