PostgreSQL 18의 비동기 I/O: 성능 최적화의 새로운 지평

Waiting for Postgres 18: Accelerating Disk Reads with Asynchronous I/O

작성자
Ruby Weekly
발행일
2025년 05월 07일

핵심 요약

  • 1 PostgreSQL 18은 비동기 I/O(AIO)를 도입하여 특히 클라우드 환경에서 읽기 성능을 2-3배 향상시킬 잠재력을 제공합니다.
  • 2 새로운 io_method 설정(sync, worker, io_uring)을 통해 I/O 처리 방식을 제어하며, io_uring이 가장 효율적인 옵션입니다.
  • 3 비동기 I/O 도입으로 모니터링 방식(예: pg_aios 뷰, EXPLAIN ANALYZE 해석)과 튜닝 파라미터(effective_io_concurrency)에 변화가 필요합니다.

도입

PostgreSQL 18 베타 1 출시와 함께 다년간의 노력 끝에 비동기 I/O(AIO)라는 중요한 아키텍처 변화가 현실화되고 있습니다. 이는 PostgreSQL이 I/O를 처리하는 방식에 근본적인 변화를 가져오며, 특히 I/O 지연이 병목 현상으로 작용하는 클라우드 환경에서 상당한 성능 향상을 기대할 수 있습니다. 현재 AIO는 읽기 작업에 한정되지만, 향후 버전에서는 쓰기 지원도 확장될 수 있습니다. 이 글에서는 비동기 I/O가 무엇인지, PostgreSQL 18에서 어떻게 작동하는지, 그리고 성능 최적화에 어떤 의미를 가지는지 설명합니다.

PostgreSQL은 전통적으로 동기식 I/O 모델로 작동하여 각 읽기 요청이 시스템 호출을 차단했습니다. 이는 특히 네트워크 연결 스토리지(예: Amazon EBS)를 사용하는 클라우드 환경에서 1ms 이상의 지연을 유발하며 불필요한 대기 시간을 초래했습니다. 비동기 I/O는 여러 읽기 요청을 동시에 발행하여 이러한 병목 현상을 제거하고, 프로그램이 이전 읽기 완료를 기다리지 않고 계속 진행할 수 있도록 합니다.

PostgreSQL 18의 비동기 I/O 구현

  • PostgreSQL 17의 기반 마련: PostgreSQL 17에서 도입된 읽기 스트림 API는 읽기 작업 발행 방식을 표준화하고 posix_fadvise()를 통한 사전 데이터 페치를 간소화했습니다. 그러나 이는 커널에 힌트만 제공하여 PostgreSQL의 공유 버퍼로 직접 데이터를 가져오지는 못했습니다.

  • PostgreSQL 18의 직접 페치: PostgreSQL 18은 이 간접적인 방식을 제거하고, 데이터베이스 자체가 공유 버퍼로 직접 데이터를 가져와 커널 수준의 휴리스틱에 대한 의존도를 없애고 예측 가능하며 높은 처리량의 I/O 동작을 가능하게 합니다.

새로운 io_method 설정

PostgreSQL 18은 비동기 I/O 메커니즘을 제어하는 io_method라는 새로운 설정 매개변수를 도입했습니다.

  • io_method = sync: PostgreSQL 17과 동일하게 동기식으로 작동하며 posix_fadvise()를 사용합니다.

  • io_method = worker: 백그라운드에서 실행되는 전용 I/O 워커 프로세스를 활용합니다. 메인 백엔드 프로세스는 읽기 요청을 큐에 넣고, 워커가 커널과 상호 작용하여 데이터를 가져와 공유 버퍼에 전달합니다. io_workers 설정으로 워커 수를 조정할 수 있습니다(기본값 3).

  • io_method = io_uring: Linux 커널 5.1 이상에서 도입된 고성능 I/O 인터페이스인 io_uring을 사용합니다. PostgreSQL과 커널 간의 공유 링 버퍼를 설정하여 시스템 호출 오버헤드를 최소화합니다. 가장 효율적인 옵션이지만, 최신 Linux 커널과 호환되는 파일 시스템이 필요합니다.

성능 벤치마크

AWS 환경에서 수행된 벤치마크 결과, io_method = workerio_uringsync 방식 대비 콜드 캐시 읽기 성능에서 2-3배 향상을 보였습니다. 특히 io_uring은 가장 낮은 시스템 호출 오버헤드와 프로세스 조정 감소로 최고의 성능을 제공했습니다.

effective_io_concurrency 튜닝

effective_io_concurrency 설정은 이제 비동기 I/O 방식(worker 또는 io_uring)에서 PostgreSQL이 내부적으로 발행하는 비동기 사전 읽기 요청 수를 직접 제어합니다. 이는 io_combine_limit와 함께 최대 사전 읽기 = effective_io_concurrency × io_combine_limit 공식을 따릅니다. 기본값이 1에서 16으로 상향 조정되었습니다.

I/O 모니터링

비동기 I/O 환경에서는 백엔드 프로세스가 직접 I/O를 차단하지 않으므로, pg_stat_activity에서 IO / AioIoCompletion과 같은 새로운 대기 이벤트를 확인해야 합니다. io_uring 사용 시에는 I/O 활동이 PostgreSQL 측에서 직접 보이지 않을 수 있으므로, 새로운 pg_aios 뷰를 사용하여 진행 중인 I/O 요청의 내부 상태를 확인할 수 있습니다. EXPLAIN ANALYZE의 I/O 타이밍 정보 해석에도 주의가 필요합니다.

결론

PostgreSQL 18의 출시는 I/O 처리 방식에 있어 중요한 진화를 알리는 신호탄입니다. 현재는 읽기 작업에 국한되지만, 비동기 I/O는 고지연 클라우드 환경에서 상당한 성능 향상을 가져올 것입니다. 이러한 성능 향상에는 트레이드오프가 따르며, 엔지니어링 팀은 관찰 가능성(observability) 관행을 조정하고, 새로운 타이밍 및 대기 이벤트 의미론을 이해하며, `effective_io_concurrency`와 같이 이전에 제한적이었던 튜닝 매개변수를 재검토해야 합니다. 향후 PostgreSQL 버전에서는 비동기 쓰기 지원이 추가되어 I/O 병목 현상을 더욱 줄이고 Direct I/O의 활용을 가능하게 할 것으로 기대됩니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!