로컬 SSD 성능 최적화

로컬 SSD 최적화

디스크 유형별 성능 차트는 로컬 SSD 기기에서 얻을 수 있는 최대 성능을 보여줍니다. 이러한 속도를 얻기 위해 앱 및 VM 인스턴스를 최적화하려면 다음 권장사항을 따르세요.

로컬 SSD에 게스트 환경 최적화 사용

기본적으로 대부분의 Compute Engine에서 제공되는 Linux 이미지는 최대 로컬 SSD 성능에 맞게 인스턴스를 구성하는 최적화 스크립트를 자동으로 실행합니다. 이 스크립트는 특정 sysfs 설정을 사용하여 머신의 전체 성능을 높이고 특정 가상 CPU(vCPU)에 대한 인터럽트 요청(IRQ)을 마스킹합니다. 이 스크립트는 Compute Engine 로컬 SSD 기기의 성능만 최적화합니다.

Ubuntu, SLES 및 기타 이전 이미지는 이 성능 최적화를 포함하도록 구성할 수 없습니다. 이러한 이미지 또는 v20141218 이전의 이미지를 사용 중인 경우에는 게스트 환경을 설치하여 해당 최적화를 사용할 수 있습니다.

NVMe 또는 SCSI 인터페이스에 최상의 이미지 선택

로컬 SSD는 NVMe 또는 SCSI 인터페이스를 노출할 수 있으며, 운영체제에 따라 가장 적합한 인터페이스를 선택할 수 있습니다. 부팅 디스크 이미지에서 가장 잘 작동하는 로컬 SSD 기기의 인터페이스를 선택하세요. 인스턴스가 SCSI 인터페이스를 사용하여 로컬 SSD에 연결되는 경우, 게스트 OS에서 멀티 큐 SCSI를 사용해서 SCSI 인터페이스에 대해 최적 성능을 달성할 수 있습니다.

커스텀 이미지 및 로컬 SSD를 포함하는 인스턴스에서 멀티 큐 SCSI 사용

일부 공개 이미지는 멀티 큐 SCSI를 지원합니다. 프로젝트로 가져오는 커스텀 이미지에 멀티 큐 SCSI 기능이 필요한 경우, 이를 직접 사용 설정해야 합니다. 가져온 Linux 이미지는 커널 버전 3.19 이상을 포함하는 경우에만 멀티 큐 SCSI를 사용할 수 있습니다.

커스텀 이미지에서 멀티 큐 SCSI를 사용하도록 설정하려면 VIRTIO_SCSI_MULTIQUEUE 게스트 OS 기능이 설정된 상태로 이미지를 가져오고 GRUB 구성 파일에 항목을 추가합니다.

CentOS

CentOS7만 해당합니다.

  1. API를 사용하여 커스텀 이미지를 가져오고 type 값이 VIRTIO_SCSI_MULTIQUEUEguestOsFeatures 항목을 포함합니다.

  2. 커스텀 이미지를 사용해서 인스턴스를 만들고 하나 이상의 로컬 SSD를 연결합니다.

  3. SSH를 통해 인스턴스에 연결합니다.

  4. /sys/module/scsi_mod/parameters/use_blk_mq 파일의 값을 확인합니다.

    $ cat /sys/module/scsi_mod/parameters/use_blk_mq
    

    이 파일의 값이 Y면 가져온 이미지에 멀티 큐 SCSI가 이미 사용된 것입니다. 이 파일의 값이 N이면 GRUB 구성 파일의 GRUB_CMDLINE_LINUX 항목에 scsi_mod.use_blk_mq=Y를 포함하고 시스템을 다시 시작합니다.

    1. 텍스트 편집기에서 /etc/default/grub GRUB 구성 파일을 엽니다.

      $ sudo vi /etc/default/grub
      
    2. scsi_mod.use_blk_mq=YGRUB_CMDLINE_LINUX 항목에 추가합니다.

      GRUB_CMDLINE_LINUX=" vconsole.keymap=us console=ttyS0,38400n8 vconsole.font=latarcyrheb-sun16 scsi_mod.use_blk_mq=Y"
      
    3. 구성 파일을 저장합니다.

    4. grub2-mkconfig 명령어를 실행하여 GRUB 파일을 다시 생성하고 구성을 완료합니다.

      $ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
      
    5. 인스턴스를 재부팅합니다.

      $ sudo reboot
      

Ubuntu

  1. Compute Engine API를 사용하여 커스텀 이미지를 가져오고 type 값이 VIRTIO_SCSI_MULTIQUEUEguestOsFeatures 항목을 포함합니다.

  2. 커스텀 이미지를 사용하여 인스턴스를 만들고 SCSI 인터페이스를 사용하여 하나 이상의 로컬 SSD를 연결합니다.

  3. SSH를 통해 인스턴스에 연결합니다.

  4. /sys/module/scsi_mod/parameters/use_blk_mq 파일의 값을 확인합니다.

    $ cat /sys/module/scsi_mod/parameters/use_blk_mq
    

    이 파일의 값이 Y면 가져온 이미지에 멀티 큐 SCSI가 이미 사용된 것입니다. 이 파일의 값이 N이면 GRUB 구성 파일의 GRUB_CMDLINE_LINUX 항목에 scsi_mod.use_blk_mq=Y를 포함하고 시스템을 다시 시작합니다.

    1. 텍스트 편집기에서 sudo nano /etc/default/grub GRUB 구성 파일을 엽니다.

      $ sudo nano /etc/default/grub
      
    2. scsi_mod.use_blk_mq=YGRUB_CMDLINE_LINUX 항목에 추가합니다.

      GRUB_CMDLINE_LINUX="scsi_mod.use_blk_mq=Y"
      
    3. 구성 파일을 저장합니다.

    4. update-grub 명령어를 실행하여 GRUB 파일을 다시 생성하고 구성을 완료합니다.

      $ sudo update-grub
      
    5. 인스턴스를 재부팅합니다.

      $ sudo reboot
      

쓰기 캐시 소거 중지

파일 시스템, 데이터베이스, 기타 앱은 여러 체크포인트에서 데이터가 내구성 스토리지에 커밋되었는지 확인하기 위해 캐시 소거를 사용합니다. 대부분의 저장 기기에서는 이러한 기본값이 적합합니다. 하지만 쓰기 캐시 소거는 로컬 SSD에서 상당히 느리게 수행됩니다. 일부 앱에서는 해당 앱에서 자동 소거 명령어를 중지하거나 파일 시스템 수준에서 소거 옵션을 중지하여 쓰기 성능을 높일 수 있습니다.

로컬 SSD는 파일 시스템 및 앱에 대해 사용자가 설정한 소거 명령에 관계없이 항상 2초 내에 캐시된 쓰기를 소거하므로, 일시적인 하드웨어 오류가 발생하더라도 기껏해야 2초 분량의 캐시된 쓰기만 손실될 수 있습니다. 영구적인 하드웨어 오류가 발생하면 데이터가 소거되는지 여부에 관계없이 기기에 있는 모든 데이터가 손실될 수 있으므로 중요한 데이터는 영구 디스크 또는 Cloud Storage 버킷에 백업해야 합니다.

ext4 파일 시스템에서 쓰기 캐시 소거를 사용 중지하려면 마운트 옵션 또는 /etc/fstab 항목에 nobarrier 설정을 포함해야 합니다. 예를 들면 다음과 같습니다.

$ sudo mount -o discard,defaults,nobarrier /dev/[LOCAL_SSD_ID] /mnt/disks/[MNT_DIR]

여기서 [LOCAL_SSD_ID]는 마운트하려는 로컬 SSD의 기기 ID이고 [MNT_DIR]은 마운트할 디렉터리입니다.

로컬 SSD 성능 벤치마킹

성능 섹션에 제공된 로컬 SSD 성능 수치는 로컬 SSD 인스턴스에서의 특정 설정을 사용하여 가져온 것입니다. 인스턴스가 이러한 성능 한도에 도달하는 데 문제가 있고, 권장 로컬 SSD 설정을 사용하여 인스턴스를 이미 구성한 경우에는 Compute Engine 팀에서 사용된 설정을 복제하여 게시된 한도와 사용자의 성능 한도를 비교할 수 있습니다.

  1. 워크로드에 따라 각 기기에 대해 4개 또는 8개의 vCPU를 포함하는 로컬 SSD 인스턴스를 만듭니다. 예를 들어 하나의 인스턴스에 4개의 로컬 SSD 장치를 연결하려는 경우 vCPU가 16개 또는 32개 포함된 머신 유형을 사용합니다.

    다음 명령어는 8개의 vCPU와 단일 로컬 SSD를 포함하는 가상 머신을 만듭니다.

    gcloud compute instances create ssd-test-instance \
    --machine-type "n1-standard-8" \
    --local-ssd interface="SCSI"
    
  2. VM에서 다음 스크립트를 실행합니다. 이 스크립트는 성능 섹션에 제공된 SSD 성능 수치를 얻기 위해 사용된 설정을 복제합니다. --bs 매개변수는 여러 유형의 읽기 및 쓰기 작업 결과에 영향을 주는 블록 크기를 정의합니다.

    # install dependencies
    sudo apt-get update -y
    sudo apt-get install -y build-essential git libtool gettext autoconf \
    libgconf2-dev libncurses5-dev python-dev fio bison autopoint
    
    # blkdiscard
    git clone https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git
    cd util-linux/
    ./autogen.sh
    ./configure --disable-libblkid
    make
    sudo mv blkdiscard /usr/bin/
    sudo blkdiscard /dev/disk/by-id/google-local-ssd-0
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile --size=100G --filesize=100G \
    --filename=/dev/disk/by-id/google-local-ssd-0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --refill_buffers --end_fsync=1 \
    --iodepth=200 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=benchmark --size=100G --runtime=30 \
    --filename=/dev/disk/by-id/google-local-ssd-0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randread --blocksize=4k --group_reporting
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=benchmark --size=100G --runtime=30 \
    --filename=/dev/disk/by-id/google-local-ssd-0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randwrite --blocksize=4k --group_reporting
    

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Compute Engine 문서