로컬 SSD 성능 벤치마킹


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

여기서는 apt 패키지 관리자가 설치된 Linux 운영체제를 사용하는 것으로 가정합니다.

로컬 SSD 기기 1개가 있는 VM 만들기

VM에 포함할 수 있는 로컬 SSD 수는 VM을 만드는 데 사용하는 머신 유형을 기반으로 합니다. 자세한 내용은 유효한 로컬 SSD 수 선택을 참조하세요.

  1. 워크로드에 따라 기기당 4개 또는 8개의 vCPU를 포함하는 로컬 SSD 인스턴스를 만듭니다.

    예를 들어 다음 명령어는 vCPU 4개와 로컬 SSD 1개가 있는 C3 VM을 만듭니다.

    gcloud compute instances create c3-ssd-test-instance \
        --machine-type "c3-standard-4-lssd"
    

    2세대 및 이전 머신 유형의 경우 --local-ssd 플래그를 사용하여 VM에 연결할 로컬 SSD 수를 지정합니다. 다음 명령어는 NVMe 디스크 인터페이스를 사용하는 vCPU 8개와 로컬 SSD 1개가 있는 N2 VM을 만듭니다.

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

    # install tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # discard Local SSD sectors
    sudo blkdiscard /dev/disk/by-id/google-local-nvme-ssd-0
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --end_fsync=1 \
    --iodepth=128 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=readbenchmark --runtime=30 --ioengine=libaio \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0  --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=writebenchmark  --runtime=30 --ioengine=libaio \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0 --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randwrite --blocksize=4k --group_reporting
    

최대 로컬 SSD 수가 있는 VM 만들기

  1. 인스턴스에 24개 이상의 로컬 SSD 기기를 연결하려면 32개 이상의 vCPU가 있는 머신 유형을 사용하세요.

    다음 명령어는 NVMe 인터페이스를 사용하여 허용 되는 최대 로컬 SSD 디스크 수로 VM을 만듭니다.

    VM에 로컬 SSD 연결

    gcloud compute instances create ssd-test-instance \
        --machine-type "n1-standard-32" \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme
    

    -lssd 머신 유형 사용

    최신 머신 시리즈는 사전 정의된 수의 로컬 SSD 디스크와 함께 제공되는 -lssd 머신 유형을 제공합니다. 예를 들어 32개의 로컬 SSD(12TiB 용량)가 있는 VM을 벤치마킹하려면 다음 명령어를 사용합니다.

    gcloud compute instances create ssd-test-instance \
        --machine-type "c3-standard-176-lssd"
    
  2. mdadm 도구를 설치합니다. mdadm의 설치 프로세스에는 스크립트를 중단하는 사용자 프롬프트가 포함되어 있으므로 프로세스를 수동으로 실행합니다.

    Debian 및 Ubuntu

    sudo apt update && sudo apt install mdadm --no-install-recommends
    

    CentOS 및 RHEL

    sudo yum install mdadm -y
    

    SLES 및 openSUSE

    sudo zypper install -y mdadm
    
  3. find 명령어를 사용하여 함께 마운트할 모든 로컬 SSD를 식별합니다.

    find /dev/ | grep google-local-nvme-ssd
    

    결과는 다음과 유사합니다.

    /dev/disk/by-id/google-local-nvme-ssd-23
    /dev/disk/by-id/google-local-nvme-ssd-22
    /dev/disk/by-id/google-local-nvme-ssd-21
    /dev/disk/by-id/google-local-nvme-ssd-20
    /dev/disk/by-id/google-local-nvme-ssd-19
    /dev/disk/by-id/google-local-nvme-ssd-18
    /dev/disk/by-id/google-local-nvme-ssd-17
    /dev/disk/by-id/google-local-nvme-ssd-16
    /dev/disk/by-id/google-local-nvme-ssd-15
    /dev/disk/by-id/google-local-nvme-ssd-14
    /dev/disk/by-id/google-local-nvme-ssd-13
    /dev/disk/by-id/google-local-nvme-ssd-12
    /dev/disk/by-id/google-local-nvme-ssd-11
    /dev/disk/by-id/google-local-nvme-ssd-10
    /dev/disk/by-id/google-local-nvme-ssd-9
    /dev/disk/by-id/google-local-nvme-ssd-8
    /dev/disk/by-id/google-local-nvme-ssd-7
    /dev/disk/by-id/google-local-nvme-ssd-6
    /dev/disk/by-id/google-local-nvme-ssd-5
    /dev/disk/by-id/google-local-nvme-ssd-4
    /dev/disk/by-id/google-local-nvme-ssd-3
    /dev/disk/by-id/google-local-nvme-ssd-2
    /dev/disk/by-id/google-local-nvme-ssd-1
    /dev/disk/by-id/google-local-nvme-ssd-0
    

    find는 순서를 보장하지 않습니다. 출력 줄 수가 예상 SSD 파티션 수와 일치하는 한 기기가 다른 순서로 나열되더라도 괜찮습니다.

    SCSI 기기를 사용하는 경우 다음 find 명령어를 사용합니다.

    find /dev/ | grep google-local-ssd
    

    NVMe 기기는 모두 google-local-nvme-ssd-# 형식이어야 하고 SCSI 기기는 모두 google-local-ssd-# 형식이어야 합니다.

  4. mdadm 도구를 사용하여 여러 로컬 SSD 기기를 /dev/md0이라는 이름의 단일 배열로 결합합니다. 다음 예시에서는 NVMe 인터페이스를 사용하는 로컬 SSD 기기 24개를 병합합니다. SCSI를 사용하는 로컬 SSD 기기의 경우 3단계의 find 명령어에서 반환된 기기 이름을 사용합니다.

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=24 \
    /dev/disk/by-id/google-local-nvme-ssd-0 \
    /dev/disk/by-id/google-local-nvme-ssd-1 \
    /dev/disk/by-id/google-local-nvme-ssd-2 \
    /dev/disk/by-id/google-local-nvme-ssd-3 \
    /dev/disk/by-id/google-local-nvme-ssd-4 \
    /dev/disk/by-id/google-local-nvme-ssd-5 \
    /dev/disk/by-id/google-local-nvme-ssd-6 \
    /dev/disk/by-id/google-local-nvme-ssd-7 \
    /dev/disk/by-id/google-local-nvme-ssd-8 \
    /dev/disk/by-id/google-local-nvme-ssd-9 \
    /dev/disk/by-id/google-local-nvme-ssd-10 \
    /dev/disk/by-id/google-local-nvme-ssd-11 \
    /dev/disk/by-id/google-local-nvme-ssd-12 \
    /dev/disk/by-id/google-local-nvme-ssd-13 \
    /dev/disk/by-id/google-local-nvme-ssd-14 \
    /dev/disk/by-id/google-local-nvme-ssd-15 \
    /dev/disk/by-id/google-local-nvme-ssd-16 \
    /dev/disk/by-id/google-local-nvme-ssd-17 \
    /dev/disk/by-id/google-local-nvme-ssd-18 \
    /dev/disk/by-id/google-local-nvme-ssd-19 \
    /dev/disk/by-id/google-local-nvme-ssd-20 \
    /dev/disk/by-id/google-local-nvme-ssd-21 \
    /dev/disk/by-id/google-local-nvme-ssd-22 \
    /dev/disk/by-id/google-local-nvme-ssd-23
    

    응답은 다음 예시와 유사합니다.

    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.
    

    mdadm --detail을 사용하여 배열의 세부정보를 확인할 수 있습니다. --prefer=by-id 플래그를 추가하면 /dev/disk/by-id 경로를 사용하는 기기가 나열됩니다.

     sudo mdadm --detail --prefer=by-id /dev/md0
    

    배열의 각 기기에서 다음과 같이 출력되어야 합니다.

     ...
     Number   Major   Minor   RaidDevice State
     0     259        0        0      active sync   /dev/disk/by-id/google-local-nvme-ssd-0
     ...
    
  5. VM에서 다음 스크립트를 실행합니다. 이 스크립트는 성능 섹션에 제공된 SSD 성능 수치를 얻기 위해 사용된 설정을 복제합니다. --bs 매개변수는 여러 유형의 읽기 및 쓰기 작업 결과에 영향을 주는 블록 크기를 정의합니다.

    # install tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile \
    --filename=/dev/md0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --end_fsync=1 \
    --iodepth=128 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=benchmark  --runtime=30 \
    --filename=/dev/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=32 --rw=randread --blocksize=4k --group_reporting --norandommap
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=benchmark  --runtime=30 \
    --filename=/dev/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=32 --rw=randwrite --blocksize=4k --group_reporting --norandommap
    

스토리지 최적화 VM 벤치마킹

  1. 스토리지 최적화 VM(예: Z3 제품군)은 기기 파티션을 기준으로 직접 벤치마킹해야 합니다. lsblk를 사용하여 파티션 이름을 가져올 수 있습니다.

    lsblk -o name,size -lpn | grep 2.9T | awk '{print $1}'
    

    결과는 다음과 유사합니다.

    /dev/nvme1n1
    /dev/nvme2n1
    /dev/nvme3n1
    /dev/nvme4n1
    /dev/nvme5n1
    /dev/nvme6n1
    /dev/nvme7n1
    /dev/nvme8n1
    /dev/nvme9n1
    /dev/nvme10n1
    /dev/nvme11n1
    /dev/nvme12n1
    
  2. 로컬 SSD 파티션을 콜론 구분 기호로 구분하여 로컬 SSD 파티션에 대한 벤치마크를 직접 실행합니다.

    # install benchmarking tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # Full Write Pass.
    # SOVM achieves max read performance on previously written/discarded ranges.
    sudo  fio --readwrite=write --blocksize=1m --iodepth=4 --ioengine=libaio \
    --direct=1 --group_reporting \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --readwrite=randread --blocksize=4k --iodepth=128  \
    --numjobs=4 --direct=1 --runtime=30 --group_reporting  --ioengine=libaio \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --readwrite=randwrite --blocksize=4k --iodepth=128 \
    --numjobs=4 --direct=1 --runtime=30 --group_reporting --ioengine=libaio \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    

다음 단계