Page Cache 아키텍처
Page Cache는 디스크에서 읽은 파일 데이터를 DRAM 내 4KB 단위의 페이지로 인덱싱하여 보관하는 커널 소프트웨어 캐시입니다. 각 파일의 Page Cache는 address_space 구조체를 통해 관리되며, 이는 파일의 inode에 포함됩니다. address_space 구조는 XArray(이전의 Radix Tree) 자료구조를 사용하여 파일 오프셋을 물리 페이지 프레임에 매핑합니다.
read() 시스템 콜 시 커널은 먼저 (superblock, inode, offset)을 키로 하여 Page Cache를 검색합니다. 캐시 히트 시 디스크 I/O 없이 메모리에서 직접 데이터를 반환(Minor Fault)하고, 캐시 미스 시 디스크에서 읽어 Page Cache에 적재한 후 제공(Major Fault)합니다.
Inode 구조와 메타데이터 캐싱
Inode는 파일의 메타데이터(크기, 권한, 시간 정보, 디스크 블록 위치)를 담는 약 600바이트 크기의 VFS 객체입니다. 각 파일마다 하나의 Inode 캐시 엔트리가 존재하며, SLAB 할당자를 통해 효율적으로 관리됩니다. Inode 캐시는 슈퍼블록과 inode 번호를 기반으로 해시 테이블로 구성되어 있어, 파일명 조회 이후 빠른 메타데이터 접근을 가능하게 합니다.
캐시 분리 설계의 이유
Page Cache와 Inode Cache가 분리된 이유는 접근 패턴과 데이터 크기의 차이 때문입니다. Dentry Cache(~200바이트)는 거의 모든 open(), stat(), exec() 호출마다 참조되지만, Inode Cache는 파일이 열려 있을 때만 필요하고, Page Cache는 read()/write() 호출 시에만 접근됩니다. 이렇게 계층화된 설계는 각 캐시를 독립적으로 관리하고, 메모리 압박 상황에서 우선순위에 따라 선택적으로 회수할 수 있게 합니다.
실무 주의점
Inode는 메모리에 상주한 후 모든 참조가 해제될 때까지 회수되지 않으므로, 많은 파일을 반복적으로 open/close하는 워크로드에서 Inode Cache가 커질 수 있습니다. vm.vfs_cache_pressure 커널 파라미터로 메모리 회수 시 Page Cache 대비 Inode/Dentry Cache의 우선순위를 조절할 수 있습니다(기본값 100).