하이퍼 스레딩이 활성화되어 있는지 확인하고 있습니까?


51

Linux 시스템에서 펄 스크립트를 사용하여 하이퍼 스레딩이 활성화되어 있는지 확인하려면 어떻게해야합니까?

나는 다음과 같은 방법으로 노력하고 있습니다 :

dmidecode -t processor | grep HTT

내가 올바른 길을 가고 있는지 알려주세요.


2
에 대한 dmidecode당신이 루트해야합니다.
Nils

5
나는 모두가 "perl script"비트를 무시한 것을 좋아한다 ;-)
SamB

답변:


27

참고 년 7 월 (8), 2014 년 추가 :리카르도 Murri 지역은 지적 만 아래에있는 내 대답은 프로세서 보고서는 하이퍼 스레딩을 지원할지 여부를 보여줍니다. 일반적으로 * nix O / S는 지원되는 경우 하이퍼 스레딩을 사용하도록 구성됩니다. 그러나 실제로 프로그래밍 방식으로 확인하려면 예를 들어 Nils의 답변을 참조하십시오 !

---- 2012 년 3 월 25 일의 원본 답변 :

당신은 실제로 올바른 길을 가고 있습니다 :)

dmidecode -t processor | grep HTT

Linux에서는 일반적으로의 "flags"줄에서 "ht"를 찾습니다 /proc/cpuinfo. 예를 들어보십시오

grep '^flags\b' /proc/cpuinfo | tail -1

또는 패턴에 "ht"를 포함 시키려면

grep -o '^flags\b.*: .*\bht\b' /proc/cpuinfo | tail -1

( \b단어 경계와 일치하며 "ht"가 다른 플래그의 일부인 경우 오탐을 피하는 데 도움이됩니다.)


19
이것은 HT가 실제로 사용되는 경우가 아니라 프로세서가 HT 가능 여부 만 알려줍니다.
Riccardo Murri

3
HTT 필드는 프로세서가 실제로 코어에 하이퍼 스레딩을 가지고 있음을 나타내지 않습니다. / proc / cpuinfo에서 '형제'및 'cpu 코어'의 값을 확인하십시오.
Silver Moon

@ Silver-Moon 설명 할 수 있습니까? dmidecode는 SMBIOS를 읽고 프로세서의 기능을 알려야합니다. 하이퍼 스레딩이 O / S에 표시되는지 또는 사용되는지는 알 수 없습니다. 그러나 이것은 이미 언급되었습니다. Nils answer
xebeche를

1
내 시스템 dmidecode 출력의 @xebeche는 "HTT (Multi-threading)"를 표시하지만 프로세서는 "core 2 quad Q8400"이며 하이퍼 스레딩이 없습니다. 인텔 사양을 확인하십시오.
실버 문

1
리카르도 +1 HT 가능 서버에서 HT를 비활성화했으며 "HTT"가 인쇄되는 것을 볼 수 있습니다. lscpu확인하는 방법입니다.
sudo

96

나는 항상 다음을 사용했으며 '코어 당 스레드 수'를 보았습니다.

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

그러나 간단한 방법으로 논리 프로세서를 끄면이 기술이 실패합니다.

echo 0 > /sys/devices/system/cpu/cpuX/online

4
이것이 가장 좋은 대답입니다. 찻잎을 읽을 필요가없고, 많은 유용한 정보가 필요하며, 잡을 필요가 없습니다.
MrMas

11
OMG 쉘 명령 을 사용 하여 답을 얻었습니까?! 그건 너무 오래된 학교 -1입니다. 멋진 파이썬 스크립트는 어떻습니까? 글을 쓰는 데 오후가 걸립니다. 파이썬이 아니기 때문에 -1입니다. 간결함을 위해 +3.
Mike S

@Mike S 많은 풍자적이지만 ... lscpu 의 출력은 4 개의 코어 CPU에서 1 개의 하이퍼 스레드 코어 만 다운 될 때 정확하지 않습니다 (완전히 유효한 시나리오 임). 따라서 3 개의 코어가 실제로 하이퍼 스레딩되지만 (총 7 개의 스레드) "코어 당 스레드 수 : 1"을보고 합니다.
세드릭 마틴

@Cedric Martin 당신이 알아 차렸다. :-) ... Oooo! 잘 잡았다 ... 내가 해냈어! 듀얼 8 코어 머신 (Dell R620 / E5-2667 v2 CPU)을 가져 왔습니다 ... 32 개의 CPU를보고합니다 ... 수행되었습니다 echo 0 > /sys/devices/system/cpu/cpu31/online. 이제 lscpu보고합니다 Thread(s) per core: 1. 나쁜 lscpu! 더 이상 사용하지 않을 것 같아요.
Mike S

3
@Mike S 여전히 lscpu를 사용할 수 있지만 그 줄은 아닙니다. 말하자면, 사용 "lscpu -e -a는" 제대로 각 스레드를 나열하고 활성 상태의인지 아닌지 알 수 있습니다. 그것은 단지의 "코어 당 스레드 (들)" 는 각각의 코어에 다르게 / 비활성화 스레드를 활성화 할 수 있습니다 훨씬 이해가되지 않습니다.
세드릭 마틴

18

논리 프로세서 수가 두 배인 경우 HT가있는 코어 수입니다. 다음 스크립트를 사용하여 / 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우리는 하이퍼 스레딩, 오른쪽 설정되어 있는지 말할 수 있습니까? 사실, 이것이 사실 2 * $NUMCORE = $NUMLOG입니까, 아니면 일부 CPU에 4 배 더 많은 코어가있을 수 있습니까?
Tombart

@Tombart 현재 HT는 2 번째 요소입니다. 앞으로 더 많을 것으로 예상됩니다. 코어는 물리적으로 표시됩니다. 소켓 당 코어 수는 형제에서 파생 될 수 있습니다.
Nils

lscpu사용 가능한 경우 lscpu많은 추가 메타 데이터와 함께 동일한 정보를 제공하며 결과를 lscpu보다 쉽게 ​​구문 분석 할 수 있습니다. 그러나이 솔루션은 작동하고 만 사용합니다 /proc/cpuinfo.
Trevor Boyd Smith

8

위의 예는 CPU가 HT를 사용할 수 있는지, 사용중인지는 표시하지 않습니다. 마지막 방법은 작동하지만 이중 소켓 서버 및 VM Xenserver은 물리적 CPU가 표시되지 않는 위치에서 테스트되었습니다 .

나는 이것이 가장 쉽고 코드가 적은 방법이라는 것을 알았으며 모든 테스트 환경에서도 작동했습니다. 하지만 필요합니다 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 ################################### "

나는 이것이 모든 플랫폼에서 작동하고 CPU가 가능하고 활성화되어 있는지 알려줄 것이라고 믿습니다. 조금 지저분 할 수도 있지만 스크립팅 초보자입니다. centos XENSERVER vm, Ubuntu 및 Openfiler (rpath)로 테스트했습니다.


읽기만하면 스크립트를 훨씬 단순화 할 수 있습니다 /sys/devices/system/cpu/smt/control. 참조 오스카의 대답을
maxschlepzig

6

이 명령으로 CPU의 HT 기능을 확인할 수 있습니다

# grep ht /proc/cpuinfo

다음 명령을 사용하여 커널에서 볼 수있는 물리 및 논리 CPU를 나열 할 수 있습니다.

# egrep -i "processor|physical id" /proc/cpuinfo

단일 코어 HT 지원 CPU에서이 출력을 제공합니다.

processor   : 0
physical id : 0
processor   : 1
physical id : 0

다음과 같은 결과를 읽을 수 있습니다.

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

1
이것은 HT가 실제로 사용되는 경우가 아니라 프로세서가 HT 가능 여부 만 알려줍니다. 프로세서가 HT 가능하지만 HT가 활성화되지 않은 노드는 여전히 htCPU 플래그에 광고 합니다.
Riccardo Murri

@RiccardoMurri 내가 아는 한, HT가 비활성화되면 ht 플래그가 / proc / cpuinfo에 나타나지 않습니다
Coren

6
나는 그렇지 않다고 확신합니다. HT 사용 가능 서버와 HT 사용 불가능 서버가 모두 있으며 모두 ht 플래그를 표시합니다.
Riccardo Murri

2
코어가 4 개인 Xeon 프로세서가있는 경우 하나의 물리적 ID와 4 개의 프로세서로 표시됩니다. 따라서 하이 퍼트 레딩없이 물리적 ID 당 여러 개의 프로세서를 사용할 수 있습니다.
Andomar

2
2 소켓 머신이 있는데 physical id소켓 / 칩을 나타내는 것 같습니다. 은 core id동일한 물리적 코어를 가리 키도록 보인다
Heartinpiece

6

이 라이너는 나를 위해 속임수를 쓰는 것 같습니다 (루트 권한 필요).

dmidecode -t processor | grep -E '(Core Count|Thread Count)'

출력은 다음과 같습니다.

Core Count: 2
Thread Count: 4

스레드 수는 코어 수의 두 배이므로 하이퍼 스레딩을 사용하도록 설정했습니다.

또는 요청에 따라 펄 스크립트를 정말로 원한다면 ...

perl -e 'print grep(/Core Count/ || /Thread Count/, `dmidecode -t processor`);'

1
Intel 기반 HT 가능 시스템에서 HT를 해제했지만 dmidecode와 함께 반환되는 스레드 수는 코어 수의 두 배입니다. HT가 활성화되어 있는지 여부가 아니라 CPU가 HT를 지원하는지 여부를 보여줍니다.
Dmitri Chubarov

@Dmitri Weird. 하이퍼 스레딩을 사용하지 않도록 설정 한 상태에서 HT 가능 서버 (Intel Xeon E5-2670 v3 2 개 사용)에서 방금 실행했으며 코어 및 스레드 수는 동일했습니다. 무엇이 행동의 차이를 일으킬 지 잘 모르겠습니다. 더 자세히 살펴 봐야합니다.
billyw

방금 두 개의 X5680 프로세서, 하이퍼 스레딩을 사용하지 않는 Dell R610에서 이것을 실행했으며 스레드 수는 코어 수의 두 배입니다. 스테파니 아의 답변 (lscpu)이 작동하는 것 같습니다. iDRAC (Dell의 소등, 대역 외 프로세서 (알지 못하는 사람들을 위해))를 재확인했으며 하이퍼 스레딩이 꺼져 있다고 말합니다. 그래서 나는 dmidecode신뢰할 수 없다고 생각 합니다.
Mike S

Dell 1950 (x5460 CPU, 하이퍼 스레딩이 불가능 함)을 확인했으며 lscpu가 정확했습니다. 또한 Dell R620 (E5-2690 [v1, I 믿습니다])이 정확했습니다.
Mike S

그러나 위의 답변 중 하나에서 @Cedric Martin의 의견은 lscpu항상 신뢰할 수있는 것은 아니라는 것을 보여줍니다 . 나는 scottbb의 대답을 좋아한다.
Mike S

3
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

이 결과는 siblings숫자 (12)가 cpu cores(6) 보다 클 때 HT가 활성화되었음을 나타냅니다.

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

2

을 읽으면 /sys/devices/system/cpu/cpu0/topology/thread_siblings_listCPU 0의 쉼표로 구분 된 스레드 형제 목록 (즉, 하이퍼 스레드 "코어")을 반환합니다.

예를 들어, 하이퍼 스레딩이 활성화 된 2 소켓 6 코어 Xeon에서 다음을 얻습니다.

cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,12

그러나 BIOS에서 하이퍼 스레딩을 끄면 다음과 같은 결과가 나타납니다.

cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0

CPU 0을 항상 사용할 수 있다고 가정하면 CPU 0의 thread_sibling_listprocfs 파일에서 둘 이상의 노드를 확인하거나 쉼표 또는 그 0밖의 다른 항목을 찾아 하이퍼 스레딩이 활성화되어 있는지 여부를 나타냅니다.


나는 Perl로 대답 할 것이지만 1) Perl을 모른다 .2) 해결책이 아주 간단한 1 라이너라고 가정한다.


2

Linux에서는 다음과 같이 작동합니다.

$ 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  

위의 예에서는 2 개의 NUMA 소켓 (SOCKET = 1 또는 2)이 있습니다. 16 개의 물리적 코어가 있습니다 (CORE = 0 ~ 15). 각 CORE에는 형제 하이퍼 스레드가 있습니다 (예 : CORE = 0에는 CPU 0,16이 포함됨).

하이퍼 스레드를 다음과 같이 확인할 수 있습니다.

$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list  
0,16

캐시 메모리 계층은 다음과 같습니다.

CPU 0 --> L1D_0|L1I_0 -> L2_0 -> L3_0  
          ^                      ^
CPU 16 ---|                      |     
                                 |         
CPU 1 --> L1D_1|L1I_1 -> L2_1 ---> 
          ^    
CPU 17 ---|   
...    

lscpu -p는 쉬운 프로그램 구문 분석을 위해 csv 형식 출력을 제공합니다.

$ 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
...

2

다음은 파이썬 기반 접근법입니다. 필요에 따라 비활성화하는 방법도 제안합니다.

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(바이오에서 하이퍼 스레딩을 끄는 것 외에)입니다. 직접 확인하려면 Oscar의 답변 을 참조 하십시오.
maxschlepzig

1

많은 경고와 여기에 대한 대답은 ... 대답이 그렇게 명확하지 않은 것 같습니다. lscpu"카운트 코어와 논리 프로세서, 그리고 비교"에 적용되는 답변이 있습니다. 간단한 반향 명령으로 논리 프로세서를 종료 할 수 있기 때문에 (예 : 터보 모드에 의존하는 대기업 환경에서 중요 할 수 있음).

여기 내 시도가 있습니다. 영감을 얻은 @scottbb에게 감사드립니다.

printf "HT is "; egrep -q [:punct:] /sys/devices/system/cpu/cpu0/topology/thread_siblings_list && echo on || echo off 

Dell Xeon 기반 컴퓨터에서 HT가 켜져 있으면 형제 목록에 쉼표가 포함됩니다. 내 노트북에는 하이픈 (i5-3210m 프로세서)이 포함되어 있습니다. 그래서 나는 구두점을 요구하고 있습니다.

생각? 비판?

요청자가 perl을 요청 했으므로 여기로 이동하십시오.

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 [-.]이 입력 덜 때문이다. FWIW, 나는 몇 가지 Xeons / i5 / i7 (모바일 변형 포함)을 확인했으며 그 중 하이픈이 없습니다 thread_siblings_list. cpu0을 확인하는 것만으로는 충분하지 않으므로 다음과 같은 것이 더 강력 grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list합니다. 그러나 단지 a grep 1 /sys/devices/system/cpu/smt/active -q가 더 중요합니다-cf. 오스카의 답변
maxschlepzig

1

SMT (Intel 브랜드 인 HT의 일반)가 활성화되어 있는지 확인하는 가장 쉬운 방법은 다음과 같습니다.

cat /sys/devices/system/cpu/smt/active

비활성 상태 인 경우 0, 활성 상태 인 경우 1

실제로 다음을 사용하여 런타임에 켜거나 끌 수 있습니다.

echo [on|off] > /sys/devices/system/cpu/smt/control

Catting가 /sys/devices/system/cpu/smt/control있다 가능 수율 on|off|forceoff|notsupported|notimplemented.
maxschlepzig

0

"코어 당 스레드 수 : 1"을 확인할 수있는 lscpu를 더 잘 확인하면 1 코어 당 하나의 스레드 만 의미합니다.

    # 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

0

Stephaniea 는 이미 언급했습니다 lscpu. 나는 그것에 조금 더 추가하고 싶었다.

오프라인 논리적 코어가있을 때마다 내 AMD Epyc 프로세서, 일, lscpu라는 새로운 추가 행을 표시합니다Off-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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.