🐧 Linux

투명 거대 페이지

개요

투명 거대 페이지(Transparent Huge Pages, THP)는 Linux 커널이 기본 페이지(4KB)보다 큰 페이지(2MB, 1GB 등)를 자동으로 할당하여 TLB(Translation Lookaside Buffer) 효율성을 높이는 메모리 관리 기술입니다. THP는 응용 프로그램의 수정 없이 투명하게 동작하며, page fault 횟수를 줄이고 메모리 접근 성능을 향상시킵니다.

최신 커널에서는 mTHP(multi-size THP)를 지원하여, 기본 페이지보다 크지만 PMD-size보다 작은 중간 크기(16KB, 32KB, 64KB 등)의 페이지도 사용할 수 있게 되었습니다. 이를 통해 지연 시간 급증을 최소화하면서도 TLB 효율성을 확보할 수 있습니다.

투명 거대 페이지 개요

그림 1. Linux 투명 거대 페이지 기술 분류와 적용 계층

핵심 개념

THP (Transparent Huge Pages)

THP는 기본 페이지보다 큰 페이지를 사용해 page fault 수와 TLB miss를 줄이는 기능입니다. PMD(Page Middle Directory) 크기의 큰 페이지(보통 2MB)를 사용하여 하나의 TLB 엔트리가 더 넓은 가상 주소 공간을 매핑합니다.

  • THP는 주로 anonymous memory와 tmpfs/shmem에 적용되며, 일반 파일 시스템 페이지 캐시는 기본적으로 직접 대상이 아닙니다.
  • 커널은 자동으로 작은 페이지를 큰 페이지로 병합(collapse)하거나, 큰 페이지를 작은 페이지로 분할(split)합니다.
  • khugepaged 커널 스레드가 백그라운드에서 장수명 매핑을 스캔하여 작은 페이지를 큰 페이지로 병합합니다.
  • madvise(MADV_HUGEPAGE)prctl(PR_SET_THP_DISABLE)로 프로세스 단위 제어가 가능합니다.
  • 최근 커널에서는 madvise(MADV_COLLAPSE)로 특정 범위를 즉시 PMD-size THP로 병합하도록 요청할 수 있습니다.

mTHP (multi-size THP)

mTHP는 PMD-size보다 작은 중간 크기의 거대 페이지를 지원하는 최신 기술입니다. 16KB, 32KB, 64KB, 128KB 같은 크기의 페이지를 사용하여 THP의 이점을 부분적으로 누릴 수 있습니다.

  • mTHP는 PTE-mapped되며, PMD-mapped THP보다 작은 단위로 page fault 수를 줄입니다.
  • 지연 시간 급등이 PMD-size THP보다 적어 실시간 응용 프로그램에 적합합니다.
  • 일부 아키텍처에서는 연속된 PTE의 압축(TLB compression)을 통해 더 많은 TLB 엔트리를 저장할 수 있습니다.
  • /sys/kernel/mm/transparent_hugepage/hugepages-<size>kB/enabled로 크기별 정책을 설정할 수 있습니다.
  • 여러 크기를 동시에 활성화하면 커널이 가능한 후보 중 가장 적절한 크기를 선택합니다.

khugepaged

khugepaged는 장수명 매핑을 스캔하여 작은 페이지를 큰 페이지로 병합하는 커널 스레드입니다.

  • 백그라운드에서 주기적으로 메모리 영역을 스캔합니다.
  • anonymous memory는 PMD-size THP와 mTHP 후보가 될 수 있고, file/shmem 쪽 병합은 현재 PMD-size 중심으로 동작합니다.
  • 병합 조건은 max_ptes_none, max_ptes_swap, max_ptes_shared 파라미터로 제어됩니다.
  • 병합 진행 상황은 pages_collapsed, full_scans 같은 khugepaged 카운터로 관찰할 수 있습니다.

defrag 정책

THP 할당 시 메모리 단편화로 인해 큰 페이지를 확보할 수 없는 경우, defrag 정책에 따라 다르게 동작합니다.

  • always: 큰 페이지 할당 실패 시 즉시 메모리 컴팩션을 수행하여 할당을 시도합니다.
  • defer: 백그라운드에서 kswapd와 kcompactd를 깨워 향후 큰 페이지 사용을 준비합니다.
  • defer+madvise: MADV_HUGEPAGE 영역에서만 always처럼 동작하고, 나머지는 defer로 동작합니다.
  • madvise: MADV_HUGEPAGE 영역에서만 즉시 컴팩션을 수행합니다 (기본값).
  • never: 큰 페이지를 위해 컴팩션을 수행하지 않습니다.

운영 제어 포인트

  • 전역 정책은 /sys/kernel/mm/transparent_hugepage/enabled와 크기별 hugepages-<size>kB/enabled에서 설정합니다.
  • 기본값은 보통 PMD-size만 inherit, 나머지 크기는 never인 경우가 많아 mTHP는 명시적으로 켜야 하는 시스템이 있습니다.
  • PR_SET_THP_DISABLE로 프로세스 전체에서 THP를 끄거나, advised 영역만 허용하는 모드를 사용할 수 있습니다.
  • tmpfs는 huge= 마운트 옵션과 shmem_enabled 계열 sysfs로 별도 정책을 가질 수 있습니다.

비교/분석

기술 페이지 크기 매핑 방식 TLB 효율 지연 시간 메모리 낭비 적합한 워크로드
THP (PMD-size) 2MB PMD-mapped 매우 높음 높음 (컴팩션) 높음 대용량 데이터셋, DB
mTHP 16KB~1MB PTE-mapped 높음 낮음 중간 실시간, 범용
기본 페이지 4KB PTE-mapped 낮음 낮음 없음 소규모, 메모리 제한
hugetlbfs 2MB/1GB 예약 기반 매우 높음 없음 (예약) 매우 높음 HPC, 특수 응용

THP와 hugetlbfs의 가장 큰 차이는 자동성입니다. THP는 커널이 fault 시점과 백그라운드 병합 시점에 승격과 강등을 수행하지만, hugetlbfs는 사전 예약과 명시적 사용을 전제로 합니다. 운영 환경에서는 지연 시간 상한이 중요한 경우 mTHP 또는 madvise 정책이 더 안전하고, 최대 TLB 도달률이 중요한 경우 PMD-size THP나 hugetlbfs가 더 유리합니다.

동작 원리

THP 할당 및 병합 흐름

  1. 응용 프로그램이 메모리를 할당하면 커널은 THP 정책을 확인합니다.
  2. always 정책이면 큰 페이지를 즉시 할당 시도하고, 실패 시 컴팩션을 수행합니다.
  3. madvise 정책이면 MADV_HUGEPAGE로 표시된 영역에서만 큰 페이지를 할당합니다.
  4. khugepaged가 백그라운드에서 스캔하여 연속된 작은 페이지를 큰 페이지로 병합합니다.
  5. 병합 시 max_ptes_none 이하의 빈 페이지가 허용됩니다.
  6. 큰 페이지가 메모리 압박이나 분할 필요 시 작은 페이지로 다시 분할됩니다.
THP/mTHP 동작 흐름

그림 2. fault 경로, 정책 분기, khugepaged 병합이 만나는 실제 운영 흐름

할당 경로:
  App malloc → Kernel THP Policy Check → Hugepage Allocate → [Optional: Compaction]

병합 경로:
  khugepaged Scan → Candidate Pages → Collapse to Hugepage

분할 경로:
  Memory Pressure → Split Hugepage → Base Pages

mTHP 동작 원리

  1. 커널은 사용 가능한 mTHP 크기(16KB, 32KB, 64KB 등)를 관리합니다.
  2. 메모리 할당 시 크기별 정책(always/madvise/never)에 따라 mTHP를 할당합니다.
  3. mTHP는 PTE-mapped되므로 기존 페이지 테이블 구조와 호환됩니다.
  4. khugepaged는 anonymous memory에 대해 mTHP 크기로도 병합을 시도합니다.
  5. 일부 아키텍처에서는 연속된 mTHP의 TLB 압축을 통해 추가적인 성능 향상을 제공합니다.

PMD-size THP는 한 번 성공하면 TLB 커버리지가 가장 크지만, fault 한 번당 초기화해야 할 메모리 양도 큽니다. 반대로 mTHP는 단일 fault 비용과 compaction 압력을 낮추는 대신, 같은 워킹셋을 덮는 데 더 많은 엔트리가 필요합니다. 최근 커널이 mTHP를 강조하는 이유는 이 지점에서 처리량과 tail latency를 더 세밀하게 절충할 수 있기 때문입니다.

모니터링 방법

  • /proc/meminfoAnonHugePages: 시스템에서 사용 중인 PMD-size THP 양
  • /proc/PID/smapsAnonHugePages: 프로세스별 THP 사용량
  • /proc/vmstatthp_fault_alloc: THP 할당 성공 횟수
  • /proc/vmstatthp_collapse_alloc: khugepaged 병합 성공 횟수
  • /proc/vmstatthp_fault_fallback: THP 할당 실패 후 기본 페이지 사용 횟수
  • /proc/vmstatcompact_stall: 컴팩션으로 인한 지연 횟수
  • /proc/vmstatthp_split_page, thp_deferred_split_page: 분할이 얼마나 자주 일어나는지 확인
  • /sys/kernel/mm/transparent_hugepage/hugepages-<size>kB/stats/: 크기별 mTHP 성공/실패 확인

장단점

장점

  • page fault 횟수를 크게 줄여 커널 진입 빈도를 낮춥니다.
  • TLB miss 시 더 넓은 주소 공간을 매핑하여 TLB 효율성을 향상시킵니다.
  • 특히 가상 머신 환경에서 nested page table의 TLB miss 비용을 크게 줄입니다.
  • mTHP는 지연 시간 급증을 최소화하면서도 중간 수준의 TLB 효율을 제공합니다.
  • 응용 프로그램 수정 없이 투명하게 동작합니다.
  • khugepaged가 백그라운드에서 자동으로 큰 페이지를 확보합니다.

단점

  • 큰 페이지 할당을 위한 컴팩션이 CPU 오버헤드와 지연을 유발할 수 있습니다.
  • 메모리 단편화가 심한 시스템에서는 큰 페이지 확보가 어려울 수 있습니다.
  • 약간의 메모리 낭비가 발생할 수 있습니다 (일부 페이지만 사용되는 경우).
  • 실시간 응용 프로그램에서는 컴팩션 지연이 문제될 수 있습니다.
  • 메모리 압박 시 큰 페이지 분할 비용이 발생합니다.
  • 일부 워크로드에서는 THP 사용 시 성능이 오히려 저하될 수 있습니다.
  • MADV_COLLAPSE와 공격적인 collapse 설정은 예기치 않은 메모리 사용 증가를 부를 수 있습니다.

관련 기술

핵심 정리

투명 거대 페이지(THP)는 Linux 커널이 기본 페이지보다 큰 페이지를 자동으로 할당하여 TLB 효율성을 높이는 메모리 관리 기술입니다. PMD-size THP는 2MB 크기의 큰 페이지를 사용하여 page fault와 TLB miss를 크게 줄이며, mTHP는 중간 크기의 페이지를 통해 지연 시간 급증을 최소화하면서도 성능 향상을 제공합니다. khugepaged가 백그라운드에서 작은 페이지를 큰 페이지로 병합하며, defrag 정책을 통해 컴팩션 동작을 제어할 수 있습니다. 큰 페이지는 TLB 효율성을 높이지만, 컴팩션 비용과 메모리 낭비라는 트레이드오프가 존재하므로 워크로드에 맞는 설정이 필요합니다.