Ubuntu'da hiper iş parçacığını devre dışı bırak


15

Ubuntu 16.04 sunucusunu çalıştırıyorum. Lscpu komutunu kullandığımda hype iş parçacığının etkinleştirildiğini görebiliyorum.

Devre dışı bırakmak istiyorum. Ubuntu forumlarından geçtim ve burada ve burada .

Bunlar hiper iş parçacığının neden iyi olamayabileceği konusunda iyi tartışmalardır. Ama nasıl kapatılacağı konusunda kesin bir çözüm yok.

Hiper iş parçacığını devre dışı bırakma adımları verilebilir mi? Teşekkürler .


3
BIOS'ta devre dışı bırakmayı denediniz mi?
edwinksl

evet, HT için bir seçenek bulunamadı
john

Yanıtlar:


9

Giriş

Bu ilginç bir soru. Muhtemelen aylar içinde şahsen benim için en ilginç olanlardan biri. OP gibi eski BIOS'umda Hyper Threading'i devre dışı bırakma seçeneği yok (2012, güncellenmiş 2016 ya da benzeri icat edildi).

Intel Skylake ve Kaby Lake'teki Hiper iş parçacıkları hataları:

Intel Skylake veya Kaby Lake işlemcilerini kullanan herkes , birkaç ay önce ortaya çıkan Hyper Threading hakkındaki hata raporlarını okumalıdır. Bu UK Register öyküsü, Debian Developers'ın Hyper Threading'in makineyi nasıl çöktüğünü ve makineyi nasıl bozabileceğini nasıl tespit ettiğini anlatıyor.

Ask Ubuntu'da geçen yıl bildirilen Skylake ile ilgili çok sayıda sorun var ve biri Hyper Threading hatalarının neden olduğu sorunların nasıl ayırt edileceğini merak ediyor.

Bu cevap üç bölüme ayrılmıştır:

  • Hyper-Threading açık / kapalı olduğunda CPU'ların görüntülenmesi
  • Hiper iş parçacığı açma / kapama işlemini otomatikleştirmek için Bash komut dosyası
  • Hiper Diş Açma başlamadan önce kapatılırsa Conky Çöküyor

Hyper-Threading açık / kapalı olduğunda CPU'ların görüntülenmesi

Aşağıda hiper iş parçacığı kapalı ve bir CPU stres testi yapıldığında CPU kullanımını görebilirsiniz. Yaklaşık 10 saniye sonra aynı kod hiper iş parçacığı açıkken tekrarlanır. Son olarak 10 saniye sonra komut dosyası hiper iş parçacığı tekrar kapatılarak çalıştırılır:

Hiper Diş Açma Noht'unu Ayarla

Ekran iki bölüme ayrılmıştır:

  • Komut dosyasını set-hyper-threading0 (kapalı) ve sonra 1 (açık) parametresiyle çağıran terminal penceresinin sol yarısında .
  • Sağ tarafta conkyCPUS 1 ila 8'in CPU yüzdesi kullanımı görüntülenir.

İlk komut dosyasını çalıştıran Hyper Threading kapalı

Betik ilk çalıştırıldığında CPU Numaraları 2, 4, 6 ve 8 (Conky'ye göre)% 3,% 2,% 2 ve% 2'de dondurulur. CPU Testi 1, 3, 5 ve 7, stres testi yapılırken% 100'e yükselir.

CPU topolojisi hiper iş parçacığı kapalı olarak görüntülenir ve yalnızca dört çekirdek bildirilir:

/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3

İkinci komut dosyası çalıştırıldığında Hyper Threading açık

Komut dosyası ikinci kez çalıştırıldığında Hyper-Threading açık ve stres testi yürütülürken tüm CPU Numaraları 1-8% 100'e çıkıyor.

CPU topolojisi hiper iş parçacığı açıkken görüntülenir ve yalnızca dört çekirdek artı ve dört sanal çekirdek bildirilir:

/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu1/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu3/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu5/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3
/sys/devices/system/cpu/cpu7/topology/core_id:3

Üçüncü komut dosyası çalıştırma Hyper Threading kapalı

İkinci komut dosyası bittikten sonra CPU 2, 4, 6 ve 8'in nasıl% 4,% 2,% 3,% 4'te boşta çalıştığına dikkat edin. Bu önemlidir, çünkü üçüncü testte Hyper-Threading devre dışı bırakıldığında ilk testten% 4,% 2,% 2 ve% 2 yerine% 4,% 2,% 3,% 4 oranında dondurulmuş CPU yüzdeleri gösterilir.

Bu nedenle hiper iş parçacığının kapatılması, sanal CPU'ları mevcut durumda donduruyor gibi görünüyor.

Ayrıca Hyper-Threading'i açıp kapatırsanız da komut dosyasının hala "Hyper Threading Supported" mesajını görüntülediğini unutmayın.


Hiper iş parçacığı açma / kapama işlemini otomatikleştirmek için Bash komut dosyası

Aşağıdaki komut dosyasını görüntülerken, Conky'nin CPU'ları 1'den 8'e kadar saydığını, Linux'un CPU'ları 0'dan 7'ye kadar saydığını unutmayın.

#!/bin/bash

# NAME: set-hyper-threading
# PATH: /usr/local/bin
# DESC: Turn Hyper threading off or on.

# DATE: Aug. 5, 2017.

# NOTE: Written Part of testing for Ubuntu answer:
#       /ubuntu/942728/disable-hyper-threading-in-ubuntu/942843#942843

# PARM: 1="0" turn off hyper threading, "1" turn it on.

if [[ $# -ne 1 ]]; then
    echo 'One argument required. 0 to turn off hyper-threading or'
    echo '1 to turn hyper-threading back on'
    exit 1
fi

echo $1 > /sys/devices/system/cpu/cpu1/online
echo $1 > /sys/devices/system/cpu/cpu3/online
echo $1 > /sys/devices/system/cpu/cpu5/online
echo $1 > /sys/devices/system/cpu/cpu7/online

grep "" /sys/devices/system/cpu/cpu*/topology/core_id

grep -q '^flags.*[[:space:]]ht[[:space:]]' /proc/cpuinfo && \
    echo "Hyper-threading is supported"

grep -E 'model|stepping' /proc/cpuinfo | sort -u

stress --cpu 8 --io 1 --vm 1 --vm-bytes 128M --timeout 10s

NOT: Program stress, Ubuntu'nun bir türevi olan tüm Debian sistemlerinde yerleşiktir. Bu nedenle, bu komut dosyasını Ubuntu'da çalıştırmak için herhangi bir paket indirip yüklemenize gerek yoktur.

Çift çekirdekli bir CPU'nuz varsa #, 5 ve 7 numaralı CPU'ları kontrol eden hatları kaldırmanız (veya yorum yapmanız) gerekir .

CPU topolojisini gösteren bash hattı için Hi-Angel'a teşekkür ederiz grep "" /sys/devices/system/cpu/cpu*/topology/core_id.


Hiper Diş Açma başlamadan önce kapatılırsa Conky Çöküyor

CPU'ları 2, 4, 6, 8 en düşük kullanım oranına getirmek için önyükleme sırasında Hyper-Threading'i kapatmayı denedim. Bunu yapmak için bu komut dosyasını kullandım:

# NAME: /etc/cron.d/turn-off-hyper-threading
# DATE: Auguust 5, 1017
# DESC: This turns off CPU 1, 3, 5 & 7
# NOTE: Part of testing for Ubuntu answer:
#       /ubuntu/942728/disable-hyper-threading-in-ubuntu/942843#942843
# BUGS: Conky crashes with Segmentation Fault when CPU 2,4,6 & 8 (as conky calls them)
#       are off-line.
#
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu1/online
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu3/online
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu5/online
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu7/online

Ancak conky, hiper iş parçacığı başlatıldığında kapatılırsa bir segmentasyon hatası ile çöker. Bu yüzden @rebootsenaryodaki dört satırı yorumlamak zorunda kaldım .

CPU yüzde kullanımını ve yük faktörünü görüntülemek için Conky Code

Conky'de benzer bir ekran ayarlamak istiyorsanız, ilgili kod snippet'i:

${color orange}${voffset 2}${hr 1}
${color2}${voffset 5}Intel® i-7 3630QM 3.4 GHz: ${color1}@  ${color green}${freq} MHz   
${color}${goto 13}CPU 1 ${goto 81}${color green}${cpu cpu1}% ${goto 131}${color3}${cpubar cpu1 18}
${color}${goto 13}CPU 2 ${goto 81}${color green}${cpu cpu2}% ${goto 131}${color3}${cpubar cpu2 18}
${color}${goto 13}CPU 3 ${goto 81}${color green}${cpu cpu3}% ${goto 131}${color3}${cpubar cpu3 18}
${color}${goto 13}CPU 4 ${goto 81}${color green}${cpu cpu4}% ${goto 131}${color3}${cpubar cpu4 18}
${color}${goto 13}CPU 5 ${goto 81}${color green}${cpu cpu5}% ${goto 131}${color3}${cpubar cpu5 18}
${color}${goto 13}CPU 6 ${goto 81}${color green}${cpu cpu6}% ${goto 131}${color3}${cpubar cpu6 18}
${color}${goto 13}CPU 7 ${goto 81}${color green}${cpu cpu7}% ${goto 131}${color3}${cpubar cpu7 18}
${color}${goto 13}CPU 8 ${goto 81}${color green}${cpu cpu8}% ${goto 131}${color3}${cpubar cpu8 18}
${color1}All CPU ${color green}${cpu}% ${goto 131}${color1}Temp: ${color green}${hwmon 2 temp 1}°C ${goto 250}${color1}Up: ${color green}$uptime
${color green}$running_processes ${color1}running of ${color green}$processes ${color1}loaded processes.
Load Avg. 1-5-15 minutes: ${alignr}${color green}${execpi .001 (awk '{printf "%s/", $1}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", $2}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", $3}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4}
${color1}NVIDIA  ${color}-GPU ${color green}${nvidia gpufreq} Mhz  ${color}-Memory ${color green}${nvidia memfreq} Mhz
${color1}GT650M ${color}-Temp ${color green}${nvidia temp}°C  ${color}-Threshold ${color green}${nvidia threshold}°C
${color orange}${voffset 2}${hr 1}

NOT: Nvidia GPU henüz Ubuntu altında çalışmadığından yukarıdaki Nvidia kodu hiç test edilmedi. Herhangi bir yıl yakında :)


1
Üzgünüm, ama nohtyok. Hatta zaman zaman sahip olduğum linux-4.13-rc1 kaynakları sayesinde bu seçeneği tercih ettim. Ancak sizi neyin şaşırtabileceğini kesinlikle anlıyorum: dat bugreport , seçeneğin işe yaramadığından şikayet ediyor ve sonra nextreleasesanki bir şeyi düzeltmiş gibi kapatılıyor . Ancak yorumları okursanız, tek kullanımının noht, seçenek için çekirdek komut satırını kontrol eden ve /sys/dosya sistemi yoluyla çekirdekleri devre dışı bırakan el yapımı bir komut dosyası için olduğunu görürsünüz . IOW nohtişe yaramaz.
Hi-Angel

@ Hi-Angel Gerekli olmadığını belirttiğin için teşekkürler. Onsuz test yaptım ve çevrimdışı çekirdekler% 2,2,5,5'ten (noht ile)% 5,5,10,10'a (noht olmadan) iki katına çıktı. Bu gece daha fazla test yapacağım. Çekirdek parametre belgelerini aradım ve herhangi bir referans bulamadım noht.
WinEunuuchs2Unix

Yan notta, indeksleme için Makine / İnsan dili yoktur :) 0, 1'den veya hatta belirli bir sayıdan (MiniZinc'te olduğu gibi) başlayan endekslerle karışıklığı çözmek için, dizin setleri açısından düşünmek daha iyidir , yani bir indeks kümesinden başka bir kümeye sapma. Uzaklaştırmak, indeksleri temsil etmeyen bir veri ile ilgili bazılarının, biraz döndürüldükten sonra indeksleme için kullanılabileceği zaman daha kolay not almanızı sağlar. Avantaj, bir bellek düzeninden ve diğer sınırlamalardan bağımsız bir kavramın akılda tutulmasıdır.
Hi-Angel

@ Hi-Angel "Başlangıç ​​Pozisyonu" ile "Ofset" arasında benzer karşılaştırma Sanırım. Her neyse, bu cevabı test ve kodlamanın son iki gününe göre yeniden yazmak üzereyim, böylece yorumlarımız yakında eski olacak ...
WinEunuuchs2Unix

6

Son çekirdekler maxcpus çekirdek parametresini destekler .

Bu, cpus sayısını fiziksel çekirdek sayısına ayarlamanıza izin verir. Bu , Intel CPU'lardaki MDS güvenlik açıklarının neden olduğu tehditleri aileden 6 azaltmaya yardımcı olmak için yararlı olabilir .

Nasıl:

sudo (root) ayrıcalıkları ile favori metin düzenleyicinizle açık / etc / default / grub.

GRUB_CMDLINE_LINUX_DEFAULT = ile başlayan satırı bulun

ve ortak sessiz sıçrama parametreleri gibi mevcut çekirdek parametrelerine maxcpus = n ekleyin (burada n = CPU'nuzun sahip olduğu fiziksel çekirdek sayısı.

Örneğin, hiper iş parçacıklı güvenilir Intel (R) Core (TM) i3-3220 CPU @ 3.30GHz çift çekirdekli sistemimde , önyükleme sırasında hiper iş parçacığı kapatmak için maxcpus = 2 ekledim .

Dosyayı kaydedin ve komutu verin sudo update-grubve yeniden başlatın.

Aşağıdaki lscpu | grep "per core"gibi çıktılar vermesi gereken komutu vererek başarıyı doğrulayabilirsiniz :

Thread(s) per core: 1

Çekirdek 4.4.0'da test edildi

Kaynaklar:

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/kernel-parameters.txt

https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html

/unix/145645/disabling-cpu-cores-on-quad-core-processor-on-linux


1
İlginç bağlantılar. Paylaşım için teşekkürler.
WinEunuuchs2Unix

@ WinEunuuchs2Unix Benim için bir zevkti. Her zaman yardım etmeye istekli!
Elder Geek

5

Linux'ta köprü oluşturmayı kök olarak veya süper kullanıcı ayrıcalıklarıyla devre dışı bırakabilirsiniz:

# echo off > /sys/devices/system/cpu/smt/control

Geçerli hiper iş parçacığı durumunu aşağıdakilerle görüntüleyebilirsiniz :

$ cat /sys/devices/system/cpu/smt/control

Bu komut şunlardan birini yazdırır:

on|off|forceoff|notsupported|notimplemented

Alternatif olarak, çoğu BIOS yazılımı ayrıca hiper iş parçacığını devre dışı bırakmak için bir seçenek içerir. BIOS'ta devre dışı bırakılırsa, yukarıdaki kedi muhtemelen geri döner forceoff.


Eğer denediniz bu açılışta devre dışı hiper iş parçacığı için?
Elder Geek

1
@ElderGeek hayır, maxcpus=hiper iş parçacığını devre dışı bırakmak için çekirdek parametresini denemedim . Temelde hiper iş parçacıklarıyla etkileşimi hakkında resmi bir belge bulamadığım için. Belirtirseniz hiper iş parçacığı özelliğini her zaman devre dışı bırakmanız garanti edilir maxcpus=#real_coresmi? Veya bazı sistemlerde HT'nin etkin olduğu gerçek çekirdeklerin yarısı ile sonuçlanabilir misiniz? Ayrıca, bir maxcpus=ayar farklı çekirdek sayılarına sahip makineler arasında taşınabilir değildir. Bu parametrenin farklı makineler için varyasyonlarını korumak sıkıcı ve hataya açık olacaktır.
maxschlepzig

Eğer maxcpus = # real_cores size çıkışını güvendiğinizi elbette sağlanan belirtirseniz Benim durumumda her zaman engelli hyperthreading sahiptir lscpu | grep "per core"Çekirdek parametrenizi flip tarafında ise taşınabilirlik konusunda vaild noktayı bir kez görev zahmetli çok görünmüyor bana göre.
Elder Geek

2

İşte ht çekirdeğini tanımlayan ve çevrimiçi / çevrimdışı değiştiren bir betik.

#!/bin/bash
typeset -i core_id
typeset -i sibling_id
typeset -i state

for i in /sys/devices/system/cpu/cpu[0-9]*; do
  core_id="${i##*cpu}"
  sibling_id="-1"

  if [ -f ${i}/topology/thread_siblings_list ]; then
    sibling_id="$(cut -d',' -f1 ${i}/topology/thread_siblings_list)"
  fi

  if [ $core_id -ne $sibling_id ]; then
    state="$(<${i}/online)"
    echo -n "$((1-state))" > "${i}/online"
    echo "switched ${i}/online to $((1-state))"
  fi
done

@ WinEunuuchs2Unix , belki bunu mükemmel cevabınıza ekleyebilirsiniz.


Düzgün çalışması için listeyi sayısal olarak sıralamak zorunda kaldım:for i in $(find /sys/devices/system/cpu/cpu[0-9]* -maxdepth 0 -type d |sort -V); do
neuhaus

2

İçindeki maxcpus=nparametre GRUB_CMDLINE_LINUX_DEFAULT=düzgün çalışmıyor. Beni 4 çekirdek 4 iplik yerine 2 çekirdek ve 4 iplik bıraktı.

Bir çözüm buldum.

Ekle mitigations=auto,nosmtiçin GRUB_CMDLINE_LINUX_DEFAULT=yerine

Linux 4.4.0 ile Ubuntu 16.04 LTS üzerinde test edildi.

Kaynak: https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/MDS


1

Core_id çoğaltıldığı için anakartın birden fazla CPU soketi barındırdığı sistemler için hiper-dişli çiftler için çekirdeğe biraz daha sağlam bir şekilde bakmak gerekir. İşte iki 8 çekirdekli Xeon yongalı bir sistemdeki sürümüm (Ubuntu 16.04'ten örnek):

$ cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list \
> | sort --unique --numeric-sort
0,16
1,17
2,18
3,19
4,20
5,21
6,22
7,23
8,24
9,25
10,26
11,27
12,28
13,29
14,30
15,31

Çeşitli amaçlar için, dosyalara bakmak da isteyebilirsiniz

/sys/devices/system/cpu/present
/sys/devices/system/cpu/online
/sys/devices/system/cpu/offline

0

Tartışmaları okuduysanız, muhtemelen devre dışı bırakmanın makul olmadığını biliyorsunuz, bu yüzden bunu öğrenme amacıyla istediğinizi varsayacağım.

HT fikri, her fiziksel çekirdek (sanal çekirdekler olarak adlandırılır) için birden fazla CPU kaydı kümesine sahip olmaktır . "Daha iyi" bir sanal çekirdek yok, özdeş. Bu bilgiyle donanmış, her fiziksel olan için bir tane hariç sanal çekirdekleri devre dışı bırakabilirsiniz.

İlk olarak hangi sanal çekirdek çiftinin /sys/dosya sistemindeki hangi fiziksel çekirdeğe ait olduğunu bilmek istersiniz . Bunun için core_iddosyayı kullanabilirsiniz :

λ grep "" /sys/devices/system/cpu/cpu*/topology/core_id
/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu1/topology/core_id:2
/sys/devices/system/cpu/cpu2/topology/core_id:0
/sys/devices/system/cpu/cpu3/topology/core_id:2

Çıktıdan cpu0 + cpu2'nin bir fiziksel çekirdekte ve cpu1 + cpu3'ün diğerinde bulunduğunu çıkarabilirsiniz. Şimdi ayrıcalıkları yükseltin ve echoher çiftte birini devre dışı bırakmak için komutu kullanın:

λ sudo -s
# echo 0 > /sys/devices/system/cpu/cpu1/online
# echo 0 > /sys/devices/system/cpu/cpu2/online

Cpu0'ın "çevrimiçi" dosyaya sahip olmadığını ve devre dışı bırakılamayacağını unutmayın, bunun yerine cpu2'yi devre dışı bıraktım.


0

@ visit1985'in cevabı, thread_siblings_list içindeki ayırıcı virgül değilse (örneğin AMD Ryzen sistemimde olduğu gibi) işe yaramıyor.

İşte herhangi bir ayırıcı ile çalışan hiper iş parçacığını kapatmak için bir komut dosyası:

#!/bin/bash

for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
    if [ -e "$cpu/topology/thread_siblings_list" ]; then
        sibling=$(awk -F '[^0-9]' '{ print $2 }' $cpu/topology/thread_siblings_list)
        if [ ! -z $sibling ]; then
            echo 0 > "/sys/devices/system/cpu/cpu$sibling/online"
        fi
    fi
done

Ve işte hiper iş parçacığını açmak için bir tane:

#!/bin/bash

for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
    echo 1 > "$cpu/online"
done

Does bu yöntem sizin Ryzen CPU üzerinde çalışmaya?
Elder Geek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.