답변:
이것은 흥미로운 질문입니다. 아마 개인적으로 몇 달 동안 가장 흥미로운 것 중 하나 일 것입니다. OP와 마찬가지로 이전 BIOS (2012 년 발명, 2016 년 업데이트 등)에서 하이퍼 스레딩을 비활성화 할 수있는 옵션이 없습니다.
Intel Skylake 또는 Kaby Lake 프로세서를 사용하는 사람 은 몇 달 전에 등장한 하이퍼 스레딩에 대한 버그 보고서를 읽어야합니다. 이 영국 등록 이야기는 데비안 개발자가 어떻게 하이퍼 스레딩이 기계를 손상시키고 손상시킬 수 있는지를 발견했습니다.
지난해 Ask Ubuntu에서 Skylake에보고 된 수많은 문제가 있으며 하이퍼 스레딩 버그로 인해 발생한 문제를 식별하는 방법에 대해 궁금합니다.
아래에서 하이퍼 스레딩을 끄고 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"가 표시됩니다.
아래 스크립트를 볼 때 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
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
스크립트에서 네 줄 을 주석 처리해야했습니다 .
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를 가지고 있지 않기 때문에 테스트 된 적이 없습니다. 지금은 곧 :)
noht
존재하지 않습니다. 나는 때때로 발생하는 linux-4.13-rc1 소스를 통해 옵션을 잡았습니다. 그러나 나는 당신을 혼란스럽게 할 수있는 것을 분명히 이해합니다 : dat bugreport 는 옵션이 작동하지 않는다고 불평하고 nextrelease
마치 무언가를 고치 듯이 마치 닫힙니다 . 그러나 주석을 읽으면 noht
커널 명령 행에서 옵션을 확인한 다음 /sys/
파일 시스템을 통해 코어를 비활성화하는 수공 스크립트가 유일하게 사용된다는 것을 알 수 있습니다 . IOW noht
는 쓸모가 없습니다.
noht
.
최신 커널은 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
다음과 같이 Linux에서 루트 또는 수퍼 유저 권한으로 하이퍼 스레딩을 비활성화 할 수 있습니다.
# echo off > /sys/devices/system/cpu/smt/control
다음을 사용하여 현재 하이퍼 스레딩 상태 를 표시 할 수 있습니다 .
$ cat /sys/devices/system/cpu/smt/control
이 명령은 다음 중 하나를 인쇄합니다.
on|off|forceoff|notsupported|notimplemented
또는 대부분의 BIOS 펌웨어에는 하이퍼 스레딩을 비활성화하는 옵션도 포함되어 있습니다. BIOS에서 비활성화하면 위의 고양이가를 반환합니다 forceoff
.
maxcpus=
하이퍼 스레딩을 비활성화하기 위해 커널 매개 변수를 시도하지 않았습니다 . 주로 하이퍼 스레딩 코어와의 상호 작용에 대한 공식 문서를 찾을 수 없기 때문입니다. 지정하면 항상 하이퍼 스레딩을 비활성화해야 maxcpus=#real_cores
합니까? 아니면 일부 시스템에서 여전히 HT를 사용하는 실제 코어의 절반으로 끝날 수 있습니까? 또한 maxcpus=
코어 수가 다른 컴퓨터 간에는 하나의 설정을 이식 할 수 없습니다. 다른 기계에 대해이 매개 변수의 변형을 유지하는 것은 지루하고 오류가 발생하기 쉽습니다.
lscpu | grep "per core"
했습니다. 나에게.
다음은 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
의 maxcpus=n
매개 변수 GRUB_CMDLINE_LINUX_DEFAULT=
가 제대로 작동하지 않습니다. 그것은 4 개의 코어 4 개의 스레드 대신 2 개의 코어와 4 개의 스레드로 나를 떠났습니다.
해결책을 찾았습니다.
추가 mitigations=auto,nosmt
로 GRUB_CMDLINE_LINUX_DEFAULT=
대신
Linux 4.4.0이 설치된 Ubuntu 16.04 LTS에서 테스트되었습니다.
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
토론을 읽었다면 대개 비활성화하는 것이 합리적이지 않다는 것을 알고있을 것이므로 학습 목적으로 원하는 것으로 가정합니다.
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를 비활성화했습니다.
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