Postgres 18 대기: 비동기 I/O로 디스크 읽기 가속화

1 month ago 14

  • Postgres 18은 비동기 I/O를 도입하여 클라우드 환경에서 성능을 크게 향상시킬 가능성을 제공함
  • 비동기 I/O는 읽기 작업에만 제한되며, 쓰기 작업은 여전히 동기적으로 처리됨
  • 새로운 io_method 설정을 통해 비동기 I/O의 메커니즘을 제어할 수 있으며, worker와 io_uring 옵션을 제공함
  • AWS 벤치마크 결과, io_uring을 사용하면 읽기 성능이 최대 2-3배 향상됨
  • 비동기 I/O 도입으로 인해 I/O 타이밍 해석이 복잡해질 수 있으며, 새로운 관찰 도구가 필요함

비동기 I/O의 중요성

  • Postgres는 전통적으로 동기 I/O 모델을 사용하여, 읽기 요청마다 시스템 호출이 차단됨
  • 클라우드 환경에서는 저장소가 네트워크에 연결되어 있어 대기 시간이 길어질 수 있음
  • 비동기 I/O는 여러 읽기 요청을 동시에 처리할 수 있어 이러한 병목 현상을 제거함

Postgres 17의 읽기 스트림

  • Postgres 17은 읽기 스트림 API를 도입하여 비동기 I/O 구현의 기초를 마련함
  • 이 API는 posix_fadvise()를 사용하여 운영 체제에 데이터를 미리 가져오도록 요청함
  • 그러나 이 메커니즘은 여전히 Postgres의 공유 버퍼로 데이터를 직접 가져오지 못함

Postgres 18의 새로운 io_method 설정

  • Postgres 18은 비동기 I/O 메커니즘을 제어하는 새로운 설정인 io_method를 도입함
  • sync, worker, io_uring 세 가지 옵션을 제공하며, 기본값은 worker임
  • worker는 백그라운드에서 데이터를 가져오는 전용 I/O 작업자 프로세스를 사용함
  • io_uring은 최신 Linux 커널에서 사용할 수 있는 고성능 I/O 인터페이스임

비동기 I/O의 실제 적용

  • 비동기 I/O는 네트워크에 연결된 저장소를 사용하는 클라우드 환경에서 가장 큰 성능 향상을 제공함
  • 여러 읽기 요청을 병렬로 처리하여 쿼리 대기 시간을 줄이고 CPU 사용 효율성을 높임

AWS 벤치마크 결과

  • AWS에서 Postgres 17과 18을 비교한 결과, io_uring을 사용하면 읽기 성능이 최대 2-3배 향상됨
  • worker 옵션도 성능 향상을 제공하지만, io_uring이 가장 효율적임

effective_io_concurrency 조정

  • Postgres 18에서는 effective_io_concurrency가 비동기 io_method와 함께 사용될 때 더 중요해짐
  • 이 설정은 Postgres가 내부적으로 발행하는 비동기 읽기 요청의 수를 직접 제어함

pg_aios를 통한 I/O 모니터링

  • 비동기 I/O는 백엔드 대기 동작을 변경하여 새로운 IO / AioIoCompletion 대기 이벤트를 도입함
  • pg_aios 뷰를 통해 비동기 I/O 요청의 상태를 확인할 수 있음

비동기 I/O의 타이밍 정보 해석

  • 비동기 I/O는 실행 타이밍 보고 방식을 변경하여, 쿼리 계획에서 I/O 노력이 적게 보일 수 있음
  • EXPLAIN ANALYZE 출력에서 I/O 시간이 과소 보고될 수 있음

결론

  • Postgres 18의 비동기 I/O 도입은 클라우드 환경에서 성능을 크게 향상시킬 수 있는 가능성을 열어줌
  • 관찰 도구와 타이밍 해석 방식의 조정이 필요하며, 향후 버전에서는 비동기 쓰기 지원이 추가될 가능성이 있음

Read Entire Article