이 페이지에서는 워크로드와 쿼리 성능을 개선하기 위해 컴퓨팅 및 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_uring
및 libaio
라이브러리를 사용하여 비동기 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 디스크 캐시에서 읽을 때 스트리밍 읽기를 사용하도록 지원을 확장하여 읽기 성능을 향상시킵니다. 이 접근 방식을 사용하면 쿼리에서 사용할 수 있도록 스토리지에서 공유 메모리 풀로 버퍼를 효과적으로 미리 읽을 수 있습니다. 스토리지에서 이러한 블록이 필요할 때마다 읽을 필요가 없습니다.
시작하기 전에
운영체제 및 파일 시스템 지원을 확인합니다.
커널이
RWF_ATOMIC
를 지원하는지 확인하려면 커널 버전을 확인하세요. 다음 예에서는 원자 쓰기를 지원하는 Linux 6.14 커널을 실행하는 Ubuntu 24.10 머신을 사용합니다.> sudo hostnamectl ... Operating System: Ubuntu 24.10 Kernel: Linux 6.14.0-061400rc5-generic ...
커널에서
RWF_ATOMIC
를 지원하지 않는 경우RWF_ATOMIC
를 지원하는 커널 버전으로 업데이트하는 것이 좋습니다.
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 가속 기능 설정
데이터 디렉터리에 XFS 파일 시스템을 설정합니다. XFS는 페이지 크기보다 큰 파일 시스템 블록 크기를 지원하므로 사용됩니다. AlloyDB Omni는 XFS를 사용하여 전체
RWF_ATOMIC
지원과 함께 8KiB 블록을 원자적으로 쓸 수 있습니다.블록 크기가 8KiB인 XFS 파일 시스템을 만들고 원하는 데이터 디렉터리 (
DATA_DIR
) 위치에 마운트합니다.sudo mkfs.xfs -f -b size=8k /dev/$DEVICE sudo mount /dev/$DEVICE DATA_DIR
다음과 같이 바꿉니다.
DATA_DIR
: 데이터 디렉터리 위치입니다.
커널 로그를 확인하여 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 ...
선택사항: 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 디스크 캐시를 설정하는 것이 좋습니다. 자세한 내용은 디스크 캐시를 사용하여 데이터베이스 성능 가속화를 참고하세요.
AlloyDB Omni를 다운로드하여 실행합니다.
- 최신 AlloyDB Omni Docker 컨테이너를 다운로드합니다. 자세한 내용은 VM에 AlloyDB Omni 설치를 참고하세요.
- 디스크 캐시를 사용하려면 디스크 캐시를 사용하여 데이터베이스 성능 가속화의 안내를 따르세요.
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 포스트입니다.
원자적 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
에 메모리 할당 문제가 발생할 수 있습니다.