영구 디스크 성능 최적화


영구 디스크는 VM의 사용량이 성능 한도에 도달하기에 충분한 경우 디스크 유형 차트에 기술된 성능을 제공합니다. 성능 요구에 맞게 영구 디스크 볼륨 크기를 적절하게 조정한 후에는 앱 및 운영체제에 일부 조정이 필요할 수 있습니다.

다음 섹션에서는 성능 향상을 위해 조정할 수 있는 몇 가지 핵심 요소와 이를 특정 유형의 워크로드에 적용하는 방법에 대해 설명합니다.

I/O 큐 깊이

  • 높은 I/O 큐 깊이 사용

    영구 디스크는 네트워크 연결 스토리지(NAS) 기기로, 매우 높은 IOPS 및 처리량을 제공하지만 기존 하드 드라이브와 로컬 SSD와 같은 실제 연결 디스크보다 지연 시간이 깁니다. 영구 디스크의 최대 IOPS 및 처리량 한도에 도달하려면 지연 시간에 애플리케이션 병목 현상이 발생하지 않을 만큼 충분한 병렬 처리를 사용하여 I/O 요청을 실행해야 합니다. 32 이상의 I/O 큐 깊이를 사용하도록 운영체제 또는 애플리케이션의 설정을 조정합니다.

    SSD 영구 디스크의 지연 시간이 800마이크로초인 경우 I/O 작업을 순차적으로 실행하면 최대 1,250 IOPS에 도달할 수 있습니다.

    I/O당 800마이크로초 = 0.00125 I/O당 1마이크로초 = 초당 1,250 I/O

    이는 디스크의 최대 한도인 30,000 IOPS에 훨씬 못 미칩니다.

I/O 크기

  • 큰 I/O 크기 사용

    IOPS 한도와 지연 시간이 애플리케이션 성능에 병목 현상을 일으키지 않도록 크기가 최소 256KB 이상인 I/O를 사용합니다.

    분산 파일 시스템 애플리케이션에는 큰 스트라이프 크기를 사용합니다. 큰 스트라이프 크기(예: 4MB 이상)를 사용하는 임의 I/O 워크로드는 워크로드가 여러 순차 스트림 디스크 액세스를 유사하게 모방하므로 표준 영구 디스크에서 뛰어난 성능을 발휘합니다.

  • 애플리케이션이 충분한 I/O를 생성 중인지 확인

    애플리케이션이 디스크의 IOPS 및 처리량 한도를 최대한 활용할 수 있을 만큼 충분한 I/O를 생성하는지 확인합니다. 워크로드 I/O 패턴에 대해 자세히 알아보려면 Cloud Monitoring에서 영구 디스크 사용량 및 성능 측정항목을 검토하세요.

  • I/O를 생성하는 인스턴스에서 사용 가능한 CPU가 충분한지 확인

    VM 인스턴스에서 CPU가 부족하면 앞서 설명한 IOPS를 앱이 관리할 수 없습니다. 예상 트래픽의 2,000~2,500 IOPS당 사용 가능한 CPU가 1개씩 있는 것이 좋습니다.

I/O 과부하를 50TB 스팬으로 제한

I/O 과부하를 50TB 스팬으로 제한하면 최대 성능에 도달합니다. 개별 영구 디스크의 용량을 합친 결과가 50TB 이하인 스팬은 성능을 계산할 때 단일 50TB 스팬과 동일하게 간주될 수 있습니다. 스팬은 물리적 디스크 하나에 있는 논리적 블록 주소의 연속 범위를 나타냅니다.

지연 초기화 중지 및 DISCARD 명령어 사용 설정

영구 디스크에서는 블록이 더 이상 사용되지 않을 때 운영체제가 디스크에 이를 알릴 수 있게 해주는 DISCARD 또는 TRIM 명령이 지원됩니다. DISCARD 지원을 통해서는 OS가 블록을 제로로 만드는 비용 없이 디스크 블록을 더 이상 필요하지 않은 것으로 표시할 수 있습니다.

대부분의 Linux 운영체제에서는 인스턴스에 영구 디스크를 마운트할 때 DISCARD를 사용하도록 설정합니다. Windows Server 2012 R2 인스턴스에서는 영구 디스크를 마운트할 때 기본적으로 DISCARD가 사용으로 설정됩니다.

DISCARD를 사용하도록 설정하면 일반적인 런타임 성능이 향상되며, 처음 마운트될 때 디스크의 성능이 크게 향상될 수 있습니다. 전체 디스크 볼륨을 포맷하기 위해서는 시간이 오래 걸릴 수 있으므로 '지연 포맷'이라는 방식이 일반적으로 사용됩니다. 지연 포맷의 단점은 볼륨이 마운트되는 최초에 비용이 자주 지불된다는 것입니다. 지연 초기화를 중지하고 DISCARD 명령어를 사용하면 포맷 및 마운트를 빠르게 수행할 수 있습니다.

  • 다음 매개변수를 mkfs.ext4로 전달하여 포맷 중 지연 초기화를 중지하고 DISCARD를 사용합니다.

    -E lazy_itable_init=0,lazy_journal_init=0,discard
    

    lazy_journal_init=0 매개변수는 CentOS 6 또는 RHEL 6 이미지를 사용하는 인스턴스에서는 작동하지 않습니다. 이러한 인스턴스에서는 이 매개변수 없이 영구 디스크를 포맷합니다.

    -E lazy_itable_init=0,discard
    
  • 다음 플래그를 마운트 명령어에 전달하여 마운트 시에 DISCARD 명령어를 사용합니다.

    -o discard
    

영구 디스크는 discard 옵션이 사용된 상태에서 제대로 작동합니다. 하지만 discard 옵션을 사용하는 것 외에 추가로 또는 이를 사용하지 않은 상태로 선택적으로 fstrim을 주기적으로 실행할 수 있습니다. discard 옵션을 사용하지 않을 경우에는 디스크 스냅샷을 만들기 전에 fstrim을 실행합니다. 파일 시스템을 자르면 더 작은 스냅샷 이미지를 만들어서 스냅샷 저장 비용을 줄일 수 있습니다.

캐시 미리 읽기

I/O 성능을 높이기 위해 운영체제에서는 파일 읽기가 요청될 때 후속 데이터도 읽기가 요청될 가능성이 있다는 가정에 따라 요청된 것보다 많은 양의 파일을 메모리로 읽어들이는 미리 읽기와 같은 기법이 사용됩니다. 미리 읽기 양이 늘어날수록 처리량이 늘어나지만 메모리 및 IOPS 효율이 낮아집니다. 미리 읽기 양이 줄어들면 IOPS가 높아지지만 처리량이 줄어듭니다.

Linux 시스템의 경우 blockdev 명령어를 사용하여 미리 읽기 값을 가져오고 설정할 수 있습니다.

$ sudo blockdev --getra /dev/[DEVICE_ID]
$ sudo blockdev --setra [VALUE] /dev/[DEVICE_ID]

미리 읽기 값은 <desired_readahead_bytes>/512바이트입니다.

예를 들어 미리 읽기를 8MB로 지정할 경우, 8MB는 8,388,608바이트(8 * 1024 * 1024)입니다.

8388608 bytes / 512 bytes = 16384

blockdev를 16384으로 설정합니다.

$ sudo blockdev --setra 16384 /dev/[DEVICE_ID]

사용 가능한 CPU

영구 디스크에 대해 읽기 및 쓰기를 하려면 VM에서 CPU 주기를 사용할 수 있어야 합니다. 매우 높고 일관성 있는 IOPS 수준을 달성하려면 I/O 처리를 위해 사용 가능한 CPU가 필요합니다.

IOPS 기준의 워크로드

SQL 또는 NoSQL과 관계없이 데이터베이스는 데이터에 대한 임의 액세스 사용 패턴을 갖고 있습니다. Google은 IOPS를 기준으로 한 워크로드에 다음 값을 권장합니다.

  • 각 400~800 IOPS당 I/O 큐 깊이 1, 대규모 볼륨에서 최대 한도 64

  • 임의 읽기 IOPS 2,000당 사용 가능한 CPU 1개 및 임의 쓰기 IOPS 2,500당 사용 가능한 CPU 1개

MongoDB, Apache Cassandra, 기타 데이터베이스 애플리케이션의 권장사항 문서에서는 일반적으로 낮은 미리 읽기 값이 권장됩니다.

처리량 기준의 워크로드

Hadoop 작업과 같은 스트리밍 작업은 빠른 순차적 읽기가 유용하며, I/O 크기가 클수록 스트리밍 성능이 향상될 수 있습니다.

  • 크기가 256KB 이상인 I/O를 사용합니다.

  • 표준 영구 디스크의 경우 가능하면 8개 이상의 병렬 순차 I/O 스트림을 사용합니다. 표준 영구 디스크는 물리적 HDD 하드 드라이브와 비슷한 순차 디스크 액세스에 맞춰 I/O 성능을 최적화하도록 설계되었습니다.

  • 큰 디스크에서 합리적인 수준의 일시적 데이터 지역성에 맞게 앱이 최적화되었는지 확인

    앱이 장시간에 걸쳐 디스크의 여러 부분에 분산되어 있는 데이터에 액세스할 경우(vCPU당 수백 GB) 최적의 IOPS를 얻을 수 없습니다. 최상의 성능을 위해서는 디스크 단편화, 디스크에서 액세스되는 부분의 임의성과 같은 요소들을 고려해서 일시적인 데이터 지역성에 맞게 최적화해야 합니다.

  • SSD 영구 디스크의 경우 OS에서 I/O 스케줄러가 특정 요구를 충족하도록 구성되었는지 확인

    Linux 기반 시스템에서는 I/O 스케줄러를 noop로 설정하여 SSD 지원 기기에서 가장 높은 IOPS 수를 얻을 수 있습니다.

영구 디스크 성능 측정항목 검토

Google Cloud의 통합 모니터링 솔루션인 Cloud Monitoring에서 영구 디스크 성능 측정항목을 검토할 수 있습니다.

이러한 측정항목 중 몇몇은 디스크 제한 여부와 시점을 파악하는 데 유용합니다. 제한을 통해 간헐적으로 집중되는 I/O를 완화할 수 있습니다. 제한을 사용하면 일정 기간에 걸쳐 간헐적으로 집중되는 I/O를 분산하여 항상 디스크의 성능 제한을 충족하면서 이를 초과하지 않도록 할 수 있습니다.

자세한 내용은 영구 디스크 성능 측정항목 검토를 참조하세요.

다음 단계