Linux 시스템에서 펄 스크립트를 사용하여 하이퍼 스레딩이 활성화되어 있는지 확인하려면 어떻게해야합니까?
나는 다음과 같은 방법으로 노력하고 있습니다 :
dmidecode -t processor | grep HTT
내가 올바른 길을 가고 있는지 알려주세요.
Linux 시스템에서 펄 스크립트를 사용하여 하이퍼 스레딩이 활성화되어 있는지 확인하려면 어떻게해야합니까?
나는 다음과 같은 방법으로 노력하고 있습니다 :
dmidecode -t processor | grep HTT
내가 올바른 길을 가고 있는지 알려주세요.
답변:
참고 년 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"가 다른 플래그의 일부인 경우 오탐을 피하는 데 도움이됩니다.)
lscpu
확인하는 방법입니다.
나는 항상 다음을 사용했으며 '코어 당 스레드 수'를 보았습니다.
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
echo 0 > /sys/devices/system/cpu/cpu31/online
. 이제 lscpu보고합니다 Thread(s) per core: 1
. 나쁜 lscpu
! 더 이상 사용하지 않을 것 같아요.
논리 프로세서 수가 두 배인 경우 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 배 더 많은 코어가있을 수 있습니까?
lscpu
사용 가능한 경우 lscpu
많은 추가 메타 데이터와 함께 동일한 정보를 제공하며 결과를 lscpu
보다 쉽게 구문 분석 할 수 있습니다. 그러나이 솔루션은 작동하고 만 사용합니다 /proc/cpuinfo
.
위의 예는 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
. 참조 오스카의 대답을
이 명령으로 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
ht
CPU 플래그에 광고 합니다.
physical id
소켓 / 칩을 나타내는 것 같습니다. 은 core id
동일한 물리적 코어를 가리 키도록 보인다
이 라이너는 나를 위해 속임수를 쓰는 것 같습니다 (루트 권한 필요).
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`);'
dmidecode
신뢰할 수 없다고 생각 합니다.
lscpu
항상 신뢰할 수있는 것은 아니라는 것을 보여줍니다 . 나는 scottbb의 대답을 좋아한다.
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
을 읽으면 /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
CPU 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_list
procfs 파일에서 둘 이상의 노드를 확인하거나 쉼표 또는 그 0
밖의 다른 항목을 찾아 하이퍼 스레딩이 활성화되어 있는지 여부를 나타냅니다.
나는 Perl로 대답 할 것이지만 1) Perl을 모른다 .2) 해결책이 아주 간단한 1 라이너라고 가정한다.
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
...
다음은 파이썬 기반 접근법입니다. 필요에 따라 비활성화하는 방법도 제안합니다.
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의 답변 을 참조 하십시오.
많은 경고와 여기에 대한 대답은 ... 대답이 그렇게 명확하지 않은 것 같습니다. 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. 오스카의 답변
SMT (Intel 브랜드 인 HT의 일반)가 활성화되어 있는지 확인하는 가장 쉬운 방법은 다음과 같습니다.
cat /sys/devices/system/cpu/smt/active
비활성 상태 인 경우 0, 활성 상태 인 경우 1
실제로 다음을 사용하여 런타임에 켜거나 끌 수 있습니다.
echo [on|off] > /sys/devices/system/cpu/smt/control
"코어 당 스레드 수 : 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
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
dmidecode
당신이 루트해야합니다.