huge_pages
| 버전 | 기본값 | context | 타입 |
|---|---|---|---|
| 14 | — | postmaster (재시작) | enum |
| 15 | — | postmaster (재시작) | enum |
| 16 | — | postmaster (재시작) | enum |
| 17 | — | postmaster (재시작) | enum |
| 18 | — | postmaster (재시작) | enum |
| 19 | — | postmaster (재시작) | enum |
메인 shared memory 영역에 huge page를 요청할지 제어한다. 가능한 값은 try(기본값), on, off이며 서버 시작 시에만 설정할 수 있다.
try로 두면 서버는 huge page 할당을 시도하고, 실패하면 일반 page로 조용히 되돌아간다. on이면 huge page 요청이 실패할 경우 서버가 아예 기동하지 않고, off면 요청하지 않는다. 실제로 huge page가 적용됐는지는 서버 변수 huge_pages_status로 확인할 수 있다. 현재 이 설정은 Linux와 Windows에서만 지원되며, 다른 시스템에서 try로 두면 무시된다. Linux에서는 shared_memory_type이 기본값인 mmap일 때만 지원된다.
huge page를 쓰면 page table이 작아지고 메모리 관리에 드는 CPU 시간이 줄어 성능이 올라간다. shared_buffers가 큰 서버일수록 효과가 뚜렷하다. 한편 Linux, FreeBSD, Illumos 같은 OS는 PostgreSQL의 명시적 요청 없이도 일반 메모리 할당에 huge page(super page, large page라고도 부른다)를 자동 적용할 수 있는데, Linux에서는 이를 transparent huge pages(THP)라고 한다. THP는 일부 Linux 버전에서 PostgreSQL 성능 저하를 일으킨 사례가 알려져 있어, 명시적인 huge_pages 사용과 달리 현재 권장되지 않는다. Windows에서 huge page는 large page라고 부르며, PostgreSQL을 실행하는 계정에 “Lock pages in memory” 권한을 부여해야 쓸 수 있다.
postgres -C shared_memory_size_in_huge_pages로 필요한 huge page 수를 확인한 뒤 vm.nr_hugepages로 예약하는 순서가 정석이다. 예약 없이 try로 두면 조용히 일반 page로 동작해 huge page가 적용되지 않은 사실을 모르고 지나치기 쉬우니, huge_pages_status나 /proc/meminfo로 실제 상태를 확인하는 편이 좋다. 반대로 THP는 비활성화(never)를 검토한다.출처: PostgreSQL 18 문서