Перевірка, чи включена HyperThreading чи ні?


51

Як я можу перевірити, чи ввімкнено гіперточення на машині Linux, використовуючи сценарій perl для перевірки його?

Я намагаюся наступним чином:

dmidecode -t processor | grep HTT

Дайте мені знати, чи я на правильному шляху.


2
бо dmidecodeти повинен бути корінцем.
Нілс

5
Мені подобається, як усі ігнорували біт "perl script" ;-)
SamB

Це має бути прийнята відповідь: unix.stackexchange.com/a/522295/1131
maxschlepzig

Відповіді:


27

Примітки, додані 8 липня 2014 року: Як зазначав Ріккардо Муррі , моя відповідь нижче лише показує, чи повідомляє процесор підтримку гіперточення. Як правило, * nix O / S налаштовані так, щоб активувати гіперточення, якщо вони підтримуються. Однак, щоб насправді перевірити це програмно, подивіться, наприклад , відповідь Нілса !

---- Оригінальна відповідь від 25 березня 2012 року:

Ви справді на правильному шляху :) с

dmidecode -t processor | grep HTT

В Linux я зазвичай просто шукаю "ht" у рядку "прапори" /proc/cpuinfo. Дивіться, наприклад

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

або якщо ви хочете включити "ht" в шаблон

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

( \bвідповідає межі слова та допомагає уникнути помилкових позитивних результатів у випадках, коли "ht" є частиною іншого прапора.)


19
Це скаже лише вам, чи підтримує процесор HT, а не те, чи реально використовується HT.
Ріккардо Муррі

3
поле HTT не вказує на те, що процесор насправді має гіперточування в своїх ядрах. перевірити значення 'братів і сестер' та 'процесорних ядер' в / proc / cpuinfo
Silver Moon

@ Silver-Moon Ви можете пояснити? dmidecode зчитує SMBIOS і повинен розповісти про можливості процесора. Це не вказує, чи бачить або використовує O / S гіпер-різьблення. Але це вже прокоментували. Дивіться також відповідь Нільса
xebeche

1
@xebeche на моїй системі dmidecode вихід показує "HTT (Multi-Thading)", але мій процесор "core 2 quad Q8400", який не має гіперточок. перевірити технічні характеристики Intel.
Срібний Місяць

1
+1 до Рікардо; У мене відключений HT на сервері, що підтримує HT, і я бачу, що він друкує "HTT". lscpuце спосіб перевірити.
судо

96

Я завжди просто використовував таке і переглядав "Нитка (и) на ядро:".

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

4
Це найкраща відповідь поки. Він не вимагає читання чайних листів, багато корисної інформації та не потрібно поздоровлення.
MrMas

11
OMG, ти використовував команду shell, щоб отримати відповідь ?! Це так старо-школа - -1 для цього. Що з приємним сценарієм Python ??? Лише у вас піде південь. Оскільки це не Python, ще -1. Але +3 для стислості.
Майк S

@Mike S багато сарказму, але ... Вихід lscpu невірний, коли, скажімо, лише 1 гіперпотокове ядро на 4-ядерному ЦП (що є цілком коректним сценарієм). Тому що тоді він повідомляє "Нитка (и) на ядро: 1", хоча 3 ядра насправді гіперточені (7 ниток).
Седрік Мартін

@Cedric Martin ви помітили. :-) ... Оооо! Гарний улов ... Я це зробив! Взяв подвійну 8-ядерну машину (процесор Dell R620 / E5-2667 v2) ... він повідомляє 32 процесора ... Виконується echo 0 > /sys/devices/system/cpu/cpu31/online, тепер lscpu звітує Thread(s) per core: 1. Погано lscpu! Здогадайтесь, я більше не буду користуватися цим.
Майк S

3
@Mike S Ви все ще можете використовувати lscpu , але тільки не той рядок, я думаю. Використовуючи, скажімо, "lscpu -e -a" правильно перелічити кожен потік і вказати, чи він активний чи ні. Просто "Нитка (и) на ядро" не має особливого сенсу, коли ви можете вмикати / відключати потоки по-різному на кожному ядрі.
Седрік Мартін

18

Якщо кількість логічних процесорів удвічі перевищує число ядер, у яких є HT. Використовуйте наступний скрипт для декодування / 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"

Якщо $NUMCORE > $NUMLOGможна сказати, що ввімкнено гіперточення, правда? Це насправді було б 2 * $NUMCORE = $NUMLOG, це завжди правда чи деякі процесори можуть мати в 4 рази більше ядер?
Томбарт

@Tombart В даний час HT є фактором 2. Я можу собі уявити, що в майбутньому це може бути більше. Ядро відзначається як фізичне. Кількість ядер на розетку може бути отримано з побратимів.
Нілс

Якщо у вас є lscpuдоступ, lscpuнадаватиме ту саму інформацію разом із великою кількістю зайвих метаданих, а вихід із lscpuних легше піддається аналізу. але це рішення працює і використовує лише /proc/cpuinfo.
Тревор Бойд Сміт

8

Наведені вище приклади показують, чи може процесор здатний використовувати HT, але ні, якщо він використовується. Останній метод працює, але не сервери з двома сокетами та VM, перевірені Xenserverтам, де він не відображає фізичний процесор, оскільки таких немає.

Я вважав, що це найпростіший і менш кодовий спосіб, який також працював у всіх моїх тестових середовищах. але вимагає 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 ################################### "

Я вірю, що це буде працювати на всіх платформах, і підкаже, чи здатний його процесор і чи він включений. Може бути трохи безладним, хоча я початківець в сценарії. Я тестував у centos XENSERVER vm, Ubuntu та Openfiler (rpath)


Ваш сценарій можна значно спростити, просто прочитавши /sys/devices/system/cpu/smt/control. Дивіться також відповідь Оскара
maxschlepzig

6

Ви можете перевірити HT-здатність ЦП за допомогою цієї команди

# grep ht /proc/cpuinfo

Ви можете перерахувати фізичний та логічний процесор, який бачив Kernel, за допомогою наступної команди:

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

Це дає цей вихід на одноядерний процесор, що підтримує HT:

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

Ви можете прочитати результат так:

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
Це скаже лише вам, чи підтримує процесор HT, а не те, чи реально використовується HT. Вузли, процесор яких підтримує HT, але там, де HT не ввімкнено, все ще рекламуватимуться htу прапорцях CPU.
Ріккардо Муррі

@RiccardoMurri Наскільки мені відомо, коли HT відключений, ht-прапор не з’являється в / proc / cpuinfo
Coren

6
Я майже впевнений, що це не так. У мене є сервери з підтримкою HT і HT-інвалідів, і всі вони показують ht-прапор.
Ріккардо Муррі

2
Якщо у вас процесор Xeon з 4 ядрами, він відображатиметься як один фізичний ідентифікатор і чотири процесори. Таким чином, ви можете мати кілька процесорів на фізичний ідентифікатор без гіпертрейдингу.
Андомар

2
У мене є 2 розеткові машини, і, physical idздається, представляє сокет / чіп. core id, Здається, вказують на те ж фізичне ядро
Heartinpiece

6

Цей один лайнер, здається, робить для мене хитрість (вимагає привілеїв root):

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

Вихід:

Core Count: 2
Thread Count: 4

Кількість ниток удвічі більша за кількість ядер, тому у мене ввімкнено гіперточення.

Або якщо ви дійсно хочете, щоб ваш сценарій Perl, як вимагали ...

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

1
У мене HT вимкнуто на базі Intel, що підтримує технологію HT, але кількість потоків, повернута з dmidecode, є вдвічі більшою. Виглядає так, як це показує, чи підтримує процесор HT, а не HT ввімкнено чи ні.
Дмитро Чубаров

@Dmitri Weird. Я щойно запускав це на сервері, що підтримує HT (має два Intel Xeon E5-2670 v3), з вимкненою гіперточкою, і кількість ядер і потоків були однаковими. Я не впевнений, що може спричинити різницю в поведінці. Мені доведеться заглянути далі.
billyw

Я щойно запустив це на Dell R610 з двома процесорами X5680, Hyperthreading вимкнено, а кількість ниток удвічі більша. відповідь Стефанії (lscpu), здається, працює. Я двічі перевірив iDRAC (вимкнення Dell, поза діапазоном процесора [для тих, хто не знає]), і він говорить, що Hyperthreading вимкнено. Тому я не вважаю dmidecodeнадійним.
Майк S

Я перевірив Dell 1950 (x5460 процесорів, не можлива гіперпереробка) і lscpu був правильним. Також Dell R620 (E5-2690 [v1, я вважаю]), і це було правильно.
Майк S

Але коментар @Cedric Martin в одній з вищезазначених відповідей показує, що lscpuне завжди буде надійним. Мені подобається відповідь Скоттбба.
Майк 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

Цей результат вказує на те, що HT увімкнено, оскільки siblingsчисло (12) більше 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

2

Якщо ви прочитаєте /sys/devices/system/cpu/cpu0/topology/thread_siblings_list, він поверне розділений комою список побратимів (тобто "ядер" Hyperthread) CPU 0.

Наприклад, на моєму 6-ядерному 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 завжди буде доступний, то перевірка thread_sibling_listфайлу procfs CPU 0 для більш ніж одного вузла, або пошук коми, або навіть що-небудь більше 0, буде вказувати, чи включена гіперточка.


Я відповів би на Perl, але 1) Я не знаю Perl, і 2) Я припускаю, що рішення є досить тривіальним однолінійним.


2

У Linux це добре працює:

$ 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  

У наведеному вище прикладі ми маємо 2 розетки NUMA (SOCKET = 1 або 2). У нас є 16 фізичних ядер (CORE = 0 до 15). Кожна CORE має гіпертотику рідних братів (наприклад, CORE = 0 містить CPU 0,16.

Ми можемо перевірити гіпертотик так:

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

Ієрархія пам'яті кеша:

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

lscpu -p дає вихід формату CSV для легкого розбору програм.

$ 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

Ось підхід на основі пітона - він також пропонує способи відключити його за потреби.

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

Пропозиція щодо відключення гіпертрейдування є неоптимальною - прямий спосіб відключення гіпертредування є echo off > /sys/devices/system/cpu/smt/control(крім того, щоб вимкнути його у біосах). Дивіться також відповідь Оскара для прямої перевірки.
maxschlepzig

1

Багато застережень і що - якщо є у відповідях тут ... здається, відповідь не така очевидна. lscpuмає свої gotcha, які застосовуються до будь-якої відповіді "підрахунок ядер та логічних процесорів, а потім порівняти". Оскільки ви можете вимкнути логічні процесори за допомогою простої команди echo (... це може бути критично важливим у великому корпоративному середовищі, де ви залежите, наприклад, від турборежиму).

Ось моя спроба; дякую @scottbb за натхнення:

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

На моїх машинах, що базуються на Dell Xeon, список братів і сестер включає кому, коли HT увімкнено. На моєму ноутбуці він включає дефіс (процесор i5-3210m). Тож я переживаю розділові знаки.

Думки? Критики?

Запитувач запитав perl, тож ось вам:

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

Я б просто використовувати, grep -q [-.]оскільки це менше набирати. FWIW, я перевірив декілька Xeons / i5 / i7 (включаючи мобільні варіанти), і жоден з них не має дефісу в thread_siblings_list. Мало просто перевірити cpu0 - таким чином, що - щось на зразок цього було б більш надійним: grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list. Однак просто a grep 1 /sys/devices/system/cpu/smt/active -qще більше до речі - пор. Відповідь Оскара
maxschlepzig

1

Найпростіший спосіб перевірити, чи активний SMT (загальний для HT, який є лише брендингом Intel):

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

дає 0 для неактивних або 1 для активних

Ви можете ввімкнути або вимкнути його під час виконання за допомогою:

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

Catting /sys/devices/system/cpu/smt/controlце також можливо і виходи on|off|forceoff|notsupported|notimplemented.
maxschlepzig

0

Краще перевірте lscpu, де ви бачите "Нитка (и) на ядро: 1", означає лише один потік на 1 ядро.

    # 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

Стефанія вже згадувала lscpu. Я хотів додати ще трохи до цього.

У моєму процесорі AMD Epyc, коли є логічне ядро ​​офлайн, lscpuвідображається нова додаткова лінія, яка називається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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.