io_uring에서 readahead를 제거하면 어떤 일이 벌어질까
Io_uring Without Readahead
Turso 데이터베이스의 io_uring 백엔드에서 readahead를 구현한 PR을 계기로, io_uring의 성능 특성을 분석한 글입니다. O_DIRECT로 파일을 열면 커널의 readahead가 비활성화되어 애플리케이션 수준에서 구현해야 합니다. readahead를 켜면 32개 페이지를 한 번에 제출하여 블록 레이어의 요청 병합이 활성화되고, 장치 요청 수가 약 196,000개에서 16,300개로 줄어듭니다. 또한 SQ polling 스레드가 CPU를 65%나 사용하는 문제를 발견하고, 일반 io_uring으로 전환했을 때 시스템 시간이 크게 줄어드는 것을 확인했습니다. O_DIRECT는 페이지 캐시 복사를 생략하지만 CPU 캐시 미스를 증가시켜 성능에 영향을 줍니다. 결론적으로, io_uring의 성능은 readahead, SQ polling, 배칭 등 여러 요소에 의해 결정되며, 각 모델의 비용을 이해하고 측정하는 것이 중요합니다.
O_DIRECT는 복사 단계를 생략하지만, 데이터는 결국 어떤 시점에 CPU에 도달해야 합니다. 버퍼링된 읽기에서는 복사 중에, O_DIRECT에서는 쿼리 중에 캐시 미스로 발생합니다.