7.3. HugeTLB Huge Pages 구성
Red Hat Enterprise Linux 7.1부터는
부팅
시와 런타임
시 대규모 페이지를 예약하는 두 가지 방법이 있습니다. 부팅 시 예약은 메모리가 아직 많이 조각화되어 있지 않으므로 성공할 가능성이 높습니다. 그러나 NUMA 시스템에서 페이지 수는 NUMA 노드 간에 자동으로 분할됩니다. 런타임 방법을 사용하면 NUMA 노드당 대규모 페이지를 예약할 수 있습니다. 부팅 프로세스에서 런타임 예약이 가능한 한 빨리 수행되면 메모리 조각화 가능성이 낮습니다.
7.3.1. 부팅 시 대규모 페이지 구성
부팅 시 대규모 페이지를 구성하려면 커널 부팅 명령줄에 다음 매개변수를 추가합니다.
- hugepages
- 부팅 시 커널에 구성된 영구 대규모 페이지 수를 정의합니다. 기본값은 0입니다. 시스템에 물리적으로 연속된 무료 페이지가 충분한 경우에만 대규모 페이지를 할당할 수 있습니다. 이 매개변수로 예약된 페이지는 다른 용도로 사용할 수 없습니다.이 값은 부팅 후
/proc/sys/vm/nr_hugepages
파일의 값을 변경하여 조정할 수 있습니다.NUMA 시스템에서 이 매개변수로 할당된 대규모 페이지는 노드 간에 동일하게 나뉩니다. 노드의/sys/devices/node/node/node_id/hugepages-1048576kB/nr_hugepages
파일의 값을 변경하여 런타임 시 대규모 페이지를 할당할 수 있습니다.자세한 내용은 기본적으로/usr/share/doc/kernel-doc-kernel_version/Documentation/vm/hugetlbpage.txt
에 설치된 관련 커널 문서를 참조하십시오. - hugepagesz
- 부팅 시 커널에 구성된 영구 대규모 페이지의 크기를 정의합니다. 유효한 값은 2MB 및 1GB입니다. 기본값은 2MB입니다.
- default_hugepagesz
- 부팅 시 커널에 구성된 영구 대규모 페이지의 기본 크기를 정의합니다. 유효한 값은 2MB 및 1GB입니다. 기본값은 2MB입니다.
커널 부팅 명령줄에 매개변수를 추가하는 방법에 대한 자세한 내용은 Chapter 3을 참조하십시오. Red Hat Enterprise Linux 7 커널 관리 가이드의 커널 매개변수 및 값 나열.
절차 7.1. 조기 부팅 중 1GB 페이지 예약
HugeTLB 하위 시스템에서 지원하는 페이지 크기는 아키텍처에 따라 다릅니다. AMD64 및 Intel 64 아키텍처에서는 2MB의 대규모 페이지 및 1GB gigantic 페이지가 지원됩니다.
/etc/default/grub
파일의 커널 명령줄 옵션에 다음 행을 추가하여 1GB 페이지용 HugeTLB 풀을 root로 생성합니다.default_hugepagesz=1G hugepagesz=1G
- 편집된 기본 파일을 사용하여 GRUB2 설정을 다시 생성합니다. 시스템에서 BIOS 펌웨어를 사용하는 경우 다음 명령을 실행합니다.
# grub2-mkconfig -o /boot/grub2/grub.cfg
UEFI 펌웨어가 있는 시스템에서 다음 명령을 실행합니다.# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
- 다음 콘텐츠를 사용하여
/usr/lib/systemd/system/hugetlb-gigantic-pages.service
라는 파일을 만듭니다.[Unit] Description=HugeTLB Gigantic Pages Reservation DefaultDependencies=no Before=dev-hugepages.mount ConditionPathExists=/sys/devices/system/node ConditionKernelCommandLine=hugepagesz=1G [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/lib/systemd/hugetlb-reserve-pages.sh [Install] WantedBy=sysinit.target
- 다음 콘텐츠를 사용하여
/usr/lib/systemd/hugetlb-reserve-pages.sh
파일을 만듭니다.#!/bin/sh nodes_path=/sys/devices/system/node/ if [ ! -d $nodes_path ]; then echo "ERROR: $nodes_path does not exist" exit 1 fi reserve_pages() { echo $1 > $nodes_path/$2/hugepages/hugepages-1048576kB/nr_hugepages } reserve_pages number_of_pages node
마지막 줄에서 number_of_pages 를 예약할 1GB 페이지 수와 node 를 해당 페이지를 예약할 노드 이름으로 바꿉니다.예 7.1.
node0
및node1
에 페이지 예약예를 들어node0
에 1GB페이지를 2개 예약하고 1GB페이지를node1
에 예약하려면 마지막 행을 다음 코드로 교체합니다.reserve_pages 2 node0 reserve_pages 1 node1
필요에 따라 수정하거나 다른 노드에서 메모리를 예약하기 위해 더 많은 행을 추가할 수 있습니다. - 스크립트를 실행 가능하게 만듭니다.
# chmod +x /usr/lib/systemd/hugetlb-reserve-pages.sh
- 초기 부팅 예약을 활성화합니다.
# systemctl enable hugetlb-gigantic-pages
참고
언제든지
nr_hugepages
에 작성하여 런타임 시 더 많은 1GB 페이지를 예약할 수 있습니다. 그러나 메모리 조각화로 인한 실패를 방지하려면 부팅 프로세스 중에 초기에 1GB 페이지를 예약하십시오.
7.3.2. 실행 시 대규모 페이지 구성
다음 매개변수를 사용하여 런타임에 대규모 페이지 동작에 영향을 미칩니다.
- /sys/devices/system/node/node_id/hugepages/hugepages-size/nr_hugepages
- 지정된 NUMA 노드에 할당된 지정된 크기의 대규모 페이지 수를 정의합니다. 이는 Red Hat Enterprise Linux 7.1에서 지원됩니다. 다음 예제는 20개의 2048 kB 대규모 페이지를
node2
에 추가합니다.# numastat -cm | egrep 'Node|Huge' Node 0 Node 1 Node 2 Node 3 Total add AnonHugePages 0 2 0 8 10 HugePages_Total 0 0 0 0 0 HugePages_Free 0 0 0 0 0 HugePages_Surp 0 0 0 0 0 # echo 20 > /sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages # numastat -cm | egrep 'Node|Huge' Node 0 Node 1 Node 2 Node 3 Total AnonHugePages 0 2 0 8 10 HugePages_Total 0 0 40 0 40 HugePages_Free 0 0 40 0 40 HugePages_Surp 0 0 0 0 0
- /proc/sys/vm/nr_overcommit_hugepages
- 메모리 과다 할당을 통해 시스템에서 생성하고 사용할 수 있는 최대 대규모 페이지 수를 정의합니다. 이 파일에 0이 아닌 값을 작성하면 영구적인 대규모 페이지 풀이 소진되면 시스템이 커널의 일반 페이지 풀에서 대규모 페이지 수를 얻을 수 있음을 나타냅니다. 이 서한 대규모 페이지가 사용되지 않으면 해제되고 커널의 일반 페이지 풀로 돌아갑니다.