저는 8개의 코어와 코어당 2개의 스레드를 갖춘 AMD CPU를 가지고 있습니다. Linux는 (정확하게) 이것을 16 "cpus"로 표시합니다. 그러나 sysfs는 실제로 32개의 "가능한" CPU를 표시하며 그 중 16개는 존재하지 않으며 오프라인 상태입니다.
$ cat /sys/devices/system/cpu/possible
0-31
$ cat /sys/devices/system/cpu/present
0-15
$ cat /sys/devices/system/cpu/online
0-15
$ cat /sys/devices/system/cpu/offline
16-31
분명히 말하면 여기에는 잘못된 것이 없습니다. 실제로 16개의 논리적 CPU가 존재하고 온라인 상태입니다. 나에게 명확하지 않은 것은 Linux가 존재하지 않지만 존재할 수 있는 추가 16개의 논리적 CPU를 감지하는 이유입니다.
나는 이것이 관련 커널 문서라고 생각합니다.https://www.kernel.org/doc/html/latest/core-api/cpu_hotplug.html. 그러나 가능한 CPU 수를 선택하는 방법에 대한 지침은 없습니다. ( kernel_max
내 시스템의 CPU 번호인 8191 보다 훨씬 낮습니다 .)
(약간의 추가 배경 정보: 이 값을 구문 분석해야 하는 코드가 있습니다. 옳은 일을 할 만큼 간단해 보이지만 명확한 독스트링 설명이 필요합니다.왜가능한 CPU 수는 일반적인 데스크탑 컴퓨터에서 사용 가능한 CPU 수를 초과할 수 있습니다. )
답변1
커널 메모리에 충분한 공간이 있으면 CPU가 "가능"합니다. 가능한 CPU 수는 시작 후 핫 스왑 가능한 CPU를 포함하여 온라인 상태가 될 수 있는 최대 CPU 수입니다.
sysfs의 이 부분에 대한 문서는 다음과 같습니다.sysfs를 통해 CPU 토폴로지 정보를 내보내는 방법:
가능: 리소스가 할당되어 있고 온라인 상태가 될 수 있는 CPU입니다(있는 경우). [cpu_가능한_마스크]
그러나 더 자세한 문서 cpu_possible_mask
는커널의 CPU 핫 플러그:
시스템에서 사용할 수 있는 CPU의 비트맵입니다. 이는 CPU가 사용 가능해지거나 제거될 때 늘어나거나 줄어들지 않는 per_cpu 변수에 일부 시작 메모리를 할당하는 데 사용됩니다. 부팅 시간 검색 단계에서 설정되면 맵은 정적입니다. 즉, 언제든지 비트가 추가되거나 제거되지 않습니다. 사전에 시스템 요구 사항에 맞게 정확하게 조정하면 부팅 시간 메모리를 절약할 수 있습니다.
이 매개변수는 다음을 통해 구성할 수 있습니다.명령줄 옵션. 가능하다면 하드웨어가 재부팅 없이 다른 CPU 연결을 지원하지 않으며 시스템을 최대 절전 모드로 전환하여 더 많은 CPU 웨이크업을 사용하도록 할 계획이 없다면 possible_cpus=16
명령줄에 전달하여 소량의 커널 메모리를 절약 할 수 있습니다. . 일반적인 PC나 서버에서는 이 양이 너무 작아서 노력할 가치가 없을 수 있습니다.
명령줄 옵션이 없으면 필요하다고 생각합니다.소스 코드 읽기무슨 일이 일어나고 있는지 알아보세요. 커널이 CPU 핫플러그 지원( CONFIG_HOTPLUG_CPU
) 없이 컴파일되면 시작 시 사용 가능한 CPU 수만 확인됩니다. prefill_possible_map
소스 코드의 설명 에 따라 커널에 CPU 핫플러그 지원이 있는 경우 :
- BIOS가 ACPI/mptables에 비활성화된 CPU를 지정하면 해당 CPU가 사용됩니다.
- 사용자는 available_cpus=NUM으로 이를 재정의할 수 있습니다.
- 그렇지 않으면 추가 CPU를 예약하지 마십시오.
이것이 코드가 수행하는 작업인지 확인하지 않았습니다.
"가능한 CPU"의 의미는 모든 아키텍처에 적용되지만 CPU 수를 결정하는 방법은 아키텍처마다 다릅니다. 내 대답에서는 x86을 가정하고 있습니다.