השוואת הביצועים של אחסון SSD מקומי

מגבלות הביצועים של SSD מקומי שמופיעות בקטע בחירת אפשרות אחסון הושגו באמצעות הגדרות ספציפיות במופע של SSD מקומי. אם המכונה הווירטואלית (VM) שלכם לא מצליחה להגיע למגבלות הביצועים האלה, וכבר הגדרתם את המכונה באמצעות ההגדרות המומלצות של SSD מקומי, אתם יכולים להשוות את מגבלות הביצועים שלכם למגבלות שפורסמו. כדי לעשות את זה, צריך לשכפל את ההגדרות שבהן השתמש צוות Compute Engine.

ההוראות האלה מבוססות על ההנחה שאתם משתמשים במערכת הפעלה Linux עם מנהל החבילות apt.

יצירת מכונה וירטואלית עם מכשיר SSD מקומי אחד

מספר כונני ה-SSD המקומיים שיכולים להיות למכונה וירטואלית מבוסס על סוג המכונה שמשמש ליצירת המכונה הווירטואלית. פרטים נוספים מופיעים במאמר בנושא בחירת מספר תקין של התקני SSD מקומיים.

  1. יוצרים מופע של SSD מקומי עם ארבעה או שמונה ליבות vCPU לכל מכשיר, בהתאם לעומס העבודה.

    לדוגמה, הפקודה הבאה יוצרת מכונת C3 וירטואלית עם 4 מעבדים וירטואליים ו-SSD מקומי אחד.

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

    במכונות וירטואליות מסוגים מהדור השני ומדורות קודמים, מציינים את מספר ה-SSD המקומי לצירוף למכונה הווירטואלית באמצעות הדגל --local-ssd. הפקודה הבאה יוצרת מכונת N2 VM עם 8 ליבות vCPU ו-SSD מקומי אחד שמשתמש בממשק הדיסק NVMe:

    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 מקומי

  1. אם רוצים לצרף 24 או יותר מכשירי Local SSD למופע, צריך להשתמש בסוג מכונה עם 32 או יותר ליבות vCPU.

    הפקודות הבאות יוצרות מכונת VM עם המספר המקסימלי המותר של דיסקי SSD מקומיים באמצעות ממשק NVMe:

    צירוף אחסון 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

    בסדרות מכונות חדשות יותר מוצעים -lssd סוגי מכונות שמגיעים עם מספר מוגדר מראש של דיסקים מסוג Local SSD. לדוגמה, כדי להשוות ביצועים של מכונה וירטואלית עם 32 כונני SSD מקומיים (קיבולת של 12TiB), משתמשים בפקודה הבאה:

    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. בדוגמה הבאה, מתבצע מיזוג של 24 מכשירי SSD מקומיים שמשתמשים בממשק NVMe. במכשירי SSD מקומיים שמשתמשים ב-SCSI, משתמשים בשמות המכשירים שמוחזרים מהפקודה find בשלב 3.

    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=48 --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=48 --rw=randwrite --blocksize=4k --group_reporting --norandommap
    

השוואה לשוק של מכונות וירטואליות עם אופטימיזציה לאחסון

  1. צריך להשוות ביצועים של מכונות וירטואליות שעברו אופטימיזציה לאחסון (כמו Z3 Family) ישירות למחיצות במכשיר. אפשר לקבל את שמות המחיצות באמצעות 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 המקומיות, ומפרידים ביניהן באמצעות נקודתיים.

    # 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
    

המאמרים הבאים