- 현재 베타1인 Postgres 18은 비동기 I/O (Asynchronous I/O) 지원을 도입하며, 특히 클라우드 환경에서의 읽기 성능을 크게 개선함
- 새로운 설정값 io_method를 통해 전통적 sync 방식 외에 worker, io_uring 방식을 선택할 수 있음
- AWS 기준 벤치마크 결과, io_uring 사용 시 디스크 읽기 성능이 최대 3배 향상됨
- 다만, 비동기화로 인해 기존 쿼리 분석(EXPLAIN ANALYZE)의 I/O 타이밍 해석이 더 어려워짐
-
새로운 모니터링 뷰(pg_aios) 와 튜닝 파라미터(effective_io_concurrency) 를 통해 성능 최적화 필요
Postgres 18의 비동기 I/O 도입
- 전통적으로 Postgres는 블로킹 I/O 모델을 사용해, 각 디스크 읽기가 완료될 때까지 대기
- 네트워크 기반 스토리지(EBS 등)에서의 높은 지연시간으로 인해 클라우드 환경에서 병목 현상 발생
- 비동기 I/O는 여러 디스크 읽기를 병렬로 처리 가능하게 하며, CPU 활용도와 전체 처리량을 높임
Postgres 17의 사전 작업: Read Stream API
- Postgres 17에서는 read_stream API를 도입해 읽기 작업의 추상화를 표준화
- 하지만 이는 여전히 OS 페이지 캐시에 의존하며 Postgres 자체의 shared buffer에는 직접 반영되지 않음
- Postgres 18에서는 커널 힌트가 아닌 직접적인 비동기 읽기가 가능해짐
새로운 설정: io_method
- Postgres 18은 postgresql.conf에 io_method 설정을 추가하며, 다음 3가지 옵션 제공:
io_method = sync
- 기존 Postgres와 동일한 동기 방식
-
posix_fadvise() 기반의 읽기 선제 요청 방식 사용
io_method = worker (기본값)
-
I/O 전담 워커 프로세스가 비동기적으로 데이터를 읽고 공유 버퍼로 전달
- 메인 프로세스는 읽기 작업 중단 없이 계속 실행 가능
- 기본 워커 수는 3개이며, io_workers 설정으로 조정 가능
io_method = io_uring
-
Linux 커널 5.1 이상에서 사용 가능한 고성능 I/O 인터페이스
-
워커 프로세스 없이도 직접 커널과 공유 링 버퍼를 통해 비동기 읽기 수행
- 최신 커널, 파일시스템, 설정 요구됨
비동기 I/O의 성능 벤치마크 (AWS 기준)
- 테스트 환경:
- AWS c7i.8xlarge (32 vCPU, 64GB RAM)
- 100GB io2 EBS, 20,000 IOPS
- 3.5GB 규모의 테이블에 대해 SELECT COUNT(*) 실행
Cold cache 성능 비교:
| 버전/설정 | 실행 시간 (ms) |
|------------------|----------------|
| Postgres 17 (sync) | 15,831 |
| Postgres 18 (sync) | 15,071 |
| Postgres 18 (worker) | 10,052 |
| Postgres 18 (io_uring) | 5,723 |
-
io_uring은 sync 대비 2.8배 성능 향상
- 클라우드에서의 디스크 지연 최소화에 탁월한 효과
effective_io_concurrency 튜닝
- Postgres 18에서는 해당 파라미터가 내부 비동기 read-ahead 요청 수에 영향을 줌
- 기본값이 1 → 16으로 상향되었으며, io_combine_limit과 곱해 최대 읽기 범위 결정
- 고지연 클라우드 환경에서는 큰 값이 유리할 수 있으나, 워크로드별 벤치마크 필요
새로운 모니터링 도구: pg_aios
-
pg_stat_activity에서 비동기 작업 시 AioIoCompletion 이벤트로 나타나 백엔드의 대기 분석이 어려움
-
io_uring의 경우, 커널이 직접 처리하기 때문에 I/O 상태가 Postgres에서 보이지 않음
-
pg_aios 뷰를 통해 현재 진행 중인 비동기 요청의 상세 정보 확인 가능
SELECT * FROM pg_aios;
-
SUBMITTED, COMPLETED_IO 등의 상태와 대상 블록 정보 확인 가능
주의사항: I/O 타이밍 정보 해석 변화
- 기존 EXPLAIN ANALYZE에서 보이던 I/O Timings은 동기 방식에서만 신뢰 가능
- 비동기화된 worker, io_uring 사용 시에는 병렬 처리와 워커 분산으로 타이밍 정보 해석이 왜곡됨
- 실제 I/O 노력 판단 시 shared read 버퍼 수와 pg_aios 활용이 권장됨
결론
- Postgres 18은 읽기 중심 워크로드 성능 향상에 실질적 기여를 제공함
- 특히 클라우드 환경의 고지연 디스크를 사용하는 경우 큰 이점을 얻을 수 있음
- 동시에 관측 지표 해석, 성능 튜닝, 설정 적용 방식에 대한 재학습이 요구됨
- 향후 Postgres 19에서는 비동기 쓰기 지원도 기대됨