어떤 프로세서가 물리적 코어인지 어떻게 알 수 있나요?

어떤 프로세서가 물리적 코어인지 어떻게 알 수 있나요?

여기에 Intel i7 2700k가 있는데 어떤 프로세서가 물리적 프로세서이고 어떤 프로세서가 가상(예: 하이퍼스레딩) 프로세서인지 구분하는 방법을 알고 싶습니다. 현재 CPU 온도, 주파수 및 로드를 표시하기 위해 Conky 스크립트를 실행하고 있지만 올바르게 수행하고 있는지 잘 모르겠습니다.

놀라운

온도와 주파수를 얻기 위해 자체 스크립트를 작성했지만 i7z이는 물리적 코어에만 해당합니다. 현재 각 코어를 다음과 같이 표시합니다.

${cpu cpu1} ${lua display_temp 0} ${lua display_load 0}
${cpu cpu2}
${cpu cpu3} ${lua display_temp 1} ${lua display_load 1}
${cpu cpu4}
# ...

가끔 부하와 온도를 확인하기 때문에 이것이 맞는지 잘 모르겠습니다. 에서 /proc/cpuinfo코어는 어떻게 주문됩니까? 먼저 물리적, 그다음 가상? 각 물리적 코어와 가상 코어는 무엇입니까? 어떻게 주문되나요?

답변1

각 cpuinfo 항목을 검사하여 각 프로세서 코어에 대해 알아볼 수 있습니다.

processor       : 0
[...]
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
apicid          : 0

processor       : 1
[...]
physical id     : 0
siblings        : 8
core id         : 1
cpu cores       : 4
apicid          : 2 

processor       : 2
[...]
physical id     : 0
siblings        : 8
core id         : 2
cpu cores       : 4
apicid          : 4 

processor       : 3
[...]
physical id     : 0
siblings        : 8
core id         : 3
cpu cores       : 4
apicid          : 6

processor       : 4
[...]
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
apicid          : 1

[and so on]

physical id프로세서의 식별자를 표시합니다. 다중 프로세서 설정(머신에 두 개의 별도 물리적 프로세서)이 없으면 항상 0입니다.

siblings동일한 물리적 프로세서에 연결된 프로세서 수를 표시합니다.

core id현재 코어의 식별자를 전체적으로 표시합니다 cpu cores. 이 정보를 사용하여 단일 코어에 들어가는 가상 프로세서를 연관시킬 수 있습니다.

apicid(및 original apicid)에는 BIOS에서 제공한 (가상) 프로세서 번호가 표시됩니다.

8개의 피어 프로세서와 4개의 코어가 있으므로 각 코어에는 2개의 가상 프로세서가 있습니다. 하이퍼스레딩에는 "가상" 또는 "실제" 구분이 없습니다. 하지만 이 정보를 사용하면 동일한 코어에 속한 프로세서를 연관시킬 수 있습니다.

답변2

lscpu를 사용할 수도 있습니다.

# lscpu --all --extended
CPU NODE SOCKET CORE L1d:L1i:L2:L3:L4 ONLINE MAXMHZ    MINMHZ
0   0    0      0    0:0:0:0:0        yes    3200.0000 800.0000
1   0    0      1    1:1:1:0:0        yes    3200.0000 800.0000
2   0    0      2    2:2:2:0:0        yes    3200.0000 800.0000
3   0    0      3    3:3:3:0:0        yes    3200.0000 800.0000
4   0    0      0    0:0:0:0:0        yes    3200.0000 800.0000
5   0    0      1    1:1:1:0:0        yes    3200.0000 800.0000
6   0    0      2    2:2:2:0:0        yes    3200.0000 800.0000
7   0    0      3    3:3:3:0:0        yes    3200.0000 800.0000

여기서 논리 코어 0과 4는 코어 0으로 이동합니다.

답변3

파일 /sys시스템은 이 정보에 대한 좋은 개요를 제공합니다. 다음은 하이퍼 스레딩을 갖춘 SMP 쿼드 코어 섀시의 예입니다.

# grep . /sys/devices/system/cpu/cpu{,1}?/topology/thread_siblings | tr : \\t | sed 's,^,    ,'
/sys/devices/system/cpu/cpu0/topology/thread_siblings   00000000,00000101
/sys/devices/system/cpu/cpu1/topology/thread_siblings   00000000,00000202
/sys/devices/system/cpu/cpu2/topology/thread_siblings   00000000,00000404
/sys/devices/system/cpu/cpu3/topology/thread_siblings   00000000,00000808
/sys/devices/system/cpu/cpu4/topology/thread_siblings   00000000,00001010
/sys/devices/system/cpu/cpu5/topology/thread_siblings   00000000,00002020
/sys/devices/system/cpu/cpu6/topology/thread_siblings   00000000,00004040
/sys/devices/system/cpu/cpu7/topology/thread_siblings   00000000,00008080
/sys/devices/system/cpu/cpu8/topology/thread_siblings   00000000,00000101
/sys/devices/system/cpu/cpu9/topology/thread_siblings   00000000,00000202
/sys/devices/system/cpu/cpu10/topology/thread_siblings  00000000,00000404
/sys/devices/system/cpu/cpu11/topology/thread_siblings  00000000,00000808
/sys/devices/system/cpu/cpu12/topology/thread_siblings  00000000,00001010
/sys/devices/system/cpu/cpu13/topology/thread_siblings  00000000,00002020
/sys/devices/system/cpu/cpu14/topology/thread_siblings  00000000,00004040
/sys/devices/system/cpu/cpu15/topology/thread_siblings  00000000,00008080

동일한 내용은 동일한 코어의 스레드를 나타냅니다. 즉

  • CPU0/CPU8
  • CPU 1/CPU 9
  • 등.

의사 파일에는 유사한 정보 core_siblings와 더 많은 토폴로지 정보가 있습니다.

답변4

이전 답변은 매우 흥미 롭습니다.

인터넷 검색 후 몇 가지 관련 주제를 찾았습니다.

마지막 링크에서 호스트에 물리적 ID가 많으면 Python 스크립트가 작동하지 않습니다. 마침내 다른 조건으로 수정해 보았습니다.

변화:

if p > 0:

도착하다

if p % 2 == 1:

하지만 이전 뉴스에 따르면 예상대로 작동하지 않았습니다. 그런데, 다음보다 더 포괄적인 작업을 수행할 수 있습니다.

grep . /sys/devices/system/cpu/cpu{,1}?/topology/thread_siblings | tr : \\\t | sed -r 's,^,\s\s\s\s,'

그리고:

for file in /sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_list; do echo -n "$file "; cat $file; done |sort -k2 -n

[...]

하이퍼스레딩이 활성화된 멀티 코어 호스트에서 흥미로운 점은 하드웨어 전체에 논리 코어가 분산된다는 것입니다.

예를 들어 내 컴퓨터 중 하나(논리 코어 48개, 물리적 프로세서 2개, "실제 코어" 24개(12*2)(즉, 가상 코어 24개))에서 다음을 수행합니다.

for file in /sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_list; do echo -n "$file "; cat $file; done |sort -k2 -n

 /sys/devices/system/cpu/cpu0/topology/thread_siblings_list 0,24
 /sys/devices/system/cpu/cpu24/topology/thread_siblings_list 0,24
 /sys/devices/system/cpu/cpu1/topology/thread_siblings_list 1,25
 /sys/devices/system/cpu/cpu25/topology/thread_siblings_list 1,25
 /sys/devices/system/cpu/cpu26/topology/thread_siblings_list 2,26
 /sys/devices/system/cpu/cpu2/topology/thread_siblings_list 2,26
 /sys/devices/system/cpu/cpu27/topology/thread_siblings_list 3,27
 /sys/devices/system/cpu/cpu3/topology/thread_siblings_list 3,27
 /sys/devices/system/cpu/cpu28/topology/thread_siblings_list 4,28
 /sys/devices/system/cpu/cpu4/topology/thread_siblings_list 4,28
 /sys/devices/system/cpu/cpu29/topology/thread_siblings_list 5,29
 /sys/devices/system/cpu/cpu5/topology/thread_siblings_list 5,29
 /sys/devices/system/cpu/cpu30/topology/thread_siblings_list 6,30
 /sys/devices/system/cpu/cpu6/topology/thread_siblings_list 6,30
 /sys/devices/system/cpu/cpu31/topology/thread_siblings_list 7,31
 /sys/devices/system/cpu/cpu7/topology/thread_siblings_list 7,31
 /sys/devices/system/cpu/cpu32/topology/thread_siblings_list 8,32
 /sys/devices/system/cpu/cpu8/topology/thread_siblings_list 8,32
 /sys/devices/system/cpu/cpu33/topology/thread_siblings_list 9,33
 /sys/devices/system/cpu/cpu9/topology/thread_siblings_list 9,33
 /sys/devices/system/cpu/cpu10/topology/thread_siblings_list 10,34
 /sys/devices/system/cpu/cpu34/topology/thread_siblings_list 10,34
 /sys/devices/system/cpu/cpu11/topology/thread_siblings_list 11,35
 /sys/devices/system/cpu/cpu35/topology/thread_siblings_list 11,35
 /sys/devices/system/cpu/cpu12/topology/thread_siblings_list 12,36
 /sys/devices/system/cpu/cpu36/topology/thread_siblings_list 12,36
 /sys/devices/system/cpu/cpu13/topology/thread_siblings_list 13,37
 /sys/devices/system/cpu/cpu37/topology/thread_siblings_list 13,37
 /sys/devices/system/cpu/cpu14/topology/thread_siblings_list 14,38
 /sys/devices/system/cpu/cpu38/topology/thread_siblings_list 14,38
 /sys/devices/system/cpu/cpu15/topology/thread_siblings_list 15,39
 /sys/devices/system/cpu/cpu39/topology/thread_siblings_list 15,39
 /sys/devices/system/cpu/cpu16/topology/thread_siblings_list 16,40
 /sys/devices/system/cpu/cpu40/topology/thread_siblings_list 16,40
 /sys/devices/system/cpu/cpu17/topology/thread_siblings_list 17,41
 /sys/devices/system/cpu/cpu41/topology/thread_siblings_list 17,41
 /sys/devices/system/cpu/cpu18/topology/thread_siblings_list 18,42
 /sys/devices/system/cpu/cpu42/topology/thread_siblings_list 18,42
 /sys/devices/system/cpu/cpu19/topology/thread_siblings_list 19,43
 /sys/devices/system/cpu/cpu43/topology/thread_siblings_list 19,43
 /sys/devices/system/cpu/cpu20/topology/thread_siblings_list 20,44
 /sys/devices/system/cpu/cpu44/topology/thread_siblings_list 20,44
 /sys/devices/system/cpu/cpu21/topology/thread_siblings_list 21,45
 /sys/devices/system/cpu/cpu45/topology/thread_siblings_list 21,45
 /sys/devices/system/cpu/cpu22/topology/thread_siblings_list 22,46
 /sys/devices/system/cpu/cpu46/topology/thread_siblings_list 22,46
 /sys/devices/system/cpu/cpu23/topology/thread_siblings_list 23,47
 /sys/devices/system/cpu/cpu47/topology/thread_siblings_list 23,47

이는 CPU0과 CPU24가 동일한 물리적 하드웨어 "주소"를 공유한다는 것을 의미합니다. CPU1과 CPU25도 마찬가지입니다.

따라서 기본적으로 Linux OS에서 하이퍼스레딩을 비활성화하려면 cpu{24..47}/online에 "0"을 입력해야 합니다.

for fake_cpu in {24..47}; do echo 0 > /sys/devices/system/cpu/cpu$fake_cpu/online;done

코어 번호를 매기는 데 내 시스템이 얼마나 흥미로운지 알 수 있을 것입니다.

관련 정보