I/O 가속을 사용하여 AlloyDB Omni 성능 개선

이 페이지에서는 워크로드와 쿼리 성능을 개선하기 위해 컴퓨팅 및 I/O 리소스 활용도를 개선하는 데 도움이 되는 일련의 I/O 가속 기능을 AlloyDB Omni에서 사용 설정하는 방법을 설명합니다.

다음과 같은 기능이 포함되어 있습니다.

  • 찢어진 쓰기 방지
  • O_DIRECT 지원
  • 비동기 I/O (AIO)
  • 스트리밍 읽기

이러한 I/O 가속 기능을 사용 설정하려면 alloydb_omni_atomic 범용 통합 구성 (GUC)을 사용 설정하고 GUC를 사용할 수 있도록 AlloyDB Omni를 설정합니다.

I/O 가속 기능

다음 섹션에서는 alloydb_omni_atomic GUC에서 사용 설정하는 I/O 가속 기능을 설명합니다.

찢어진 쓰기 방지

alloydb_omni_atomic 구성을 사용 설정하면 전체 페이지 쓰기를 사용 중지하여 로깅을 위해 전체 페이지 이미지를 생성해야 하는 성능 오버헤드를 방지합니다.

O_DIRECT 지원

O_DIRECT 지원은 원자 쓰기의 기본 요건입니다. O_DIRECT는 PostgreSQL 데이터 디렉터리와 AlloyDB Omni 디스크 캐시에 적용됩니다. 자세한 내용은 디스크 캐시를 사용하여 데이터베이스 성능 가속화를 참고하세요.

O_DIRECT에는 다음과 같은 이점도 있습니다.

  • O_DIRECT를 사용하면 PostgreSQL에서 이중 버퍼링 문제를 방지할 수 있습니다. PostgreSQL은 자체 버퍼 캐시를 관리하며 운영체제 커널 버퍼 캐시를 우회할 수 있습니다.
  • O_DIRECT는 커널 버퍼 캐시를 유지하는 데 필요한 시스템 CPU 및 메모리 오버헤드의 작동을 줄입니다.

비동기 I/O

alloydb_omni_atomic 구성은 io_uringlibaio 라이브러리를 사용하여 비동기 I/O (AIO) 기능을 제공합니다. 이전 libaio 라이브러리의 제한을 피하려면 io_uring를 사용하는 것이 좋습니다. AlloyDB Omni는 io_uring 지원이 감지되지 않으면 libaio로 대체됩니다. 이 접근 방식은 미리 읽기 및 쓰기 결합과 같은 버퍼링된 I/O 이점의 손실을 극복하고, 기본 제공 스토리지의 사용 가능한 I/O 대역폭을 최대화합니다.

스트리밍 읽기

AlloyDB Omni는 PostgreSQL 17 기능과 유사한 스트리밍 읽기를 사용합니다. 이 기능은 벡터화된 I/O를 사용하여 버퍼 캐시로 여러 블록을 읽음으로써 향상된 순차 스캔, ANALYZE, pg_prewarm 성능을 제공합니다. 벡터화된 I/O는 단일 프로시저 호출이 여러 버퍼에서 데이터를 미리 가져올 수 있는 메서드로, 컨텍스트 전환과 시스템 호출을 줄여 효율성을 개선합니다.

AlloyDB Omni는 AIO를 사용하여 AlloyDB Omni 디스크 캐시에서 읽을 때 스트리밍 읽기를 사용하도록 지원을 확장하여 읽기 성능을 향상시킵니다. 이 접근 방식을 사용하면 쿼리에서 사용할 수 있도록 스토리지에서 공유 메모리 풀로 버퍼를 효과적으로 미리 읽을 수 있습니다. 스토리지에서 이러한 블록이 필요할 때마다 읽을 필요가 없습니다.

시작하기 전에

  1. 운영체제 및 파일 시스템 지원을 확인합니다.

    1. 커널이 RWF_ATOMIC를 지원하는지 확인하려면 커널 버전을 확인하세요. 다음 예에서는 원자 쓰기를 지원하는 Linux 6.14 커널을 실행하는 Ubuntu 24.10 머신을 사용합니다.

      > sudo hostnamectl
       ...
       Operating System: Ubuntu 24.10
            Kernel: Linux 6.14.0-061400rc5-generic
      ...
      
    2. 커널에서 RWF_ATOMIC를 지원하지 않는 경우 RWF_ATOMIC를 지원하는 커널 버전으로 업데이트하는 것이 좋습니다.

  2. AlloyDB Omni I/O 가속 기능을 사용하여 찢어진 쓰기 보호로 인한 성능 향상을 테스트하려면 alloydb_omni_atomic Grand Unification Configuration (GUC)을 사용 설정하세요. 이 GUC를 사용하려면 원자적 I/O를 제공하고 손상된 쓰기로부터 보호하는 지원되는 커널과 파일 시스템이 있어야 합니다.

    RWF_ATOMIC 플래그는 원자 쓰기 지원에 사용됩니다. 기본적으로 RWF_ATOMIC의 호환성은 시작 중에 확인됩니다. RWF_ATOMIC 플래그를 사용한 원자 쓰기를 확인할 수 없는 경우 PostgreSQL이 시작되지 않습니다.

    이 기본 동작을 재정의할 수 있지만, 실수로 최적의 구성 설정을 재정의하지 않도록 지원되는 플랫폼과 force 옵션을 사용하는 것이 좋습니다.

    force_unsafe 옵션을 사용하여 RWF_ATOMIC호환성 검사를 재정의할 수 있지만 이 재정의로 데이터 안전이 보장되지는 않습니다. 적절한 커널과 파일 시스템을 사용하도록 업그레이드할 수 없는 환경에서 AlloyDB Omni을 평가하는 경우가 아니라면 이 옵션을 사용하지 않는 것이 좋습니다.

    다음 표에는 alloydb_omni_atomic 구성 설정과 해당하는 호환성 검사가 나와 있습니다.

    alloydb_omni_atomic 시작 호환성 확인 설명
    off
    해당 사항 없음 이 값은 원자 모드를 사용 중지합니다. 기능이 비활성 상태입니다.
    force
    시작 호환성 검사를 실행합니다. RWF_ATOMIC 쓰기에 실패하면 시작되지 않습니다. 원자 모드 구성을 설정합니다.
    force_unsafe
    시작 호환성 검사를 실행하지 않습니다. 경고를 반환하지만 RWF_ATOMIC 쓰기에 실패하면 계속 진행됩니다. 원자 모드 구성을 설정합니다.

    force/force_unsafe 구성에서 full_page_writes, io_combine_limit, debug_io_direct 구성은 자동으로 설정됩니다. 선택적 on/on_unsafe 구성을 사용하여 이러한 구성을 재정의할 수 있습니다.

AlloyDB Omni I/O 가속 기능 설정

  1. 데이터 디렉터리에 XFS 파일 시스템을 설정합니다. XFS는 페이지 크기보다 큰 파일 시스템 블록 크기를 지원하므로 사용됩니다. AlloyDB Omni는 XFS를 사용하여 전체 RWF_ATOMIC 지원과 함께 8KiB 블록을 원자적으로 쓸 수 있습니다.

    1. 블록 크기가 8KiB인 XFS 파일 시스템을 만들고 원하는 데이터 디렉터리 (DATA_DIR) 위치에 마운트합니다.

      sudo mkfs.xfs -f -b size=8k /dev/$DEVICE
      sudo mount /dev/$DEVICE DATA_DIR
      

      다음과 같이 바꿉니다.

      • DATA_DIR: 데이터 디렉터리 위치입니다.
    2. 커널 로그를 확인하여 8k 블록이 사용되는지 확인합니다.

      > sudo journalctl -f
      ...
      kernel: XFS (sdc): EXPERIMENTAL large block size feature enabled.  Use at your own risk!
      kernel: XFS (sdc): Mounting V5 Filesystem 350aa26a-7555-4566-94c1-74e54ddc9250
      ...
      
  2. 선택사항: AlloyDB Omni 디스크 캐시를 설정합니다.

    다음 예를 사용하여 ext4,를 사용하여 파일 시스템을 만든 다음 파일 시스템을 마운트합니다.

    sudo /sbin/mkfs.ext4 -m 1 -F -E lazy_itable_init=0,lazy_journal_init=0 /dev/DEVICE
    sudo mount --make-shared -o noatime,discard,errors=panic /dev/DEVICE /OMNI_DISK_CACHE_DIRECTORY
    

    다음과 같이 바꿉니다.

    • DEVICE: 애플리케이션이 I/O 작업 (데이터 읽기 또는 쓰기)을 실행하기 위해 상호작용하는 항목입니다.

    기본 스토리지에서 더 높은 IOPS (초당 입출력 작업)를 제공하지 않는 경우 AlloyDB Omni I/O 가속 기능의 최적 성능을 지원하려면 AlloyDB Omni 디스크 캐시를 설정하는 것이 좋습니다. 자세한 내용은 디스크 캐시를 사용하여 데이터베이스 성능 가속화를 참고하세요.

  3. AlloyDB Omni를 다운로드하여 실행합니다.

    1. 최신 AlloyDB Omni Docker 컨테이너를 다운로드합니다. 자세한 내용은 VM에 AlloyDB Omni 설치를 참고하세요.
    2. 디스크 캐시를 사용하려면 디스크 캐시를 사용하여 데이터베이스 성능 가속화의 안내를 따르세요.
    3. io_uring를 허용하려면 인수 --security-opts="seccomp:unconfined"를 추가합니다.

      docker run -d --name CONTAINER_NAME \
         -e POSTGRES_PASSWORD=NEW_PASSWORD \
         -v DATA_DIR:/var/lib/postgresql/data \
         -v /OMNI_DISK_CACHE_DIRECTORY:/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER \  # Only if disk cache is enabled
         -p HOST_PORT:5432 \
         --security-opts="seccomp:unconfined" \
         --restart=always \
         google/alloydbomni:16
      

      다음을 바꿉니다.

      • CONTAINER_NAME: 호스트 머신의 컨테이너 레지스트리에 있는 AlloyDB Omni 컨테이너의 이름입니다.
      • NEW_PASSWORD: 컨테이너의 PostgreSQL 사용자에게 할당된 비밀번호입니다.
      • DATA_DIR: 데이터 디렉터리 위치입니다.
      • CACHE_DIRECTORY_PATH_INSIDE_CONTAINER: 컨테이너 내의 디스크 캐시 디렉터리 경로입니다.
      • HOST_PORT: 컨테이너가 자체 포트 5432를 게시해야 하는 호스트 머신의 TCP 포스트입니다.
  4. 원자적 I/O를 사용하도록 AlloyDB Omni를 구성합니다.

    alloydb_omni_atomic GUC를 적절한 값으로 설정하고 컨테이너를 다시 시작합니다.

    alter system set alloydb_omni_atomic='force';
    sudo docker restart CONTAINER_NAME;
    

    다음을 바꿉니다.

    • CONTAINER_NAME: 호스트 머신의 컨테이너 레지스트리에 있는 AlloyDB Omni 컨테이너의 이름입니다.

제한사항

  • PostgreSQL 16에는 단일 블록 I/O를 실행하는 경로가 포함되어 있어 O_DIRECT 속도가 느려집니다. 데이터베이스 복구(재실행 경로), 진공 스캔, Omni 디스크 캐시 사전 준비 중에 읽기가 느려질 수 있습니다.
  • 읽기 복제본의 AlloyDB Omni I/O 가속 기능은 미리보기에서 지원되지 않습니다.
  • 워크로드가 과도할 경우 ARM 기반 시스템은 아키텍처 차이로 인해 성능이 저하될 수 있습니다.
  • 워크로드 증가로 인한 제한으로 인해 libaio는 리소스 사용 불가에 취약합니다. 사용 가능한 시스템 메모리가 부족하면 io_uring에 메모리 할당 문제가 발생할 수 있습니다.