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.
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.
Jawaban:
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
( \b
cocok dengan batas kata dan membantu menghindari positif palsu dalam kasus di mana "ht" adalah bagian dari bendera lain.)
lscpu
adalah cara untuk memeriksa.
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
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.
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"
$NUMCORE > $NUMLOG
kita dapat mengatakan bahwa hyperthreading diaktifkan, bukan? Kenyataannya adalah 2 * $NUMCORE = $NUMLOG
, apakah ini selalu benar atau beberapa CPU mungkin memiliki 4x lebih banyak core?
lscpu
tersedia, lscpu
akan memberikan informasi yang sama bersama dengan banyak meta-data tambahan dan output dari lscpu
lebih mudah diurai. tetapi solusi ini berfungsi dan hanya menggunakan /proc/cpuinfo
.
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 Xenserver
tempat 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)
/sys/devices/system/cpu/smt/control
. Lihat juga jawaban Oscar
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
ht
di flag CPU.
physical id
sepertinya mewakili soket / chip. The core id
tampaknya titik inti fisik yang sama
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`);'
dmidecode
itu dapat diandalkan.
lscpu
tidak akan selalu dapat diandalkan. Saya suka jawaban scottbb.
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 siblings
angka (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
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_list
file 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.
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
...
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))
echo off > /sys/devices/system/cpu/smt/control
(selain mematikannya di bios). Lihat juga jawaban Oscar untuk pemeriksaan langsung.
Banyak peringatan dan bagaimana-jika ada dalam jawaban di sini ... sepertinya jawabannya tidak begitu jelas. lscpu
memiliki 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
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 -q
lebih pada intinya - lih. Jawaban Oscar
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
/sys/devices/system/cpu/smt/control
adalah juga mungkin dan hasil on|off|forceoff|notsupported|notimplemented
.
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
Stephaniea telah disebutkan lscpu
. Saya ingin menambahkan sedikit lebih banyak tentang itu.
Pada AMD Epyc Processor saya, setiap kali ada inti logis offline, lscpu
menampilkan 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
dmidecode
kamu harus menjadi root.