Turso 데이터베이스의 io_uring 백엔드에 리드어헤드 기능이 도입되었습니다. 이 변경은 io_uring과 O_DIRECT 플래그를 함께 사용할 때 발생하던 성능 병목을 해결하기 위해 진행되었습니다. 기존 방식에서는 커널의 자동 리드어헤드가 비활성화되어 애플리케이션이 직접 페이지를 하나씩 요청해야 했습니다.
벤치마크 결과 TPC-H Q6 쿼리 실행 시 디스크 요청 수가 약 19만 6천 건에서 약 1만 6천 건으로 줄었습니다. 리드어헤드가 활성화되면 Turso는 순차적 접근 패턴을 감지합니다. 페이지 100이 필요할 때 100부터 131까지 32개 페이지를 한 번에 제출합니다.
이렇게 하면 여러 읽기 요청이 동시에 처리되어 대기 시간이 단축됩니다.
O_DIRECT를 사용하면 커널 페이지 캐시를 거치지 않습니다. 데이터가 디스크에서 프로세스 버퍼로 직접 복사됩니다. 이 과정에서 CPU 캐시 미스가 증가할 수 있습니다.
하지만 리드어헤드를 통해 요청을 병합하면 전체적인 I/O 효율이 개선됩니다. io_uring의 SQ 폴링 스레드는 CPU 사이클의 65%를 차지할 정도로 자원을 소모했습니다.
이 최적화는 특정 조건에서 가장 효과적입니다. Alex Miller는 이 리드어헤드가 물리적 순서에 기반한 예측이라고 지적했습니다. B-tree 페이지가 파일 내에서 논리적 순서와 일치하는 클러스터링 상태일 때만 성능이 향상됩니다.
TPC-H 벤치마크는 데이터가 한 번 생성된 후 업데이트되지 않아 파일이 잘 정렬되어 있습니다.
장기적인 워크로드에서는 상황이 다릅니다. 데이터가 계속 추가되고 삭제되면 파일이 단편화됩니다. 물리적 순서가 깨지면 리드어헤드의 예측이 실패할 수 있습니다.
또한 임베디드 데이터베이스가 다른 서비스와 하드웨어를 공유하는 환경에서는 커널 캐시 관리의 중요성이 부각됩니다. 커널은 전체 시스템 메모리 상태를 파악하고 압력 시 자원을 반환할 수 있습니다.
현재로서는 클러스터링된 데이터셋과 전용 하드웨어 환경에서 io_uring 리드어헤드의 이점이 명확합니다. 단편화된 데이터나 자원 경쟁이 심한 환경에서의 성능 저하 가능성은 여전히 검증이 필요한 부분입니다.