Huge Pages·THP·Memory Ballooning으로 메모리 효율 다루기
Huge Pages, Transparent Huge Pages, Memory Ballooning의 동작 방식과 워크로드별 메모리 최적화 판단 기준
2026-08-14 · 최초 발행 2026-01-19
페이지 수가 많아질수록 커지는 메모리 관리 부담
표준 4KB 페이지는 대용량 메모리에서 페이지 테이블과 TLB에 부담을 준다. Huge Pages는 더 큰 단위로 메모리를 매핑해 이 부담을 낮추고, Transparent Huge Pages(THP)는 그 처리를 커널이 자동으로 수행하게 한다. 가상화 환경에서는 Memory Ballooning이 호스트와 게스트 사이의 메모리 배분을 조절한다.
64GB 메모리를 4KB 페이지로 관리하면 페이지 테이블에 약 128MB가 필요하다. 페이지 수가 늘수록 TLB 미스와 페이지 테이블 탐색 오버헤드도 커진다.
| 메트릭 | 4KB 페이지 | 2MB Huge Pages | 개선율 |
|---|---|---|---|
| TLB 엔트리당 커버 | 4KB | 2MB | 512배 |
| 페이지 테이블 크기 | 100% | 0.2% | 500배 감소 |
| TLB 미스율 | 높음 | 낮음 | 80% 감소 |
| 메모리 접근 지연 | 기준 | -15~30% | 성능 향상 |
명시적으로 Huge Pages를 할당할 때
Huge Pages는 스왑되지 않으므로 물리 메모리에 계속 상주한다. 데이터베이스나 가상 머신처럼 대량의 메모리를 안정적으로 사용하는 워크로드에 맞지만, 과도하게 예약하면 일반 프로세스의 메모리가 부족해질 수 있다. 메모리 단편화가 심한 경우에는 할당 자체가 실패할 수 있다.
# Huge Pages 크기 확인
cat /proc/meminfo | grep Huge
# 2MB Huge Pages 1024개 할당 (2GB)
echo 1024 > /proc/sys/vm/nr_hugepages
# 영구 설정
echo "vm.nr_hugepages = 1024" >> /etc/sysctl.conf
# Huge Pages 마운트
mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
애플리케이션은 Huge Pages 사용 가능 여부에 따라 hugetlbfs와 mmap()을 이용해 2MB 단위 메모리를 매핑하거나, 일반 할당 경로를 사용한다.
자동 병합을 맡기는 THP의 조건
THP는 khugepaged가 백그라운드에서 페이지를 살피며 연속된 4KB 페이지를 2MB Huge Page로 병합하는 방식이다. 메모리 압박이 발생하면 다시 분할할 수 있으며, 애플리케이션 코드를 바꾸지 않아도 적용된다.
코드 수정 없이 시스템 전체에 적용하고, 메모리 사용 패턴에 맞춰 활성화와 비활성화를 조정할 수 있다는 점은 장점이다. 반면 khugepaged의 CPU 오버헤드, 단편화에 따른 지연, compaction 중의 일시적 지연은 운영 시 확인할 대상이다. Redis와 MongoDB 같은 특정 워크로드에서는 성능 저하가 발생할 수 있다.
# THP 상태 확인
cat /sys/kernel/mm/transparent_hugepage/enabled
# THP 활성화
echo always > /sys/kernel/mm/transparent_hugepage/enabled
# THP 비활성화
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# madvise 모드 (애플리케이션이 명시적으로 요청 시에만)
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
오버커밋 환경에서 메모리를 되돌리는 Ballooning
가상화 환경에서는 VM마다 메모리가 독립적으로 할당된다. 호스트의 전체 물리 메모리보다 큰 규모로 할당하는 오버커밋도 가능하지만, VM 간 사용량이 불균형하면 유휴 메모리가 비효율적으로 남는다.
Memory Ballooning은 하이퍼바이저의 신호에 따라 게스트 안의 Balloon 드라이버가 메모리를 잡거나 해제하는 방식이다. 메모리가 부족할 때는 게스트에서 확보한 페이지를 하이퍼바이저에 돌려주고, 하이퍼바이저는 이를 다른 VM에 배정한다. 여유가 생기면 Balloon이 잡고 있던 페이지를 해제해 게스트 OS가 다시 사용할 수 있게 한다.
워크로드와 측정 결과로 설정을 고른다
| 워크로드 | Huge Pages | THP | Ballooning |
|---|---|---|---|
| 데이터베이스 | 권장 (명시적) | 비권장 | N/A |
| 가상 머신 | 게스트 내부 | 선택적 | 필수 |
| 컨테이너 | 선택적 | 권장 | N/A |
| Redis/MongoDB | 비권장 | 비활성화 | N/A |
| HPC | 권장 | 권장 | N/A |
설정 전후에는 Huge Pages 사용량, THP 병합 통계, Ballooning 상태를 함께 확인한다.
# Huge Pages 사용량
grep Huge /proc/meminfo
# THP 통계
cat /sys/kernel/mm/transparent_hugepage/khugepaged/pages_collapsed
# Ballooning 상태 (KVM 기준)
virsh dommemstat vm-name
기준 성능을 먼저 기록하고 최적화 기법을 적용한 뒤 메트릭을 관찰한다. 개선이 확인되면 설정을 유지하고, 그렇지 않으면 되돌린 뒤 다른 기법을 검토한다.
데이터베이스 서버에서는 명시적 Huge Pages 설정으로 15-30% 성능 향상과 THP 비활성화에 따른 지연 시간 편차 감소를 기대할 수 있다. 고정된 메모리 크기는 성능 예측에도 도움이 된다.
가상화 플랫폼에서는 Memory Ballooning으로 호스트 메모리 활용률을 30% 높이고, VM 밀도 증가에 따라 하드웨어 비용을 줄일 수 있다. 워크로드 변화에는 동적 메모리 조정으로 대응한다.
컨테이너 환경에서는 THP를 통한 투명한 최적화와 컨테이너별 메모리 제한의 조화가 필요하며, 빠른 시작 시간을 유지하는 방향으로 적용한다.