Ryotta's Basic

Linux
🐧 Linux 검증완료

Linux 메모리 최적화

개요

Linux에서 메모리 최적화는 단순히 더 많은 메모리를 쓰는 문제가 아니라, 같은 데이터는 덜 쓰고, 자주 접근하는 데이터는 더 큰 단위로 다루고, 한동안 쓰이지 않는 데이터는 압축해서 보관하는 문제입니다. THP는 TLB와 page table 부담을 줄이고, KSM은 동일한 anonymous page를 병합하며, zswap과 zram은 swap 압력을 압축으로 완화합니다.

이 문서는 madvise() 기반 힌트와 khugepaged, ksmd, zswap, zram이 각각 어떤 병목을 줄이는지, 어떤 워크로드에 맞는지, 그리고 어떤 비용을 함께 치르는지 한 흐름으로 정리합니다.

Linux 메모리 최적화

그림 1. THP, KSM, zswap, zram이 각각 줄이는 메모리 병목

핵심 개념

THP와 mTHP

Transparent Huge Pages(THP)는 기본 페이지보다 큰 페이지를 사용해 page fault 수와 TLB miss를 줄이는 기능입니다. 최근 커널은 multi-size THP(mTHP)도 지원하여 16K, 32K, 64K처럼 base page보다 크지만 PMD-size보다 작은 큰 페이지를 사용할 수 있습니다.

  • THP는 주로 anonymous memory와 tmpfs/shmem에 적용됩니다.
  • PMD-size THP는 큰 working set에서 강한 이점을 주고, mTHP는 지연 급증을 덜 만들면서 중간 크기 이점을 노립니다.
  • khugepaged는 장수명 매핑을 스캔해 작은 페이지를 큰 페이지로 collapse합니다.
  • madvise(MADV_HUGEPAGE)prctl(PR_SET_THP_DISABLE)로 프로세스 단위 제어가 가능합니다.
  • 최신 커널은 /sys/kernel/mm/transparent_hugepage/hugepages-<size>kB/enabled로 크기별 정책을 따로 줄 수 있어, 2 MiB THP는 madvise, 더 작은 mTHP는 always처럼 섞어서 운영할 수 있습니다.
  • 큰 페이지는 TLB 효율을 높이지만, 페이지가 커질수록 메모리 낭비와 compaction 비용도 커질 수 있습니다.

KSM

Kernel Samepage Merging(KSM)은 동일한 내용을 가진 anonymous private page를 찾아 하나의 write-protected page로 합칩니다. KVM 게스트처럼 같은 데이터가 반복되는 환경에서 효과가 큽니다.

  • ksmd가 주기적으로 후보 페이지를 스캔합니다.
  • madvise(MADV_MERGEABLE)로 병합 가능한 영역을 지정합니다.
  • page cache 파일 페이지는 대상이 아니며, anonymous 페이지에만 적용됩니다.
  • 쓰기 발생 시 COW가 생겨 메모리 절감과 쓰기 지연 사이에 균형이 필요합니다.

압축 메모리

zswap과 zram은 둘 다 메모리를 압축해서 더 오래 버티게 만드는 기법이지만 위치가 다릅니다. zswap은 swap으로 나가려는 페이지를 compressed cache에 먼저 담고, zram은 RAM 위에 압축 block device를 만들어 swap이나 임시 저장소로 씁니다.

  • zswap은 swap I/O를 줄이기 위한 compressed swap cache입니다.
  • zswap pool은 필요할 때만 커지고, max_pool_percent 한도에 닿으면 오래된 엔트리를 backing swap으로 writeback합니다.
  • zram은 압축된 페이지를 RAM 안에 저장하는 block device입니다.
  • zram은 comp_algorithm, disksize, mem_limit 조합으로 CPU 비용과 압축률을 조절합니다.
  • 둘 다 CPU를 더 쓰는 대신 메모리와 I/O 압력을 줄입니다.
  • 압축 알고리즘과 페이지의 compressibility가 실효성을 크게 좌우합니다.

reclaim과 compaction

메모리 최적화는 새 페이지를 빨리 확보하는 것뿐 아니라, fragmented memory를 정리해 큰 페이지를 만들고, 더 이상 쓰지 않는 페이지를 회수하는 것까지 포함합니다. THP는 compaction의 영향을 직접 받고, zswap과 zram은 reclaim이 swap으로 밀어낼 페이지를 덜 비싸게 처리하게 돕습니다.

비교/분석

기법 대상 주 효과 비용 적합한 워크로드
THP/mTHP anonymous, tmpfs/shmem TLB miss 감소, page fault 수 감소 compaction, 메모리 낭비 큰 working set, locality가 좋은 워크로드
KSM anonymous private pages 중복 페이지 제거 ksmd CPU, COW VMs, 다수 복제 프로세스
zswap swap-out pages swap I/O 감소 압축 CPU, compressed pool 메모리 swap이 간헐적으로 필요한 시스템
zram RAM-based swap/tmp 디스크 I/O 없이 압축 저장 압축 CPU, RAM 일부 사용 메모리 제한 장치, 저속 스토리지
reclaim/compaction system-wide 사용하지 않는 페이지 회수, THP 확보 latency, background CPU 메모리 압박이 잦은 서버

동작 원리

  1. 애플리케이션이 malloc(), mmap(), fork() 같은 경로로 메모리를 사용하면 커널은 접근 패턴과 중복 여부를 관찰합니다.
  2. 충분히 큰 anonymous 또는 shmem 영역은 khugepaged가 collapse하거나 fault 경로에서 THP/mTHP로 할당될 수 있습니다.
  3. 동일한 anonymous private page가 많으면 ksmdMADV_MERGEABLE 영역을 스캔해 하나의 shared page로 합칩니다.
  4. 메모리 압박이 커져 swap으로 밀려나는 페이지는 zswap이 먼저 compressed cache에 담고, zram을 swap으로 쓰면 애초에 swap 장치 자체가 압축 RAM이 됩니다.
  5. 큰 페이지 확보가 어렵거나 메모리 단편화가 심하면 reclaim과 compaction이 함께 동작해 다음 THP 할당 여지를 만듭니다.
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo always > /sys/kernel/mm/transparent_hugepage/hugepages-64kB/enabled
echo 1 > /sys/kernel/mm/ksm/run
echo 1 > /sys/module/zswap/parameters/enabled
echo 20 > /sys/module/zswap/parameters/max_pool_percent
echo lz4 > /sys/block/zram0/comp_algorithm
mkswap /dev/zram0
swapon /dev/zram0

이 흐름에서 중요한 점은 각 기능이 서로 대체재가 아니라는 것입니다. THP는 접근 비용을 줄이고, KSM은 중복을 없애며, zswap과 zram은 압박을 압축으로 넘기고, reclaim과 compaction은 다음 할당을 위한 공간을 만듭니다.

운영 중에는 효과와 부작용을 함께 봐야 합니다. THP는 /proc/vmstatthp_fault_alloc, thp_fault_fallback, compact_stall로, KSM은 /sys/kernel/mm/ksm/ 통계로, zswap은 stored_pages, pool_total_size, reject_* 계열 통계로 확인할 수 있습니다. zram은 zramctl/sys/block/zram0/ 아래 통계로 실제 압축률과 writeback 여부를 점검하는 편이 안전합니다.

장단점

  • 장점: THP/mTHP는 큰 working set의 TLB 효율을 높입니다.
  • 장점: mTHP는 PMD-size THP보다 작은 단위로도 page fault 수를 줄여, 지연 급등을 덜 만들 수 있습니다.
  • 장점: KSM은 반복된 anonymous 데이터를 공유해 메모리 사용량을 줄입니다.
  • 장점: zswap과 zram은 swap 압력을 줄이면서 시스템 응답성을 지키는 데 도움이 됩니다.
  • 단점: THP는 compaction 실패나 과도한 큰 페이지 할당으로 메모리를 낭비할 수 있습니다.
  • 단점: KSM은 ksmd 스캔 비용과 COW 지연을 유발할 수 있습니다.
  • 단점: 압축 계열은 CPU를 더 쓰므로, 이미 CPU가 바쁜 워크로드에서는 역효과가 날 수 있습니다.
  • 단점: zswap과 zram을 동시에 켤 때는 swap 경로와 압축 경로가 겹쳐, 메모리가 작고 CPU도 약한 장치에서는 튜닝 없이 쓰면 reclaim 지연이 커질 수 있습니다.

관련 기술

핵심 정리

Linux 메모리 최적화는 페이지 크기, 중복 제거, 압축, 회수라는 서로 다른 레버를 조합하는 작업입니다. THP/mTHP는 큰 페이지로 TLB 부담을 줄이고, KSM은 같은 anonymous page를 병합해 중복을 없앱니다. zswap과 zram은 swap 압력을 압축으로 완화하지만 CPU와 RAM 일부를 대신 씁니다. 따라서 최적화 성능은 기능을 켜는 것보다 워크로드의 locality, 중복률, swap 빈도, 압축 가능성에 맞게 조합하는 데서 결정됩니다.