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