[Linux:Kernel] CPU 토폴로지

이 문서의 저작권은 GPL 라이센스를 따릅니다(This document is released under the GPL license).

Documentation/cputopology.txt

번역: 양정석(dasomoli@gmailREMOVETHIS.com)

CPU 토폴로지는 sysfs를 통해 노출됩니다. 항목(속성들)은 /proc/cpuinfo와
유사합니다.

1) /sys/devices/system/cpu/cpuX/topology/physical_package_id:

        cpuX의 물리적인 패키지 ID. 일반적으로 물리적인 소켓 번호에
        해당하지만, 실제 값은 아키텍처와 플랫폼에 따라 다릅니다.

2) /sys/devices/system/cpu/cpuX/topology/core_id:

        cpuX의 CPU 코어 ID. 일반적으로 (커널의 것 보다는) 하드웨어
        플랫폼의 식별자입니다. 실제 값은 아키텍처와 플랫폼에 따라
        다릅니다.

3) /sys/devices/system/cpu/cpuX/topology/book_id:

        cpuX의 Book ID. 일반적으로 (커널의 것 보다는) 하드웨어 플랫폼의
        식별자입니다. 실제 값은 아키텍처와 플랫폼에 따라 다릅니다.

4) /sys/devices/system/cpu/cpuX/topology/thread_siblings:

        cpuX와 같은 코어 내부의 cpuX의 하드웨어 스레드들의 내부 커널 맵

5) /sys/devices/system/cpu/cpuX/topology/core_siblings:

        같은 물리적 패키지 ID(physical_package_id) 내부의 cpuX의
        하드웨어 스레드들의 내부 커널 맵

6) /sys/devices/system/cpu/cpuX/topology/book_siblings:

        같인 Book ID(book_id) 내부의 cpuX의 하드웨어 스레드들의 내부
        커널 맵

아키텍처에 자연스러운 방법으로 구현하기 위해서, 새로운 소스 파일,
drivers/base/topology.c는 4 에서 6 개의 속성들을 드러냅니다. sysfs
파일들에 관련된 두 book 은 CONFIG_SCHED_BOOK 이 선택되었을 경우에만
생성될 것입니다.

이 기능을 지원하는 아키텍처를 위해서, include/asm-XXX/topology.h 안에
이들 매크로들 중 몇가지가 정의되어야만 합니다:
#define topology_physical_package_id(cpu)
#define topology_core_id(cpu)
#define topology_book_id(cpu)
#define topology_thread_cpumask(cpu)
#define topology_core_cpumask(cpu)
#define topology_book_cpumask(cpu)

**_id의 타입은 int 입니다.
sibling의 타입은 (const) struct cpumask * 입니다.

모든 아키텍처에 일관되도록, include/linux/topology.h 는
include/asm-XXX/topoloty.h 에서 정의하지 않는 위들 매크로 중 무엇을 위한
기본 정의를 제공합니다:
1) physical_package_id: -1
2) core_id: 0
3) thread_siblings: 그냥 주어진 CPU
4) core_siblings: 그냥 주어진 CPU

Book(CONFIG_SCHED_BOOK)을 지원하지 않는 아키텍처에는 topology_book_id() 와
topology_book_cpumask() 의 기본 정의가 없습니다.
추가적으로, CPU 토폴로지 정보는 /sys/devices/system/cpu 아래에서 제공되고,
이들 파일을 포함합니다. 출력의 내부 소스는 브라켓들(“[]”) 안에 있습니다.

    kernel_max: 커널 설정[NR_CPUS-1]에서 허용되는 최고 CPU 인덱스

    offline:    핫플러그 오프(HOTPLUGGED off:cpu-hotplug.txt 참고)되었거나,
                커널 설정(위의 kernel_max)에서 허용되는 CPU들의 제한을
                초과핬기 때문에 온라인이 아닌 CPU들.
                [~cpu_online_mask + cpus >= NR_CPUS]

    online:     온라인이고 스케줄 중인 CPU들 [cpu_online_mask]

    possible:   자원을 할당받았고, 지금 존재하면 온라인이 될 수 있는
                CPU들. [cpu_possible_mask]

    present:    시스템에 현재 존재하고 있는 것으로 식별된 CPU들.
                [cpu_present_mask]

위 출력의 형식은 cpulist_parse()[<linux/cpumask.h>]와 호환됩니다.
아래 예제가 있습니다.

이 예제에서, 64개의 CPU들이 시스템 내부에 있지만, CPU 32-63은 32로
된 NR_CPUS 설정 옵션에 의해 0..31 로 제한된 커널 최고값을 초과했습니다.
CPU 2와 4-31들은 온라인이 아니지만, 존재(present)하고, 가능(possbile)하므로
온라인이 될 수 있습니다.

     kernel_max: 31
        offline: 2,4-31,32-63
         online: 0-1,3
       possible: 0-31
        present: 0-31

이 예제에서, NR_CPUS 설정 옵션은 128이지만, 커널은 possible_cpus=144로
시작되었습니다. 시스템 내에 4개의 CPU가 있고, cpu2는 수동으로 오프라인이
되었습니다(그리고, 그 하나의 CPU만 온라인이 될 수 있습니다).

     kernel_max: 127
        offline: 2,4-127,128-143
         online: 0-1,3
       possible: 0-127
        present: 0-3

possible_cpus=숫자 시작 파라미터는 다양한 cpumask 의 더 많은 정보로
좋은 cpu-hotplug.txt 를 보세요.