ARC의 핵심 아키텍처
이원 분할 구조: ARC는 캐시 크기 C를 경계값 P로 나누어 Most Recently Used(MRU) 영역과 Most Frequently Used(MFU) 영역으로 분할합니다. 초기에 P=½C로 설정되며, 접근 패턴에 따라 동적으로 조정됩니다. MRU는 일회성 접근 데이터를, MFU는 반복 접근 데이터를 캐싱함으로써 전통적 LRU의 스캔 스래싱(scan thrashing) 문제를 해결합니다.
고스트 리스트와 차가운 히트 감지: 각 영역에서 제거된 항목의 메타데이터(실제 데이터 제외)는 고스트 MRU, 고스트 MFU 리스트에 유지됩니다. 이전에 캐시되었던 데이터 재접근 시 "차가운 히트(cold hit)"를 감지하여 어느 영역을 확대할지 결정합니다. 이를 통해 장단기 접근 패턴을 모두 반영한 캐시 효율성을 달성합니다.
실무 운영 시 주의점
메모리 압력 기반 동적 조정: ARC 크기는 시스템 여유 메모리에 따라 자동으로 수축합니다. arc_max, arc_min 튜너블로 상한과 하한을 설정할 수 있으며, 데이터베이스 서버처럼 애플리케이션 자체 캐싱이 필요한 환경에서는 arc_max를 제한해야 합니다. arc_meta_limit으로 메타데이터 캐싱 비율도 조정 가능합니다.
L2ARC 계층화 전략: ARC가 가득 찬 상황에서 추출된 항목들은 L2ARC(NVMe/SSD 기반 2차 캐시)로 자동 이동됩니다. 다만 L2ARC는 헤더 참조만 ARC에 유지되므로, L2ARC 메타데이터로 인한 ARC 오버헤드를 l2arc_meta_percent(기본값 33%)로 관리해야 합니다. 또한 primarycache와 secondarycache` 속성을 데이터셋별로 'metadata'로 설정하면 애플리케이션 자체 캐싱 시스템과의 충돌을 피할 수 있습니다.