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.
linux
cpu
hyperthreading
doubledecker
sumber
sumber
dmidecode
kamu harus menjadi root.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
Di Linux, saya biasanya hanya mencari "ht" pada baris "flags"
/proc/cpuinfo
. Lihat misalnyaatau jika Anda ingin memasukkan "ht" dalam pola
(
\b
cocok dengan batas kata dan membantu menghindari positif palsu dalam kasus di mana "ht" adalah bagian dari bendera lain.)sumber
lscpu
adalah cara untuk memeriksa.Saya selalu menggunakan yang berikut ini dan melihat 'Utas per inti:'.
Catatan, bagaimanapun, teknik ini akan gagal jika ada prosesor logis telah dimatikan dengan sederhana
sumber
echo 0 > /sys/devices/system/cpu/cpu31/online
, sekarang lscpu melaporkanThread(s) per core: 1
. Buruklscpu
! 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 :
sumber
$NUMCORE > $NUMLOG
kita dapat mengatakan bahwa hyperthreading diaktifkan, bukan? Kenyataannya adalah2 * $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 darilscpu
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
.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)
sumber
/sys/devices/system/cpu/smt/control
. Lihat juga jawaban OscarAnda dapat memeriksa kemampuan HT CPU dengan perintah ini
Anda dapat mendaftar CPU fisik dan logikaiel yang dilihat oleh Kernel dengan perintah berikut:
Ini memberikan output ini pada CPU single-core yang diaktifkan HT:
Anda dapat membaca hasilnya seperti ini:
sumber
ht
di flag CPU.physical id
sepertinya mewakili soket / chip. Thecore id
tampaknya titik inti fisik yang samaLiner satu ini sepertinya melakukan trik untuk saya (membutuhkan hak akses root):
Outputnya adalah:
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 ...
sumber
dmidecode
itu dapat diandalkan.lscpu
tidak akan selalu dapat diandalkan. Saya suka jawaban scottbb.Hasil ini menunjukkan bahwa HT diaktifkan karena
siblings
angka (12) lebih besar daricpu cores
(6)sumber
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:
Tapi setelah mematikan hyperthreading di BIOS, saya mendapatkan:
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 pun0
, 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.
sumber
Di Linux ini berfungsi dengan baik:
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:
Hirarki memori cache adalah:
lscpu -p memberikan output format csv untuk penguraian program yang mudah.
sumber
Berikut ini adalah pendekatan berbasis python - ini juga menyarankan cara untuk menonaktifkannya jika diperlukan.
sumber
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:
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:
sumber
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 dithread_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, hanyagrep 1 /sys/devices/system/cpu/smt/active -q
lebih pada intinya - lih. Jawaban OscarCara termudah untuk memeriksa apakah SMT (generik untuk HT, yang hanya Intel branding) aktif lakukan:
memberi Anda 0 untuk tidak aktif atau 1 untuk aktif
Anda dapat menyalakan atau mematikannya saat runtime dengan:
sumber
/sys/devices/system/cpu/smt/control
adalah juga mungkin dan hasilon|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.
sumber
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:
sumber