LevelDB 캐시 메커니즘 분석

C++ 소스 분석과 캐시 파라미터별 읽기 성능 실측. KSC 2022 학부생 논문 1저자

← Projects

단국대학교 시스템 소프트웨어 연구실 학부 연구생(2022.07 - 12). Google LevelDB는 LSM-tree 기반으로, 읽기 성능이 캐시 두 계층에 좌우됩니다. 두 캐시가 LRU 엔진 하나를 공유하는 구조를 C++ 소스로 분석하고, 캐시 파라미터별 읽기 지연을 실측했습니다.

캐시 구조, 소스에서 확인한 것

읽기 경로
SSTable 읽기 경로. TableCache::Get(key)가 인덱스 캐시(key는 file_number, value는 인덱스 블록)를 거쳐 Bloom 필터, 블록 캐시(key는 cache_id와 offset, value는 데이터 블록)를 순서대로 조회. 히트면 메모리에서 반환, 미스면 디스크의 SSTable 파일을 읽어 채움
  • 인덱스 캐시: key는 file_number, value는 인덱스 블록. 히트 시 데이터 블록 위치(offset) 를 반환하고, 미스 시 SSTable을 열어 인덱스 블록을 적재. 용량 단위는 개수(파일 수)
  • 블록 캐시: key는 cache_id + offset, value는 데이터 블록. 히트 시 값을 즉시 반환하고, 미스 시 SSTable에서 블록을 읽어 적재. 용량 단위는 바이트이고, cache_id가 여러 SSTable의 같은 offset 충돌을 막음
LRU 엔진
ShardedLRUCache. key의 상위 해시 비트로 16개 샤드 중 하나를 고르고, 샤드 하나 안에서 같은 LRUHandle이 해시테이블(버킷 체인)과 이중 연결 리스트에 동시에 걸린다. 리스트는 lru_(refs=1, evict 후보)와 in_use_(refs는 2 이상, evict 보호) 둘로 나뉜다
  • 16개 샤드에 샤드별 독립 락: 락이 하나면 모든 조회가 순차로 대기하고, 샤드로 나누면 다른 키는 동시에 조회
  • 노드 하나로 조회와 순서 관리: 같은 LRUHandle을 해시테이블과 이중 연결 리스트에 함께 연결해, 조회와 순서 갱신 모두 복사 없이 O(1)
  • refs로 use-after-free 차단: eviction 대상은 lru_(refs=1)뿐이고, in_use_(refs 2 이상)의 사용 중 블록은 해제하지 않음

설계 결정

항목선택이유
독립 변수인덱스 캐시 개수와 블록 캐시 크기를 한 번에 하나씩둘을 같이 바꾸면 어느 쪽 효과인지 분리할 수 없음
워크로드readrandom, seekrandom, readhot워킹셋이 다른 셋. 전체 key 무작위, 전 레벨 탐색, 1%만 반복

결과

환경은 EC2 t2.micro, key 16B, value 100B, fillrandom 100MB.

변수readrandomseekrandomreadhot
인덱스 캐시 개수 0 → 10,000190 → 75μs275 → 110μs-
블록 캐시 크기 1KB → 1GB190 → 27μs195 → 33μs115 → 65μs
실험 1. 인덱스 캐시 개수 0, 1, 10, 100, 1,000, 10,000에 따른 readrandom과 seekrandom 지연. 100개에서 바닥
실험 1. 인덱스 캐시 개수
실험 2. 블록 캐시 크기 1KB부터 1GB까지에 따른 readrandom, seekrandom, readhot 지연. readrandom은 꾸준히, seekrandom은 100MB 이후 급락, readhot은 평탄
실험 2. 블록 캐시 크기
  • 인덱스 캐시는 100개에서 포화: 실험 데이터의 SSTable이 100개 이하라 추가로 캐싱할 인덱스 블록이 없음
  • 블록 캐시 효과는 워킹셋에 비례: seekrandom은 100MB를 넘어야 급락하고, readhot은 1KB에서 이미 낮아 개선 폭이 작음
  • KSC 2022 학부생 논문 1저자 게재와 포스터 발표
포스터 발표 현장
KSC 2022 포스터 세션. 22P-P7.4-06 보드에 걸린 LevelDB 캐시 구조 및 성능 분석(홍수빈, 최민국, 유시환, 최종무, 단국대학교 System Software Laboratory) 포스터 앞에 선 모습

한계

  • t2.micro 단일 인스턴스 실험: 멀티노드와 대용량 환경의 캐시 거동은 검증하지 못함
  • 16개 샤드 간 부하 균등 분배 미확인: 논문 후속 과제로 남김

기술 스택

C++, LevelDB, db_bench, AWS EC2

github.com/sss654654/leveldb-cache-analysis, 논문 PDF