Linux가 "가능한" CPU 수를 감지하는 방법

Linux가 "가능한" CPU 수를 감지하는 방법

저는 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을 가정하고 있습니다.

관련 정보