HyperThreading'in etkin olup olmadığını kontrol etme


51

Hyperthreading'in Linux makinesinde etkin olup olmadığını nasıl kontrol edebilirim, bunu kontrol etmek için bir perl betiği kullanarak nasıl yapabilirim?

Aşağıdaki şekilde çalışıyorum:

dmidecode -t processor | grep HTT

Doğru yoldaysam haberim olsun.


2
çünkü dmidecodesenin kök olmalısın.
Nils

5
Herkesin "perl betiği" bitini nasıl görmezden geldiğini
beğendim

Bu kabul edilen cevap olmalıdır: unix.stackexchange.com/a/522295/1131
maxschlepzig

Yanıtlar:


27

8 Temmuz 2014'te eklenmiş notlar : Riccardo Murri'nin belirttiği gibi , aşağıdaki cevabım yalnızca işlemcinin hiper-iş parçacığını destekleyip desteklemediğini bildiriyor. Genel olarak, * nix O / S, destekleniyorsa köprü izlemeyi etkinleştirmek için yapılandırılmıştır. Ancak, bunu gerçekten programlı olarak kontrol etmek için örneğin Nils'in cevabını görün !

---- 25.03.2012 tarihli orijinal cevap:

Sen gerçekten doğru yoldasın :) ile

dmidecode -t processor | grep HTT

Linux'ta, genellikle sadece "bayrak" satırında "ht" yi ararım /proc/cpuinfo. Örneğin bakın

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

veya desene "ht" eklemek istiyorsanız

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

( \bSınır kelimesiyle eşleşir ve "ht" nin başka bir bayrağın parçası olduğu durumlarda yanlış pozitiflerden kaçınmaya yardımcı olur.)


19
Bu, yalnızca işlemcinin HT özelliğine sahip olup olmadığını, HT gerçekten kullanılıyorsa söyleyecektir.
Riccardo Murri

3
HTT alanı, işlemcinin gerçekte çekirdeklerinde aşırı ilerleme olduğunu göstermez. / proc / cpuinfo içindeki 'kardeşler' ve 'cpu çekirdeği' değerlerini kontrol edin
Silver Moon

@ Silver-Moon Açıklayabilir misiniz? dmidecode, SMBIOS'u okur ve işlemcinin yeteneklerini anlatmalıdır. Hiper iş parçacılığının O / S tarafından görüldüğünü veya kullanıldığını söylemez. Ancak bu zaten yorum yapıldı. Ayrıca bakınız Nils answer
xebeche

1
Sistemimdeki @xebeche dmidecode çıktısı "HTT (Çoklu İş parçacığı)" gösteriyor, ancak işlemcim hiper iş parçacığı olmayan "çekirdek 2 dörtlü Q8400". intel özelliklerini kontrol edin.
Silver Moon,

1
+1 ila Riccardo; HT özellikli bir sunucuda HT'yi devre dışı bıraktım ve "HTT" yazdırdığını görüyorum. lscpukontrol yoludur.
sudo

96

Her zaman sadece aşağıdakileri kullandım ve 'Çekirdek başına iş parçacığı:' bölümüne baktım.

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

Bununla birlikte, herhangi bir mantıksal işlemci basit bir şekilde kapatılmışsa bu tekniğin başarısız olacağını unutmayın.

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

4
Bu, henüz en iyi cevap. Çay yapraklarının okumasını, pek çok yararlı bilgiyi ve hiçbir tıkırtı gerektirmez.
MrMas

11
OMG cevabını almak için bir kabuk komutunu kullandın ?! Bunun için çok eski okul - -1. Peki ya güzel bir Python betiği ??? Yazman sadece bir öğleden sonra olur. Python olmadığından, bir başka -1. Ancak kısalık için +3.
Mike S

@Mike S bolca alaycı ama ... lscpu'nun çıktısı, 4 çekirdekli bir işlemcide (tamamen geçerli bir senaryo olan) yalnızca 1 hiper iş parçacıklı çekirdeğin kapalı olması durumunda doğru değildir. Çünkü o zaman 3 çekirdeğin aslında hiper iş parçacığı olmasına rağmen (toplamda 7 iş parçacığı) "Çekirdek başına iş parçacığı : 1" yazacak.
Cedric Martin

@Cedric Martin farkettiniz. :-) ... Oooo! İyi yakala ... Yaptım! Çift çekirdekli 8 çekirdekli bir makine aldı (Dell R620 / E5-2667 v2 CPU) ... 32 işlemciyi rapor ediyor ... Gerçekleştirildi echo 0 > /sys/devices/system/cpu/cpu31/online, şimdi lscpu raporları Thread(s) per core: 1. Kötü lscpu! Sanırım bunu daha fazla kullanmayacağım.
Mike S

3
@Mike S Hala lscpu kullanabilirsiniz , ancak sanırım bu satırı değil. Diyelim ki, kullanma "lscpu -e -a" doğru her iş parçacığı listelemek ve aktif olup olmadığını söyler. Sadece , her bir çekirdek üzerinde farklı konuları açıp kapatabildiğiniz zaman "Çekirdek başına iş parçacığı" çok mantıklı gelmez.
Cedric Martin

18

Mantıksal işlemcilerin sayısı iki katıysa, HT'nizin çekirdek sayısı. / Proc / cpuinfo kodunu çözmek için aşağıdaki komut dosyasını kullanın :

#!/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"

Eğer $NUMCORE > $NUMLOGbiz hyperthreading doğru, etkin olduğunu söyleyebiliriz? Öyle olacağı 2 * $NUMCORE = $NUMLOG, bu her zaman doğru mu yoksa bazı CPU'larda 4x çekirdek var mı?
Tombart

@Tombart Şu anda HT faktör 2'dir. Gelecekte daha fazla olabileceğini hayal edebiliyorum. Bir çekirdek fiziksel olarak not edilir. Soket başına düşen çekirdek sayısı kardeşlerden elde edilebilir.
Nils,

Elinizde lscpuvarsa, lscpuaynı bilgileri birçok ek meta-veri ile birlikte lscpusunacak ve çıktısı daha kolay ayrıştırılabilir olacaktır. ama bu çözüm işe yarıyor ve sadece kullanıyor /proc/cpuinfo.
Trevor Boyd Smith

8

Yukarıdaki örnekler CPU'nun HT yeteneğine sahip olup olmadığını ancak kullanılmakta olup olmadığını gösterir. Son yöntem çalışır ancak hiçbiri olmadığı için çift soketli sunucular ve VM'ler XenserverFiziksel İşlemci göstermediği yerde test edilir .

Bunu, tüm test ortamlarımda da çalışan en kolay ve daha az kodlu yol olarak buldum. ama gerektirir 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 ################################### "

Bunun tüm platformlarda çalışacağına ve işlemcisinin yetenekli olup olmadığını ve etkin olup olmadığını size söyleyeceğime inanıyorum. Biraz dağınık olabilir, ancak komut dosyası yazmaya yeni başlıyorum. Centos XENSERVER vm, Ubuntu ve Openfiler (rpath) ile test ettim


Senaryo, sadece okuyarak çok basitleştirilebilir /sys/devices/system/cpu/smt/control. Ayrıca bakınız Oscar'ın cevabı
maxschlepzig

6

CPU'nun HT özelliğini bu komutla kontrol edebilirsiniz.

# grep ht /proc/cpuinfo

Çekirdek tarafından görülen fiziksel ve mantıksal CPU'yu aşağıdaki komutla listeleyebilirsiniz:

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

Bu çıkışı tek çekirdekli HT özellikli bir CPU'da verir:

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

Bu sonucu şöyle okuyabilirsiniz:

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
Bu, yalnızca işlemcinin HT özelliğine sahip olup olmadığını, HT gerçekten kullanılıyorsa söyleyecektir. İşlemcisi HT özellikli ancak HT'nin etkin olmadığı düğümler ht, CPU bayraklarında hala reklam verecek .
Riccardo Murri

@RiccardoMurri Bildiğim kadarıyla, HT devre dışı bırakıldığında, ht bayrağı görünmüyor / proc / cpuinfo
Coren

6
Emin olmadığından eminim. Hem HT etkin hem de HT devre dışı sunuculara sahibim ve hepsi de ht bayrağını gösteriyor.
Riccardo Murri

2
4 çekirdekli bir Xeon işlemciniz varsa, bir fiziksel kimlik ve dört işlemci olarak gösterilecektir. Böylece, fiziksel kimlik başına birden çok işlemciye ihtiyaç duymadan birden fazla işlemciniz olabilir.
Andomar

2
2 soket makinem var physical idve soketi / yongayı temsil ediyor gibi görünüyor. core idAynı fiziksel çekirdek işaret edecek gibi görünüyor
Heartinpiece

6

Bu bir liner benim için hile yapıyor gibi görünüyor (kök ayrıcalıkları gerektirir):

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

Çıktı:

Core Count: 2
Thread Count: 4

Diş sayısı çekirdek sayısının iki katıdır, bu yüzden hiper-diş açmayı etkinleştirdim.

Veya perl betiğinizi gerçekten istiyorsanız, istediğiniz gibi ...

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

1
HT’yi Intel tabanlı HT özellikli bir sistemde kapattım, ancak dmidecode ile döndürülen Thread Sayısı, Core Count’in iki katı. CPU etkin olup olmadığını, HT etkin olup olmadığını gösterir gibi görünüyor.
Dmitri Chubarov,

@Dmitri Weird. Bunu HT-yetenekli bir sunucuda (iki tane Intel Xeon E5-2670 v3'e sahip) hiper iş parçacığı devre dışı bırakılmış olarak çalıştırdım ve çekirdek ve iş parçacığı sayısı aynıydı. Davranıştaki farklılığa neyin sebep olacağından emin değilim. Daha fazla araştırmam gerekecek.
billyw

Bunu sadece iki X5680 işlemcili bir Dell R610'da yaptım, Hyperthreading ve Thread sayısı çekirdek sayımın iki katı. stephaniea'nın cevabı (lscpu) işe yarıyor. İDRAC’i (Dell’in ışıklandırması, bant dışı işlemciden (bilmeyenler için)) denetledim ve Hyperthreading’in kapalı olduğunu söylüyor. Bu yüzden dmidecodegüvenilir olduğunu sanmıyorum .
Mike S,

Bir Dell 1950'yi (x5460 CPU'lar, köprü taraması mümkün değil) kontrol ettim ve lscpu doğruydu. Ayrıca bir Dell R620 (E5-2690 [v1, inanıyorum]) ve doğru oldu.
Mike S,

Fakat @Cedric Martin 'in yukarıdaki cevaplardan birindeki yorumu lscpuher zaman güvenilir olmayacağını gösteriyor . Scottbb'in cevabını seviyorum.
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

Bu sonuç, HT'nin siblings(12) cpu cores(6) büyük olduğundan , etkin olduğunu gösterir.

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

Eğer okursanız /sys/devices/system/cpu/cpu0/topology/thread_siblings_list, bu CPU 0 iplik kardeşlerine (yani Hyperthread "çekirdekler") bir virgülle ayrılmış listesini döndürecektir.

Örneğin, 2 soketli 6 çekirdekli Xeon'umda, hyperthreading etkinken alıyorum:

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

Ancak BIOS'ta hiper-tıkanmayı kapattıktan sonra alıyorum:

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

CPU 0'ın her zaman kullanılabilir olacağını thread_sibling_listvarsayalım , ardından CPU 0'ın procfs dosyasını birden fazla düğüm için kontrol etmek ya da virgül aramak, hatta 0hiper işin etkin olup olmadığını gösterecektir.


Perl'de cevap verirdim, ama 1) Perl'i tanımıyorum ve 2) Çözümün oldukça önemsiz bir tek gömlek olduğunu kabul ediyorum.


2

Linux'ta bu iyi çalışıyor:

$ 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  

Yukarıdaki örnekte 2 NUMA soketimiz var (SOCKET = 1 veya 2). 16 fiziksel çekirdeğimiz var (CORE = 0 - 15). Her bir CORE'un kardeş köprülü köprüsü vardır (Örneğin CORE = 0 CPU 0,16 içerir.

Hiper-yayını şu şekilde doğrulayabiliriz:

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

Önbellek bellek hiyerarşisi:

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

lscpu -p, kolay program ayrıştırma için csv formatında çıktı verir.

$ 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

İşte python tabanlı bir yaklaşım - aynı zamanda gerekirse devre dışı bırakmanın yollarını da önerir.

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

Hiper-dişi devre dışı bırakmak için öneri alt-optimal - hiper-dişi devre dışı bırakmanın doğrudan yolu echo off > /sys/devices/system/cpu/smt/control(bunun bioslarda kapatılması dışında). Doğrudan bir kontrol için ayrıca Oscar'ın cevabına bakınız .
maxschlepzig

1

Çok fazla uyarı var ve cevapların içinde ne varsa ... cevabı çok açık değil gibi görünüyor. lscpu"Çekirdekleri ve mantıksal işlemcileri say, sonra karşılaştır" cevabını uygulayan gotcha'sı vardır. Çünkü mantıksal işlemcileri basit bir yankı komutuyla kapatabilirsiniz (... örneğin turbo moduna bağlı olduğunuz büyük bir kurumsal ortamda kritik olabilir).

İşte benim denemem; ilham için @scottbb sayesinde:

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

Dell Xeon tabanlı makinelerimde kardeş listesinde HT açıkken virgül var. Dizüstü bilgisayarımda kısa çizgi (i5-3210m işlemci) var. Bu yüzden noktalama işaretlerini hazırlıyorum.

Düşünceler? Eleştirileri?

Talep eden Perl'i istedi, işte buradasın:

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

Sadece yazmak için grep -q [-.]daha az olduğu gibi kullanırdım . FWIW, birkaç Xeons / i5 / i7'yi kontrol ettim (mobil değişkenler dahil) ve hiçbirinde thread_siblings_list. Sadece cpu0 kontrol etmek yeterli değildir - bu nedenle, böyle bir şey daha sağlam olacaktır: grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list. Ancak, sadece bir grep 1 /sys/devices/system/cpu/smt/active -qnoktaya daha da fazladır - cf. Oscar'ın cevabı
maxschlepzig

1

SMT'nin (yalnızca Intel markalaması olan HT için jenerik) etkin olup olmadığını kontrol etmenin en kolay yolu sadece şunu yapın:

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

size aktif değil 0, aktif 1 verir

Aslında çalışma zamanında aşağıdakileri açıp kapatabilirsiniz:

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

Catting /sys/devices/system/cpu/smt/contrololduğu da mümkündür ve verimleri on|off|forceoff|notsupported|notimplemented.
maxschlepzig

0

"Çekirdek başına iş parçacığı: 1" i görebileceğiniz lscpu'yu kontrol etmeniz daha iyi olur, 1 çekirdek için yalnızca bir iş parçacığı anlamına gelir.

    # 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

Stephaniea zaten bahsetti lscpu. Buna biraz daha eklemek istedim.

AMD Epyc İşlemcimde, ne zaman çevrimdışı bir mantıksal çekirdek varsa, lscpuadında yeni bir ek satır görüntüler.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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.