투명 거대 페이지
개요
투명 거대 페이지(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 할당 및 병합 흐름
- 응용 프로그램이 메모리를 할당하면 커널은 THP 정책을 확인합니다.
always정책이면 큰 페이지를 즉시 할당 시도하고, 실패 시 컴팩션을 수행합니다.madvise정책이면MADV_HUGEPAGE로 표시된 영역에서만 큰 페이지를 할당합니다.khugepaged가 백그라운드에서 스캔하여 연속된 작은 페이지를 큰 페이지로 병합합니다.- 병합 시
max_ptes_none이하의 빈 페이지가 허용됩니다. - 큰 페이지가 메모리 압박이나 분할 필요 시 작은 페이지로 다시 분할됩니다.
그림 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 동작 원리
- 커널은 사용 가능한 mTHP 크기(16KB, 32KB, 64KB 등)를 관리합니다.
- 메모리 할당 시 크기별 정책(always/madvise/never)에 따라 mTHP를 할당합니다.
- mTHP는 PTE-mapped되므로 기존 페이지 테이블 구조와 호환됩니다.
- khugepaged는 anonymous memory에 대해 mTHP 크기로도 병합을 시도합니다.
- 일부 아키텍처에서는 연속된 mTHP의 TLB 압축을 통해 추가적인 성능 향상을 제공합니다.
PMD-size THP는 한 번 성공하면 TLB 커버리지가 가장 크지만, fault 한 번당 초기화해야 할 메모리 양도 큽니다. 반대로 mTHP는 단일 fault 비용과 compaction 압력을 낮추는 대신, 같은 워킹셋을 덮는 데 더 많은 엔트리가 필요합니다. 최근 커널이 mTHP를 강조하는 이유는 이 지점에서 처리량과 tail latency를 더 세밀하게 절충할 수 있기 때문입니다.
모니터링 방법
/proc/meminfo의AnonHugePages: 시스템에서 사용 중인 PMD-size THP 양/proc/PID/smaps의AnonHugePages: 프로세스별 THP 사용량/proc/vmstat의thp_fault_alloc: THP 할당 성공 횟수/proc/vmstat의thp_collapse_alloc: khugepaged 병합 성공 횟수/proc/vmstat의thp_fault_fallback: THP 할당 실패 후 기본 페이지 사용 횟수/proc/vmstat의compact_stall: 컴팩션으로 인한 지연 횟수/proc/vmstat의thp_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 설정은 예기치 않은 메모리 사용 증가를 부를 수 있습니다.
관련 기술
- Linux 메모리 관리 기초
- Linux 메모리 최적화
- Linux Memory Tiering Deep
- Virtual Memory
- CPU Cache Architecture
- Linux Kernel Documentation: Transparent Hugepage Support
- mTHP (multi-size THP) 지원
- LWN.net: Multi-size THP
- Andrea Arcangeli, "Transparent Hugepage Support", Linux kernel patch, 2009
- Jonathan Corbet, "Multi-size THP", LWN.net, 2023
핵심 정리
투명 거대 페이지(THP)는 Linux 커널이 기본 페이지보다 큰 페이지를 자동으로 할당하여 TLB 효율성을 높이는 메모리 관리 기술입니다. PMD-size THP는 2MB 크기의 큰 페이지를 사용하여 page fault와 TLB miss를 크게 줄이며, mTHP는 중간 크기의 페이지를 통해 지연 시간 급증을 최소화하면서도 성능 향상을 제공합니다. khugepaged가 백그라운드에서 작은 페이지를 큰 페이지로 병합하며, defrag 정책을 통해 컴팩션 동작을 제어할 수 있습니다. 큰 페이지는 TLB 효율성을 높이지만, 컴팩션 비용과 메모리 낭비라는 트레이드오프가 존재하므로 워크로드에 맞는 설정이 필요합니다.