Memeriksa apakah HyperThreading diaktifkan atau tidak?

51

Bagaimana saya bisa memeriksa apakah hyperthreading diaktifkan pada mesin Linux, menggunakan skrip perl untuk memeriksanya?

Saya mencoba cara berikut:

dmidecode -t processor | grep HTT

Beri tahu saya jika saya berada di jalur yang benar.

doubledecker
sumber
2
karena dmidecodekamu harus menjadi root.
Nils
5
Saya suka bagaimana semua orang mengabaikan "perl script" bit ;-)
SamB
Ini harus menjadi jawaban yang diterima: unix.stackexchange.com/a/522295/1131
maxschlepzig

Jawaban:

27

Catatan ditambahkan pada 8 Juli 2014: Seperti yang ditunjukkan Riccardo Murri , jawaban saya di bawah ini hanya menunjukkan apakah prosesor melaporkan untuk mendukung hyperthreading. Secara umum, * nix O / S dikonfigurasikan untuk memungkinkan pembentukan Hyperhreading jika didukung. Namun, untuk benar-benar memeriksa program ini, lihat misalnya jawaban Nils !

---- Jawaban asli dari 25 Maret 2012:

Anda memang berada di jalur yang benar :) dengan

dmidecode -t processor | grep HTT

Di Linux, saya biasanya hanya mencari "ht" pada baris "flags" /proc/cpuinfo. Lihat misalnya

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

atau jika Anda ingin memasukkan "ht" dalam pola

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

( \bcocok dengan batas kata dan membantu menghindari positif palsu dalam kasus di mana "ht" adalah bagian dari bendera lain.)

xebeche
sumber
19
Ini hanya akan memberi tahu Anda jika prosesor ini mampu, bukan jika HT benar-benar digunakan.
Riccardo Murri
3
bidang HTT tidak menunjukkan bahwa prosesor sebenarnya mengalami hyperthreading di intinya. periksa nilai 'saudara kandung' dan 'cpu core' di / proc / cpuinfo
Silver Moon
@ Silver-Moon Bisakah Anda menjelaskan? dmidecode membaca SMBIOS dan harus memberitahukan kemampuan prosesor. Itu tidak memberi tahu apakah hyper-threading terlihat atau digunakan oleh O / S. Tapi ini sudah dikomentari. Lihat juga jawaban Nils
xebeche
1
@ xebeche pada output sistem dmidecode saya menunjukkan "HTT (Multi-threading)" tetapi prosesor saya adalah "core 2 quad Q8400" yang tidak memiliki hyperthreading. periksa spesifikasi intel.
Silver Moon
1
+1 untuk Riccardo; Saya memiliki HT yang dinonaktifkan pada server berkemampuan HT, dan saya melihatnya mencetak "HTT". lscpuadalah cara untuk memeriksa.
sudo
96

Saya selalu menggunakan yang berikut ini dan melihat 'Utas per inti:'.

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

Catatan, bagaimanapun, teknik ini akan gagal jika ada prosesor logis telah dimatikan dengan sederhana

echo 0 > /sys/devices/system/cpu/cpuX/online
stephaniea
sumber
4
Ini adalah jawaban terbaik. Ini tidak memerlukan pembacaan daun teh, banyak informasi bermanfaat, dan tidak ada grepping yang diperlukan.
MrMas
11
OMG Anda menggunakan perintah shell untuk mendapatkan jawaban Anda ?! Itu sangat tua-sekolah- -1 untuk itu. Bagaimana dengan skrip Python yang bagus ??? Anda hanya perlu satu sore untuk menulis. Karena itu bukan Python, -1 lain. Tapi +3 untuk singkatnya.
Mike S
@ Mike S banyak sarkasme tapi ... Output dari lscpu tidak benar ketika, katakanlah, hanya 1 core hyper-threaded turun pada CPU 4 core (yang merupakan skenario yang sepenuhnya valid). Karena dengan begitu ia akan melaporkan "Utas per inti: 1" meskipun 3 inti sebenarnya adalah HyperShread (total 7 utas).
Cedric Martin
@Cedric Martin yang Anda perhatikan. :-) ... Oooo! Tangkapan yang bagus ... Saya berhasil! Mengambil mesin 8-core ganda (Dell R620 / E5-2667 v2 CPU) ... itu melaporkan 32 CPU ... Dilakukan echo 0 > /sys/devices/system/cpu/cpu31/online, sekarang lscpu melaporkan Thread(s) per core: 1. Buruk lscpu! Kira saya tidak akan menggunakan ini lagi.
Mike S
3
@ Mike S Anda masih dapat menggunakan lscpu , tapi tidak hanya itu, kurasa. Menggunakan, katakanlah, "lscpu -e -a" dengan benar mendaftar setiap utas dan memberi tahu apakah ini aktif atau tidak. Hanya saja "Utas per inti" tidak masuk akal ketika Anda dapat mengaktifkan / menonaktifkan utas secara berbeda pada setiap inti.
Cedric Martin
18

Jika jumlah prosesor logis adalah dua kali jumlah inti yang Anda miliki HT. Gunakan skrip berikut untuk mendekode / 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"
Nils
sumber
Jika $NUMCORE > $NUMLOGkita dapat mengatakan bahwa hyperthreading diaktifkan, bukan? Kenyataannya adalah 2 * $NUMCORE = $NUMLOG, apakah ini selalu benar atau beberapa CPU mungkin memiliki 4x lebih banyak core?
Tombart
@ Combart Saat ini HT adalah faktor 2. Saya bisa membayangkan bahwa mungkin lebih di masa depan. Inti dicatat sebagai fisik. Jumlah inti per soket dapat berasal dari saudara kandung.
Nils
Jika sudah lscputersedia, lscpuakan memberikan informasi yang sama bersama dengan banyak meta-data tambahan dan output dari lscpulebih mudah diurai. tetapi solusi ini berfungsi dan hanya menggunakan /proc/cpuinfo.
Trevor Boyd Smith
8

Contoh di atas menunjukkan apakah CPU mampu HT, tetapi tidak jika sedang digunakan. Metode terakhir berfungsi tetapi tidak ada dua server soket dan VM yang diuji di Xenservertempat yang tidak menampilkan CPU Fisik, karena tidak ada satupun.

Saya menemukan ini sebagai cara kode yang paling mudah dan kurang, yang juga bekerja pada semua lingkungan pengujian saya. tetapi membutuhkan 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 ################################### "

Saya percaya ini akan bekerja pada semua platform, dan akan memberi tahu Anda apakah CPU-nya mampu, dan jika diaktifkan. Mungkin sedikit berantakan, saya pemula dalam scripting. Saya menguji dengan centos XENSERVER vm, Ubuntu, dan Openfiler (rpath)

pengguna63814
sumber
Skrip Anda dapat disederhanakan dengan hanya membaca /sys/devices/system/cpu/smt/control. Lihat juga jawaban Oscar
maxschlepzig
6

Anda dapat memeriksa kemampuan HT CPU dengan perintah ini

# grep ht /proc/cpuinfo

Anda dapat mendaftar CPU fisik dan logikaiel yang dilihat oleh Kernel dengan perintah berikut:

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

Ini memberikan output ini pada CPU single-core yang diaktifkan HT:

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

Anda dapat membaca hasilnya seperti ini:

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
Coren
sumber
1
Ini hanya akan memberi tahu Anda jika prosesor ini mampu, bukan jika HT benar-benar digunakan. Node yang prosesornya berkemampuan HT tetapi di mana HT tidak diaktifkan masih akan beriklan htdi flag CPU.
Riccardo Murri
@RiccardoMurri Sejauh yang saya tahu, ketika HT dinonaktifkan, flag ht tidak muncul di / proc / cpuinfo
Coren
6
Saya cukup yakin tidak. Saya memiliki kedua server yang mendukung HT dan yang dinonaktifkan, dan semuanya menunjukkan bendera ht.
Riccardo Murri
2
Jika Anda memiliki prosesor Xeon dengan 4 core, itu akan ditampilkan sebagai satu id fisik dan empat prosesor. Jadi, Anda dapat memiliki beberapa prosesor per id fisik tanpa hyperhtreading.
Andomar
2
Saya punya mesin 2 soket, dan physical idsepertinya mewakili soket / chip. The core idtampaknya titik inti fisik yang sama
Heartinpiece
6

Liner satu ini sepertinya melakukan trik untuk saya (membutuhkan hak akses root):

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

Outputnya adalah:

Core Count: 2
Thread Count: 4

Jumlah thread dua kali lipat dari jumlah inti, oleh karena itu saya telah mengaktifkan hiphreading.

Atau jika Anda benar-benar ingin skrip perl Anda, seperti yang diminta ...

perl -e 'print grep(/Core Count/ || /Thread Count/, `dmidecode -t processor`);'
billyw
sumber
1
Saya memiliki HT yang dimatikan pada sistem HT yang mampu berbasis Intel, namun Thread Count yang dikembalikan dengan dmidecode adalah dua kali Core Count. Sepertinya itu menunjukkan apakah CPU mampu, bukan jika HT diaktifkan atau tidak.
Dmitri Chubarov
@ Dmitri Aneh. Saya baru saja menjalankan ini pada server berkemampuan HT (memiliki dua Intel Xeon E5-2670 v3) dengan hyperthreading dinonaktifkan, dan jumlah inti dan utasnya sama. Saya tidak yakin apa yang akan menyebabkan perbedaan perilaku. Saya harus melihat lebih jauh ke dalamnya.
billyw
Saya hanya menjalankan ini pada Dell R610 dengan dua prosesor X5680, Hyperthreading off, dan jumlah Thread dua kali lipat jumlah inti. Jawaban stephaniea (lscpu) tampaknya berhasil. Saya telah dua kali memeriksa iDRAC (Dell padam, dari prosesor band [untuk mereka yang tidak tahu]) dan mengatakan bahwa Hyperthreading tidak aktif. Jadi saya tidak berpikir dmidecodeitu dapat diandalkan.
Mike S
Saya memeriksa Dell 1950 (CPU x5460, tidak ada hyphreading mungkin) dan lscpu benar. Juga Dell R620 (E5-2690 [v1, saya percaya]) dan itu benar.
Mike S
Tetapi komentar @Cedric Martin dalam salah satu jawaban di atas menunjukkan bahwa lscputidak akan selalu dapat diandalkan. Saya suka jawaban scottbb.
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

Hasil ini menunjukkan bahwa HT diaktifkan karena siblingsangka (12) lebih besar dari 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
mpapec
sumber
2

Jika Anda membaca /sys/devices/system/cpu/cpu0/topology/thread_siblings_list, itu akan mengembalikan daftar koma yang dipisahkan oleh saudara kandung (mis. Hyperthread "core") dari CPU 0.

Sebagai contoh, pada 2-socket 6-core Xeon saya, dengan hyperthreading diaktifkan saya mendapatkan:

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

Tapi setelah mematikan hyperthreading di BIOS, saya mendapatkan:

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

Dengan anggapan bahwa CPU 0 akan selalu tersedia, maka memeriksa thread_sibling_listfile procfs CPU 0 untuk lebih dari satu node, atau mencari koma, atau bahkan lebih dari apa pun 0, akan menunjukkan apakah hiphreading diaktifkan.


Saya akan menjawab dalam Perl, tetapi 1) Saya tidak tahu Perl, dan 2) Saya menganggap solusinya adalah satu-liner yang sangat sepele.

scottbb
sumber
2

Di Linux ini berfungsi dengan baik:

$ 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  

Dalam contoh di atas, kami memiliki 2 soket NUMA (SOCKET = 1 atau 2). Kami memiliki 16 inti fisik (INTI = 0 hingga 15). Setiap CORE memiliki saudara kembar (misalnya CORE = 0 berisi CPU 0,16.

Kami dapat memverifikasi hipertensi seperti:

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

Hirarki memori cache adalah:

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

lscpu -p memberikan output format csv untuk penguraian program yang mudah.

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

Berikut ini adalah pendekatan berbasis python - ini juga menyarankan cara untuk menonaktifkannya jika diperlukan.

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))
Neil McGill
sumber
Saran untuk menonaktifkan hyperthreading adalah kurang optimal - cara langsung untuk menonaktifkan hyperthreading adalah echo off > /sys/devices/system/cpu/smt/control(selain mematikannya di bios). Lihat juga jawaban Oscar untuk pemeriksaan langsung.
maxschlepzig
1

Banyak peringatan dan bagaimana-jika ada dalam jawaban di sini ... sepertinya jawabannya tidak begitu jelas. lscpumemiliki gotcha-nya, yang berlaku untuk setiap jawaban "hitung inti dan prosesor logis, lalu bandingkan". Karena Anda dapat mematikan prosesor logis dengan perintah gema sederhana (... ini bisa sangat penting di lingkungan perusahaan besar di mana Anda bergantung pada mode turbo, misalnya).

Inilah usaha saya; terima kasih kepada @scottbb untuk inspirasinya:

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

Pada mesin berbasis Dell Xeon saya, daftar saudara termasuk koma ketika HT aktif. Di laptop saya, ini termasuk tanda hubung (prosesor i5-3210m). Jadi saya mencari tanda baca.

Pikiran? Kritik?

Peminta meminta perl, jadi di sini Anda pergi:

perl -ane 'chomp; print "Hyperthreading is "; if (/\D/) { print "ON\n" } else { print "OFF\n" }' < /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
Mike S
sumber
Saya hanya akan menggunakan grep -q [-.]karena ini kurang untuk mengetik. FWIW, saya telah memeriksa beberapa Xeon / i5 / i7 (termasuk varian ponsel) dan tidak ada yang memiliki tanda hubung di thread_siblings_list. Hal ini tidak cukup untuk hanya cek cpu0 - dengan demikian, sesuatu seperti ini akan menjadi lebih kuat: grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list. Namun, hanya grep 1 /sys/devices/system/cpu/smt/active -qlebih pada intinya - lih. Jawaban Oscar
maxschlepzig
1

Cara termudah untuk memeriksa apakah SMT (generik untuk HT, yang hanya Intel branding) aktif lakukan:

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

memberi Anda 0 untuk tidak aktif atau 1 untuk aktif

Anda dapat menyalakan atau mematikannya saat runtime dengan:

echo [on|off] > /sys/devices/system/cpu/smt/control
Oscar Tiderman
sumber
Catting /sys/devices/system/cpu/smt/controladalah juga mungkin dan hasil on|off|forceoff|notsupported|notimplemented.
maxschlepzig
0

Lebih baik Anda memeriksa lscpu, di mana Anda dapat melihat "Utas per inti: 1", berarti hanya satu utas per 1 inti.

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

Stephaniea telah disebutkan lscpu. Saya ingin menambahkan sedikit lebih banyak tentang itu.

Pada AMD Epyc Processor saya, setiap kali ada inti logis offline, lscpumenampilkan baris tambahan baru yang disebutOff-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
talekeDskobeDa
sumber