![센서에서 출력되는 CPU 코어 수가 불연속적인 이유는 무엇입니까?](https://linux55.com/image/218420/%EC%84%BC%EC%84%9C%EC%97%90%EC%84%9C%20%EC%B6%9C%EB%A0%A5%EB%90%98%EB%8A%94%20CPU%20%EC%BD%94%EC%96%B4%20%EC%88%98%EA%B0%80%20%EB%B6%88%EC%97%B0%EC%86%8D%EC%A0%81%EC%9D%B8%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
명령의 핵심 번호는 0,4,8,...39 입니다 sensors
.
왜 0, 1, 2, 3, 4가 아닌가?
foo@foo-linux:~$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Package id 0: +73.0°C (high = +80.0°C, crit = +100.0°C)
Core 0: +46.0°C (high = +80.0°C, crit = +100.0°C)
Core 4: +50.0°C (high = +80.0°C, crit = +100.0°C)
Core 8: +52.0°C (high = +80.0°C, crit = +100.0°C)
Core 12: +47.0°C (high = +80.0°C, crit = +100.0°C)
Core 16: +73.0°C (high = +80.0°C, crit = +100.0°C)
Core 20: +50.0°C (high = +80.0°C, crit = +100.0°C)
Core 24: +58.0°C (high = +80.0°C, crit = +100.0°C)
Core 28: +52.0°C (high = +80.0°C, crit = +100.0°C)
Core 36: +48.0°C (high = +80.0°C, crit = +100.0°C)
Core 37: +48.0°C (high = +80.0°C, crit = +100.0°C)
Core 38: +48.0°C (high = +80.0°C, crit = +100.0°C)
Core 39: +48.0°C (high = +80.0°C, crit = +100.0°C)
다시 업데이트
12세대 Intel(R) Core(TM) i7-12700입니다.
이것은 서버가 아닌 PC이며 CPU 소켓이 1개만 있습니다.
고쳐 쓰다
foo@foo-linux:~$ cat /proc/cpuinfo | grep -i apicid
apicid : 0
initial apicid : 0
apicid : 1
initial apicid : 1
apicid : 8
initial apicid : 8
apicid : 9
initial apicid : 9
apicid : 16
initial apicid : 16
apicid : 17
initial apicid : 17
apicid : 24
initial apicid : 24
apicid : 25
initial apicid : 25
apicid : 32
initial apicid : 32
apicid : 33
initial apicid : 33
apicid : 40
initial apicid : 40
apicid : 41
initial apicid : 41
apicid : 48
initial apicid : 48
apicid : 49
initial apicid : 49
apicid : 56
initial apicid : 56
apicid : 57
initial apicid : 57
apicid : 72
initial apicid : 72
apicid : 74
initial apicid : 74
apicid : 76
initial apicid : 76
apicid : 78
initial apicid : 78
답변1
코어 번호는 드라이버 모듈의 변수에서 나옵니다 cpu_core_id
. 소스 코드에는 다음과 같이 설명되어 있습니다.struct temp_data
coretemp
cpu_core_id
* @cpu_core_id: The CPU Core from which temperature values should be read
* This value is passed as "id" field to rdmsr/wrmsr functions.
지정된 프로세서에서 모델별 레지스터를 읽고 쓰기 위한 기계어 명령어 rdmsr
입니다 . wrmsr
이 coretemp
모듈은 다음에 정의된 함수를 통해 이러한 지시어를 사용합니다.아치/x86/lib/msr-smp.c. 이러한 함수는 단순히 CPU/코어 ID 필드를 있는 그대로 전달하므로 표시되는 ID는 마더보드 및 CPU에서 사용되는 ID입니다.
마더보드에 4개의 CPU 소켓이 있고 그중 하나만 채워져 있는 경우 각 슬롯에 ID 번호를 차례로 할당하도록 펌웨어가 구성되었을 수 있으므로 빈 슬롯에 속한 ID는 사용되지 않습니다. 그러나 귀하의 경우에는 끝에 4개의 연속적인 코어 ID 시퀀스(36 .. 39)가 있으므로 이는 다를 수 있습니다.
어쩌면 두 가지 유형의 코어가 있는 단일 프로세서일 수도 있고, 한 가지 유형의 코어(0, 4, 8...)에 대해서는 숫자에 차이가 있지만 다른 유형의 코어(36..39)에는 차이가 없을 수도 있습니다.
자세히 알아보려면 정확한 프로세서 모델(예: 사용되는 출력 lscpu | head -14
)을 결정한 다음 해당 프로세서 모델에 대한 기술 문서를 연구하여 하드웨어/마이크로코드 수준에서 코어 ID가 할당되는 방식을 이해해야 합니다.
마더보드/펌웨어가 코어 ID 할당을 지정할 수 없는 경우 CPU 제조업체가 더 많은 유형 1 코어를 갖춘 차세대 프로세서를 계획하고 있을 수 있다고 추측할 수 있습니다(즉, 번호 지정의 공백을 부분적으로 또는 완전히 메움). 하지만 그건 추측일 뿐이고, 제조사의 계획은 어차피 바뀔 수도 있으니까요...
답변2
sensors
그러나 이 대답은 아마도 당신을 놀라게 하지 않을 것입니다. 왜냐하면 그것이 쓰여진 방식이기 때문입니다.
sensors
sensors_get_detected_chips
CPU 코어를 거치는 대신 모든 센서를 반복하는 데 사용됩니다 . 이러한 센서 시퀀스는 CPU 코어 수의 (상대적으로 임의적인) 순서가 아닌 관련 버스(주로 I²C/SMBUS, 아날로그 ISA)에서 "감지"됩니다.