Як я можу перевірити, чи ввімкнено гіперточення на машині Linux, використовуючи сценарій perl для перевірки його?
Я намагаюся наступним чином:
dmidecode -t processor | grep HTT
Дайте мені знати, чи я на правильному шляху.
Як я можу перевірити, чи ввімкнено гіперточення на машині Linux, використовуючи сценарій perl для перевірки його?
Я намагаюся наступним чином:
dmidecode -t processor | grep HTT
Дайте мені знати, чи я на правильному шляху.
Відповіді:
Примітки, додані 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" є частиною іншого прапора.)
lscpu
це спосіб перевірити.
Я завжди просто використовував таке і переглядав "Нитка (и) на ядро:".
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
echo 0 > /sys/devices/system/cpu/cpu31/online
, тепер lscpu звітує Thread(s) per core: 1
. Погано lscpu
! Здогадайтесь, я більше не буду користуватися цим.
Якщо кількість логічних процесорів удвічі перевищує число ядер, у яких є 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 рази більше ядер?
lscpu
доступ, lscpu
надаватиме ту саму інформацію разом із великою кількістю зайвих метаданих, а вихід із lscpu
них легше піддається аналізу. але це рішення працює і використовує лише /proc/cpuinfo
.
Наведені вище приклади показують, чи може процесор здатний використовувати 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
. Дивіться також відповідь Оскара
Ви можете перевірити 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
ht
у прапорцях CPU.
physical id
здається, представляє сокет / чіп. core id
, Здається, вказують на те ж фізичне ядро
Цей один лайнер, здається, робить для мене хитрість (вимагає привілеїв 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`);'
dmidecode
надійним.
lscpu
не завжди буде надійним. Мені подобається відповідь Скоттбба.
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
Якщо ви прочитаєте /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) Я припускаю, що рішення є досить тривіальним однолінійним.
У 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
...
Ось підхід на основі пітона - він також пропонує способи відключити його за потреби.
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
(крім того, щоб вимкнути його у біосах). Дивіться також відповідь Оскара для прямої перевірки.
Багато застережень і що - якщо є у відповідях тут ... здається, відповідь не така очевидна. 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
ще більше до речі - пор. Відповідь Оскара
Найпростіший спосіб перевірити, чи активний SMT (загальний для HT, який є лише брендингом Intel):
cat /sys/devices/system/cpu/smt/active
дає 0 для неактивних або 1 для активних
Ви можете ввімкнути або вимкнути його під час виконання за допомогою:
echo [on|off] > /sys/devices/system/cpu/smt/control
/sys/devices/system/cpu/smt/control
це також можливо і виходи on|off|forceoff|notsupported|notimplemented
.
Краще перевірте 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
Стефанія вже згадувала 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
dmidecode
ти повинен бути корінцем.