Проверка, если HyperThreading включают или нет?

Несколько поздно теперь, но у меня просто была подобная проблема при установке Arch (впервые). Оказывается, что по любой причине, установка пакета создает ядро и изображения initramfs с различными именами от используемых Личинкой. Все остальное, включая UUID, было прекрасно.

Имена файлов по умолчанию, с которыми я закончил, были /vmlinuz-linux (вместо /vmlinuz26) и /initramfs-linux.img (/kernel26.img) - загружающийся с живого CD и изменения /boot/grub/menu.lst для замены ядра и initramfs местоположений позволяют мне загрузиться.

Относительно того, как это произошло во-первых, я предполагаю, что сценарий установки Arch просто не передает выходные имена файлов от установки ядра до создания меню Grub. Это, печально, хотя, и не большое введение, к какой часто разбирается, чтобы быть одним из лучших дистрибутивов.

55
22.03.2017, 02:42
14 ответов

Примечания добавляются 8 июля 2014: Как Riccardo Murri указал, мой ответ только ниже шоу, сообщает ли процессор для поддержки гиперпоточности. Обычно *отклоняют O/S, настроены для включения гиперпоточности, если поддерживается. Однако для фактической проверки этого программно см., например, ответ Nils!

----Исходный ответ с 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" является частью другого флага.)

28
27.01.2020, 19:33
  • 1
    Это только скажет Вам, если процессор будет HT способный, не, если HT на самом деле используется. –  Riccardo Murri 23.04.2014, 21:00
  • 2
    поле HTT не указывает, что процессор на самом деле имеет гиперпоточность в своих ядрах. проверьте значение 'одноуровневых элементов' и 'ядер CPU' в/proc/cpuinfo –  Silver Moon 29.06.2014, 12:05
  • 3
    @Silver-Moon можно ли объяснить? dmidecode читает SMBIOS и должен сказать возможности процессора. Это не говорит, замечается ли гиперпоточность или используется O/S. Но это было уже прокомментировано. См. также ответ Nils –  xebeche 03.07.2014, 22:09
  • 4
    @xebeche в моей системе dmidecode выходные шоу "HTT (Многопоточность)", но мой процессор являются "базовые 2 квадратических Q8400", который не имеет гиперпоточности. проверьте спецификации Intel. –  Silver Moon 04.07.2014, 06:13
  • 5
    +1 Riccardo; у меня есть HT, отключенный на сервере HT-capable, и я вижу, что он печатает "HTT". lscpu путь состоит в том, чтобы проверить. –  sudo 17.03.2017, 09:15

Можно проверить возможность HT ЦП с этой командой

# grep ht /proc/cpuinfo

Можно перечислить физический и logiciel ЦП, замеченный Ядром со следующей командой:

# 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
5
27.01.2020, 19:33
  • 1
    Это только скажет Вам, если процессор будет HT способный, не, если HT на самом деле используется. Узлы, процессор которых является HT-capable, но где HT не, включают, будет все еще рекламировать ht во флагах ЦП. –  Riccardo Murri 23.04.2014, 21:01
  • 2
    я вполне уверен, это не. У меня есть и HT-enabled и серверы HT-disabled, и все они показывают флаг ht. –  Riccardo Murri 25.04.2014, 13:32
  • 3
    , Если у Вас есть процессор Xeon с 4 ядрами, он покажет одним физическим идентификатором и четырьмя процессорами. Таким образом, у Вас может быть несколько процессоров на физический идентификатор без гиперпоточности. –  Andomar 09.11.2014, 13:39
  • 4
    Флаг ht ненадежен по крайней мере в некоторых случаях. Например, мое поле лощины с отчетами Xeon 5150 ht во флагах, но процессоре определенно не поддерживает гиперпоточность. –  BillT 11.02.2015, 19:49
  • 5
    у меня есть 2 машины сокета, и physical id кажется, представляет сокет/микросхему. core id кажется, указывает на то же физическое ядро –  Heartinpiece 08.07.2015, 06:11

Если количество логических процессоров является дважды количеством ядер, у Вас есть 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"
19
27.01.2020, 19:33
  • 1
    Если $NUMCORE > $NUMLOG мы можем сказать, что гиперпоточность включена, правильно? Это факт это было бы 2 * $NUMCORE = $NUMLOG, это всегда верно, или некоторые центральные процессоры могли бы иметь 4x больше ядер? –  Tombart 13.03.2016, 19:24
  • 2
    @Tombart В настоящее время, HT является фактором 2. Я могу предположить, что это могло бы быть больше в будущем. Ядро отмечено как физическое. Количество ядер на сокет может быть получено из одноуровневых элементов. –  Nils 06.05.2016, 00:22
[116119] Вышеприведенные примеры показывают, способен ли процессор к HT, но не способен ли он использоваться. Последний метод работает, но не работает на двухсокетных серверах и ВМ, протестированных на [116486]Xenserver[116487], где не отображается физический процессор, т.к. его нет.

Я нашел это самым простым и менее удобным кодовым способом, который также работает на всех моих тестовых средах. но требует [116488]bc[116489].

Я верю, что это сработает на всех платформах, и скажет, способен ли его процессор, и если он активен. Может быть немного неприятно, но я новичок в скриптинге. Я тестировал с помощью centos XENSERVER vm, Ubuntu и Openfiler (rpath)[116124].

8
27.01.2020, 19:33

Этот вкладыш, кажется, выполняет улочку для меня (требует корневых привилегий):

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

Выход:

Core Count: 2
Thread Count: 4

Количество потоков - это удвоить счетчик Core, поэтому у меня есть гиперторизация.

Или, если вы действительно хотите, чтобы ваш сценарий Perl, как запрашивается ...

perl -e 'print grep(/Core Count/ || /Thread Count/, `dmidecode -t processor`);'
7
27.01.2020, 19:33
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 включен, поскольку братьев и сестер число (12) больше, чем ядер процессора (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
27.01.2020, 19:33

Вот подход на основе Python - он также предлагает способы отключить его, если это необходимо.

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
27.01.2020, 19:33

Я всегда просто использовал следующее и смотрел «Потоки на ядро:».

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
101
27.01.2020, 19:33

Если вы прочитаете / sys / devices / system / cpu / cpu0 / topology / thread_siblings_list , он вернет список, разделенный запятыми. родственных потоков (т.е. «ядер» Hyperthread) ЦП 0.

Например, на моем 2-сокетном 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

Предполагая, что ЦП 0 всегда будет доступен, затем проверяем файл thread_sibling_list procfs ЦП 0 на наличие более чем одного узла, или ищем запятую, или даже что-то большее, чем 0 , будет указывать, включена ли гиперпоточность.


Я бы ответил на Perl, но 1) я не знаю Perl и 2) я предполагаю, что решение является довольно тривиальным однострочным.

3
27.01.2020, 19:33

В 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 содержит ЦП 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
27.01.2020, 19:33

Лучше проверьте lscpu, где вы можете увидеть "Thread(s) per core: 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
27.01.2020, 19:33

Стефания уже упоминала 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
1
27.01.2020, 19:33

Самый простой способ проверить, активен ли SMT (общий для HT, который является просто брендом Intel ), просто выполните:

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

дает вам 0 для неактивного или 1 для активного

Вы можете включить или выключить его во время выполнения с помощью:

echo [on|off] > /sys/devices/system/cpu/smt/control
13
27.01.2020, 19:33
lscpu | grep Thread

Returns -> Thread(s) per core: 1

Если 1 гиперпоточность НЕ включена.

2
27.01.2020, 19:33

Теги

Похожие вопросы