우분투에서 하이퍼 스레딩 비활성화


15

우분투 16.04 서버를 실행 중입니다. lscpu 명령을 사용할 때 과대 스레딩이 활성화되어 있음을 알 수 있습니다.

사용 중지하고 싶습니다. 내가 겪었 우분투 포럼여기여기 .

하이퍼 스레딩이 좋지 않은 이유는 다음과 같습니다. 그러나 그것을 끄는 방법에 대한 확실한 해결책은 없습니다.

하이퍼 스레딩을 비활성화하는 단계가 있습니까? 감사 .


3
BIOS에서 비활성화 해 보셨습니까?
edwinksl

예, HT 옵션을 찾을 수 없습니다
john

답변:


9

소개

이것은 흥미로운 질문입니다. 아마 개인적으로 몇 달 동안 가장 흥미로운 것 중 하나 일 것입니다. OP와 마찬가지로 이전 BIOS (2012 년 발명, 2016 년 업데이트 등)에서 하이퍼 스레딩을 비활성화 할 수있는 옵션이 없습니다.

Intel Skylake 및 Kaby Lake의 하이퍼 스레딩 버그 :

Intel Skylake 또는 Kaby Lake 프로세서를 사용하는 사람 은 몇 달 전에 등장한 하이퍼 스레딩에 대한 버그 보고서를 읽어야합니다. 이 영국 등록 이야기는 데비안 개발자가 어떻게 하이퍼 스레딩이 기계를 손상시키고 손상시킬 수 있는지를 발견했습니다.

지난해 Ask Ubuntu에서 Skylake에보고 된 수많은 문제가 있으며 하이퍼 스레딩 버그로 인해 발생한 문제를 식별하는 방법에 대해 궁금합니다.

이 답변은 세 부분으로 나뉩니다.

  • 하이퍼 스레딩을 켜거나 끌 때 CPU 표시
  • 하이퍼 스레딩을 자동으로 켜고 끄는 Bash 스크립트
  • 하이퍼 스레딩을 시작하기 전에 끄면 Conky가 충돌합니다.

하이퍼 스레딩을 켜거나 끌 때 CPU 표시

아래에서 하이퍼 스레딩을 끄고 CPU 스트레스 테스트를 수행 할 때 CPU 사용률을 확인할 수 있습니다. 약 10 초 후에 하이퍼 스레딩이 설정된 상태에서 동일한 스크립트가 반복됩니다. 마지막으로 하이퍼 스레딩을 끈 상태에서 스크립트를 실행 한 후 10 초 후에

하이퍼 스레딩 설정

디스플레이는 두 섹션으로 나뉩니다.

  • 왼쪽 절반에서 set-hyper-threading매개 변수 0 (off)과 1 (on)을 사용 하여 스크립트 를 호출하는 터미널 창 .
  • 오른쪽 절반 conky에는 CPUS 1 ~ 8의 CPU 사용률이 표시됩니다.

첫 스크립트 실행 하이퍼 스레딩

스크립트가 처음 실행될 때 CPU 번호 2, 4, 6 및 8 (Conky에 따름)은 3 %, 2 %, 2 % 및 2 %로 고정됩니다. 스트레스 테스트가 실행되는 동안 CPU 번호 1, 3, 5 및 7이 100 %로 급증합니다.

하이퍼 스레딩을 끄고 4 개의 코어 만보고 된 CPU 토폴로지가 표시됩니다.

/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

두 번째 스크립트는 하이퍼 스레딩을 실행합니다

스크립트가 두 번째로 실행될 때 하이퍼 스레딩이 켜지고 스트레스 테스트가 실행되는 동안 모든 CPU 번호 1-8이 100 %로 급등합니다.

하이퍼 스레딩이 켜진 상태에서 CPU 토폴로지가 표시되고 4 개의 코어와 4 개의 가상 코어 만보고됩니다.

/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

세 번째 스크립트는 하이퍼 스레딩을 실행합니다

두 번째 스크립트가 끝난 후 CPU 2, 4, 6 및 8이 어떻게 4 %, 2 %, 3 %, 4 %에서 유휴 상태인지 확인하십시오. 세 번째 테스트에서 하이퍼 스레딩을 끄면 첫 번째 테스트에서 3 %, 2 %, 2 % 및 2 %가 아닌 4 %, 2 %, 3 %, 4 %에서 고정 된 CPU 백분율이 표시되므로 중요합니다.

따라서 하이퍼 스레딩을 끄면 현재 상태에서 가상 CPU가 정지되는 것 같습니다.

또한 하이퍼 스레딩을 설정하거나 해제해도 스크립트에 "Hyper Threading Supported"가 표시됩니다.


하이퍼 스레딩을 자동으로 켜고 끄는 Bash 스크립트

아래 스크립트를 볼 때 Conky는 1에서 8까지의 CPU 번호를, Linux는 0에서 7까지의 CPU 번호를 나타냅니다.

#!/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

참고 : 이 프로그램 stress은 데비안 시스템의 모든 데비안 시스템에 내장되어 있습니다. 따라서 우분투에서이 스크립트를 실행하기 위해 패키지를 다운로드하고 설치할 필요가 없습니다.

듀얼 코어 CPU가있는 경우 #CPU 번호 5와 7을 제어하는 ​​행 을 제거하거나 주석 처리해야합니다 .

CPU 토폴로지를 표시하는 bash 라인에 대한 Hi-Angel의 공로grep "" /sys/devices/system/cpu/cpu*/topology/core_id


하이퍼 스레딩을 시작하기 전에 끄면 Conky가 충돌합니다.

CPU 2, 4, 6, 8을 사용 가능한 최저 백분율로 얻으려면 부팅 중에 하이퍼 스레딩을 끄려고했습니다. 나는이 스크립트를 사용하여 다음을 수행했습니다.

# 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

그러나 conky시작할 때 하이퍼 스레딩을 끄면 세그먼트 화 오류가 발생합니다. 따라서 @reboot스크립트에서 네 줄 을 주석 처리해야했습니다 .

CPU 사용률 및로드 계수를 표시하는 Conky Code

Conky에서 유사한 디스플레이를 설정하려면 다음과 같은 관련 코드 스 니펫이 있습니다.

${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}

참고 : 위의 Nvidia 코드는 아직 Ubuntu에서 작동하는 Nvidia GPU를 가지고 있지 않기 때문에 테스트 된 적이 없습니다. 지금은 곧 :)


1
죄송하지만 noht존재하지 않습니다. 나는 때때로 발생하는 linux-4.13-rc1 소스를 통해 옵션을 잡았습니다. 그러나 나는 당신을 혼란스럽게 할 수있는 것을 분명히 이해합니다 : dat bugreport 는 옵션이 작동하지 않는다고 불평하고 nextrelease마치 무언가를 고치 듯이 마치 닫힙니다 . 그러나 주석을 읽으면 noht커널 명령 행에서 옵션을 확인한 다음 /sys/파일 시스템을 통해 코어를 비활성화하는 수공 스크립트가 유일하게 사용된다는 것을 알 수 있습니다 . IOW noht는 쓸모가 없습니다.
Hi-Angel

@ Hi-Angel 필요하지 않음을 지적 해 주셔서 감사합니다. 나는 그것없이 테스트를했고 오프라인 코어는 2,2,5,5 % (Noht 포함)에서 5,5,10,10 % (Noht 제외)로 두 배가되었습니다. 오늘 밤 더 많은 테스트를해볼 게요. 커널 매개 변수 설명서를 검색했지만에 대한 참조를 찾을 수 없습니다 noht.
WinEunuuchs2Unix

참고로 인덱싱에는 Machine / Human 언어가 없습니다.) 0, 1 또는 심지어 특정 숫자 (MiniZinc에서와 같이) 부터 시작하는 인덱스와의 혼동을 해결하려면 인덱스 세트 를 고려하는 것이 좋습니다 . 인덱스 세트에서 다른 세트로의 노출. 그것을 추상화하면 인덱스를 나타내지 않는 데이터와 관련된 일부가 실제로 약간 비틀린 후 인덱싱에 사용될 수있을 때 쉽게 알 수 있습니다. 이점은 메모리 레이아웃과 다른 개념을 제한하지 않는 개념을 염두에 둔 것입니다.
Hi-Angel

@ Hi-Angel "시작 위치"와 "오프셋"의 비슷한 비교. 어쨌든 나는 지난 2 일간의 테스트와 코딩에 기초하여이 답변을 다시 작성하려고합니다. 그래서 우리의 의견은 곧 쓸모 없게 될 것입니다 ...
WinEunuuchs2Unix

6

최신 커널은 maxcpus 커널 매개 변수를 지원합니다 .

이를 통해 CPU 수를 물리적 코어 수로 설정할 수 있습니다. 이 기능은 제품군 6의 Intel CPU에 대한 MDS 취약점 으로 인한 위협을 완화하는 데 도움이 될 수 있습니다 .

어떻게:

sudo (루트) 권한으로 자주 사용하는 텍스트 편집기로 / etc / default / grub을 엽니 다.

GRUB_CMDLINE_LINUX_DEFAULT =로 시작하는 줄을 찾으십시오

maxcpus = n을 일반적인 조용한 스플래시 매개 변수 (여기서 n = CPU의 물리적 코어 수) 와 같은 기존 커널 매개 변수에 추가 하십시오.

예를 들어, 하이퍼 스레딩 기능이있는 신뢰할 수있는 Intel® Core (TM) i3-3220 CPU @ 3.30GHz 듀얼 코어에서 maxcpus = 2 를 추가 하여 부팅시 하이퍼 스레딩을 해제했습니다.

파일을 저장 한 후 명령을 실행 sudo update-grub하고 재부팅하십시오.

다음 lscpu | grep "per core"과 같은 출력을 제공해야하는 명령 을 실행하여 성공을 확인할 수 있습니다 .

Thread(s) per core: 1

커널 4.4.0에서 테스트

출처 :

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
흥미로운 링크. 공유해 주셔서 감사합니다.
WinEunuuchs2Unix

@ WinEunuuchs2Unix 나의 기쁨. 항상 도와주고 싶어합니다!
Geek Geek

5

다음과 같이 Linux에서 루트 또는 수퍼 유저 권한으로 하이퍼 스레딩을 비활성화 할 수 있습니다.

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

다음을 사용하여 현재 하이퍼 스레딩 상태 를 표시 할 수 있습니다 .

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

이 명령은 다음 중 하나를 인쇄합니다.

on|off|forceoff|notsupported|notimplemented

또는 대부분의 BIOS 펌웨어에는 하이퍼 스레딩을 비활성화하는 옵션도 포함되어 있습니다. BIOS에서 비활성화하면 위의 고양이가를 반환합니다 forceoff.


부팅시 하이퍼 스레딩을 비활성화 하기 위해 이것을 시도 했습니까 ?
Geek

1
@ElderGeek 아니오, maxcpus=하이퍼 스레딩을 비활성화하기 위해 커널 매개 변수를 시도하지 않았습니다 . 주로 하이퍼 스레딩 코어와의 상호 작용에 대한 공식 문서를 찾을 수 없기 때문입니다. 지정하면 항상 하이퍼 스레딩을 비활성화해야 maxcpus=#real_cores합니까? 아니면 일부 시스템에서 여전히 HT를 사용하는 실제 코어의 절반으로 끝날 수 있습니까? 또한 maxcpus=코어 수가 다른 컴퓨터 간에는 하나의 설정을 이식 할 수 없습니다. 다른 기계에 대해이 매개 변수의 변형을 유지하는 것은 지루하고 오류가 발생하기 쉽습니다.
maxschlepzig 2018 년

내 경험에 따르면 maxcpus = # real_cores를 지정하면 하이퍼 스레딩을 항상 비활성화 lscpu | grep "per core"했습니다. 나에게.
Geek

2

다음은 ht- 코어를 식별하고 온라인 / 오프라인으로 전환하는 스크립트입니다.

#!/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 , 아마도 이것을 훌륭한 답변에 추가 할 수 있습니다.


제대로 작동하도록 목록을 숫자로 정렬해야했습니다.for i in $(find /sys/devices/system/cpu/cpu[0-9]* -maxdepth 0 -type d |sort -V); do
neuhaus

2

maxcpus=n매개 변수 GRUB_CMDLINE_LINUX_DEFAULT=가 제대로 작동하지 않습니다. 그것은 4 개의 코어 4 개의 스레드 대신 2 개의 코어와 4 개의 스레드로 나를 떠났습니다.

해결책을 찾았습니다.

추가 mitigations=auto,nosmtGRUB_CMDLINE_LINUX_DEFAULT=대신

Linux 4.4.0이 설치된 Ubuntu 16.04 LTS에서 테스트되었습니다.

출처 : https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/MDS


1

core_id가 복제되어 마더 보드가 여러 개의 CPU 소켓을 호스팅하는 시스템에는 하이퍼 스레드 쌍을 커널에서 찾는보다 강력한 방법이 필요합니다. 두 개의 8 코어 Xeon 칩이있는 시스템의 버전은 다음과 같습니다 (Ubuntu 16.04의 예).

$ 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

다양한 목적으로 파일을 살펴볼 수도 있습니다.

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

0

토론을 읽었다면 대개 비활성화하는 것이 합리적이지 않다는 것을 알고있을 것이므로 학습 목적으로 원하는 것으로 가정합니다.

HT의 아이디어는 모든 물리적 코어 (소위 가상 코어)에 대해 여러 개의 CPU 레지스터 세트를 갖는 것입니다 . "더 나은"가상 코어는 없으며 동일합니다. 이 지식으로 무장 한 모든 가상 코어를 제외하고 가상 코어를 비활성화 할 수 있습니다.

먼저 어떤 가상 코어 쌍이 어떤 물리적 코어에 속하는지 알고 싶습니다. /sys/ 파일 시스템 . 이를 위해 core_id파일을 사용할 수 있습니다 .

λ 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

출력에서 cpu0 + cpu2가 하나의 물리적 코어에 포함되고 cpu1 + cpu3이 다른 물리적 코어에 포함되어 있음을 알 수 있습니다. 이제 권한을 높이고 사용하십시오echo command를 사용하여 모든 쌍에서 하나씩 비활성화하십시오.

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

cpu0에는 "online"파일이없고 비활성화 할 수 없으므로 cpu2를 비활성화했습니다.


0

thread_siblings_list의 구분 기호가 쉼표가 아닌 경우 (예 : AMD Ryzen 시스템의 경우) @ visit1985의 답변이 작동하지 않습니다.

다음은 모든 구분 기호와 함께 작동하는 하이퍼 스레딩 기능을 해제하는 스크립트입니다.

#!/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

하이퍼 스레딩을 켜는 방법은 다음과 같습니다.

#!/bin/bash

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

이 방법 은 Ryzen CPU에서 작동 합니까 ?
Geek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.