피드로 돌아가기
I Spent 3 Hours Watching My Benchmark Hang, Then 6 Seconds to Fix It
Dev.toDev.to
Database

Lock Contention 해결로 벤치마크 수행 시간 3시간에서 6.6초로 단축

I Spent 3 Hours Watching My Benchmark Hang, Then 6 Seconds to Fix It

mote2026년 5월 14일4advanced

Context

단일 RwLock 기반의 B-Tree 구조로 인해 Background Index Build 시 Write Lock이 Read Query를 전면 차단하는 병목 발생. 12개 인스턴스 병렬 쿼리 상황에서 Lock Queue가 급증하며 시스템 전체가 중단되는 Hang 현상 초래.

Technical Solution

  • RocksDB 스타일의 Two-layer 아키텍처 도입을 통한 Read/Write 경로 분리
  • IndexMemBuffer(BTreeMap)를 통한 Write 요청의 1차 수용 및 nanosecond 단위의 짧은 Contention 유지
  • Immutable Snapshot 전환 방식을 활용하여 Reader 차단 없는 Background Drain 프로세스 구현
  • Mutex 기반의 drain_lock과 try_lock 적용으로 Writer의 Blocking 방지 및 직렬화 달성
  • HashSet 기반의 tombscones 도입으로 데이터 Drain 과정에서의 삭제 데이터 복구 문제 해결
  • Tombstone Filter와 LRU Cache Write 간의 Lock 범위를 통합하여 TOCTOU Race Condition 제거

- 공유 자원 접근 시 RwLock의 Write Lock이 전체 Read 경로를 차단하는지 검토 - Write-heavy 워크로드의 경우 메모리 버퍼링 후 비동기적으로 영속화하는 Layered Architecture 고려 - 다중 단계 검증 로직(Filter -> Cache) 사이의 원자성 보장을 위해 Lock Scope 확장 검토 - 시스템 종료(close) 시 멀티스레드 환경에서의 Allocator Thread-safety 여부 확인

원문 읽기