한 줄 요약
THP는 커널이 기본 4KB 페이지 대신 2MB 대형 페이지를 애플리케이션 수정 없이 자동으로 사용하게 해주는 기능으로, TLB 커버리지를 늘려 TLB miss를 줄이고, miss 시에도 page table walk 단계를 줄여 성능을 높입니다.
필요한 이유
문제 상황 : "TLB 엔트리가 1000개라고 가정"
4KB 페이지 : 1000 x 4KB = 4MB만 커버
-> 프로세스가 1GB 쓰면 대부분 TLB miss
-> miss마다 page table walk 4단계 (RAM 접근 4번, ~400ns)
2MB 페이지 : 1000 x 2MB = 2GB 커버
-> 1GB 프로세스는 TLB 안에서 거의 다 커버됨
-> miss가 나더라도 walk 3단계 (RAM 접근 3번, ~300ns)
2가지 효과
1. TLB hit rate 증가 (주된 효과)
TLB 1엔트리가 4KB 대신 2MB를 커버
-> 같은 TLB 크기로 512배 넓은 범위 캐싱
-> TLB miss 빈도 자체가 크게 줄어듦
-> page table walk를 안 해도 되는 경우가 많아짐
2. page table walk 단계 감소 (부가 효과)
TLB miss가 나더라도:
4KB : PML4 -> PDPT -> PD -> PT -> 4KB 프레임 (4단계)
2MB : PML4 -> PDPT -> PD -> 2MB 프레임 (3단계)
-> PT 단계를 건너뜀
-> walk 한 번당 RAM 접근 1회 절약 (~100ns)
1번에 대한 추가 설명. TLB 엔트리 증가함에 대한 구조
------------------------------------------------
프로세스가 힙을 "8MB" 사용 중
4KB 페이지:
TLB 엔트리 [0]: 0x1000000 ~ 0x1000FFF (4KB)
TLB 엔트리 [1]: 0x1001000 ~ 0x1001FFF (4KB)
TLB 엔트리 [2]: 0x1002000 ~ 0x1002FFF (4KB)
...
TLB 엔트리 [2047]: 0x17FF000 ~ 0x17FFFFF (4KB)
→ 2048개 엔트리 필요
→ TLB가 1000개밖에 없으면 절반은 miss
2MB 페이지:
TLB 엔트리 [0]: 0x1000000 ~ 0x11FFFFF (2MB)
TLB 엔트리 [1]: 0x1200000 ~ 0x13FFFFF (2MB)
TLB 엔트리 [2]: 0x1400000 ~ 0x15FFFFF (2MB)
TLB 엔트리 [3]: 0x1600000 ~ 0x17FFFFF (2MB)
→ 4개 엔트리면 충분
→ TLB에 여유 넘침
추가. TLB 엔트리에 관하여.
-------------------------
TLB는 하드웨어이기 때문에 인트리 수가 물리적으로 고정되어 있음.
"CPU 설계 시점에 결정"되고 런타임에 "늘릴 수 없음."
2번에 대한 추가 설명. 2MB 증가로 PT 부분이 사라지는 이유
-----------------------------------------------------
- 프레임 크기를 2MB로 증가시키면 48비트 가상 주소에서 page offset 부분이 21비트를
사용해야함.
- 이러면 PT 부분의 비트 수가를 할당할 수 없게 되고, PD가 직접 2MB 물리 프레임을 가리키게
되며 메모리 접근 수가 1회 줄어듦.
면접 질문
Q. THP의 단점은?
A. 세 가지 문제가 존재합니다.
첫째, 연속 물리 페이지 512개를 확보해야 해서 메모리 단편화 시 커널이 compaction을
수행하는데, 이 과정에서 지연이 발생할 수 있습니다.
Q. 실무에서 THP를 끄는 경우는?
A. Redis나 DB 같은 서비스에서는 THP를 끄는 것이 권장됩니다.
가장 큰 이뉴는 "fork 기반" persistence에서 "CoW" 복사 단위가 4KB에서 2MB로 커져
메모리 사용량이 급증할 수 있기 때문입니다.
Q. HugePages(Static)와 THP의 차이는?
A. HugePages는 미리 2MB 페이지를 예약하는 방식이라 THP는 런타임에 커널이 자동으로 관리하는
방식입니다.
Q. compaction이 뭔가요?
A. 내부 단편화가 발생하여 2MB에 대한 공간이 있는데 할당을 하지 못하는 경우, 한 쪽으로
페이지들을 모아서 공간을 확하는 방법입니다.
하지만 이 과정에서 페이지 복사, 페이지 업데이트 등으로 인하여 지연이 발생합니다.