השוואה לשוק של הביצועים של דיסק אחסון מתמיד (persistent disk) במכונת VM של Linux

במאמר הזה מוסבר איך להשוות לשוק את הביצועים של Persistent Disk במכונות וירטואליות (VM) של Linux. למכונות וירטואליות של Windows, אפשר לעיין במאמר השוואת ביצועים של דיסק אחסון מתמיד במכונת VM של Windows.

כדי להשוות את הביצועים של Persistent Disk ב-Linux, משתמשים ב-Flexible I/O tester (FIO) במקום בכלים אחרים להשוואת ביצועים של דיסקים, כמו dd. כברירת מחדל, dd משתמש בעומק תור נמוך מאוד של קלט/פלט, ויכול להיות שהוא לא יבדוק את ביצועי הדיסק בצורה מדויקת. באופן כללי, מומלץ להימנע משימוש במכשירים מיוחדים כמו /dev/urandom,‏ /dev/random ו-/dev/zero בבדיקות הביצועים של Persistent Disk.

כדי למדוד את ה-IOPS ואת קצב העברת הנתונים של דיסק שנמצא בשימוש במופע פעיל, צריך לבצע בדיקת ביצועים של מערכת הקבצים עם התצורה המיועדת שלה. אפשר להשתמש באפשרות הזו כדי לבדוק עומס עבודה ריאלי בלי לאבד את התוכן של הדיסק הקיים. שימו לב: כשמשווים את מערכת הקבצים לדיסק קיים, יש הרבה גורמים ספציפיים לסביבת הפיתוח שיכולים להשפיע על תוצאות ההשוואה, ויכול להיות שלא תגיעו למגבלות הביצועים של הדיסק.

כדי למדוד את הביצועים הגולמיים של דיסק אחסון מתמיד, צריך להשתמש בנקודת השוואה ישירות במכשיר הבלוקים. אפשר להשתמש באפשרות הזו כדי להשוות בין הביצועים של הדיסק לבין מגבלות הביצועים של הדיסק.

הפקודות הבאות פועלות במערכות הפעלה של Debian או Ubuntu עם מנהל החבילות apt.

השוואה בין ביצועי קלט/פלט (IOPS) וקצב העברת הנתונים (throughput) של דיסק במכונה פעילה

אם רוצים למדוד את ה-IOPS ואת קצב העברת הנתונים של עומס עבודה ריאלי בדיסק פעיל במכונה וירטואלית שפועלת, בלי לאבד את התוכן של הדיסק, צריך להשוות את הביצועים של ספרייה חדשה במערכת הקבצים הקיימת. כל בדיקה של fio רצה במשך חמש דקות.

  1. מתחברים למכונה.

  2. יחסי תלות של התקנות:

    sudo apt update
    sudo apt install -y fio
    
  3. בטרמינל, מציגים את רשימת הדיסקים שמצורפים ל-VM ומחפשים את הדיסק שרוצים לבדוק. אם דיסק האחסון המתמיד עדיין לא פורמט, צריך לפרמט את הדיסק ולהוסיף אותו.

    sudo lsblk
    
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   10G  0 disk
    └─sda1   8:1    0   10G  0 part /
    sdb      8:32   0  2.5T  0 disk /mnt/disks/mnt_dir
    

    בדוגמה הזו, אנחנו בודקים דיסק מתמיד שמבוסס על SSD בנפח 2,500GB עם מזהה המכשיר sdb.

  4. יוצרים ספרייה חדשה, fiotest, בדיסק. בדוגמה הזו, הדיסק מותקן ב-/mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  5. כדי לבדוק את קצב העברת הנתונים לכתיבה, מבצעים כתיבות רציפות עם כמה זרמים מקבילים (16 ומעלה), באמצעות גודל בלוק של קלט/פלט של 1 MB ועומק קלט/פלט של 64 לפחות:

    sudo fio --name=write_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=5m --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --group_reporting=1 --iodepth_batch_submit=64 \
    --iodepth_batch_complete_max=64
    
  6. כדי לבדוק את קצב הקלט/פלט (IOPS) של פעולות כתיבה, מבצעים פעולות כתיבה אקראיות באמצעות גודל בלוק של קלט/פלט של 4 KB ועומק קלט/פלט של 256 לפחות:

     sudo fio --name=write_iops --directory=$TEST_DIR --size=10G \
    --time_based --runtime=5m --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randwrite --group_reporting=1  \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  7. כדי לבדוק את קצב העברת הנתונים בקריאה, מבצעים קריאות רציפות עם כמה זרמים מקבילים (16 ומעלה), באמצעות גודל בלוק של קלט/פלט של 1 MB ועומק קלט/פלט של 64 לפחות:

    sudo fio --name=read_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=5m --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
    --group_reporting=1 \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64
    
  8. כדי לבדוק את קצב הקלט/פלט (IOPS) של קריאה, מבצעים קריאות אקראיות, באמצעות גודל בלוק קלט/פלט של ‎4 KB ועומק קלט/פלט של 256 לפחות:

    sudo fio --name=read_iops --directory=$TEST_DIR --size=10G \
    --time_based --runtime=5m --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randread --group_reporting=1 \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  9. ניקוי:

    sudo rm $TEST_DIR/write* $TEST_DIR/read*
    

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

אם רוצים למדוד את הביצועים של דיסקים אחסון מתמידים (persistent disk) בלבד מחוץ לסביבת הפיתוח, צריך לבדוק את ביצועי הקריאה והכתיבה של מכשיר בלוקים בדיסק אחסון מתמיד (persistent disk) ובמכונת VM זמניים. כל בדיקה של fio נמשכת חמש דקות. הפקודות הבאות מניחות שדיסק מתמיד שמבוסס על SSD בנפח 2,500 GB מצורף למכונת ה-VM. אם גודל המכשיר שונה, צריך לשנות את הערך של הארגומנט --filesize. הגודל הזה של הדיסק נדרש כדי להגיע למגבלות של קצב העברת הנתונים של מכונה וירטואלית עם 32 יחידות vCPU. מידע נוסף מופיע במאמר ביצועים של אחסון בלוקים.

  1. יצירת מכונה וירטואלית והפעלה שלה

  2. מוסיפים דיסק אחסון מתמיד (persistent disk) למכונת ה-VM שרוצים להריץ עליה בדיקת ביצועים.

  3. מתחברים למכונה.

  4. יחסי תלות של התקנות:

    sudo apt-get update
    sudo apt-get install -y fio
    
  5. ממלאים את הדיסק בנתונים שונים מאפס. קריאות של דיסקי אחסון מתמידים (persistent disk) מבלוקים ריקים מתאפיינות בפרופיל זמן אחזור שונה מזה של בלוקים שמכילים נתונים. מומלץ למלא את הדיסק לפני שמריצים בדיקות השוואה של זמן האחזור של קריאה.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=fill_disk \
      --filename=/dev/sdb --filesize=2500G \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=128K --iodepth=64 --rw=randwrite \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64
    
  6. כדי לבדוק את רוחב הפס של הכתיבה, מבצעים כתיבות רציפות עם כמה זרמים מקבילים (16 ומעלה), משתמשים ב-1MB כגודל הקלט/פלט ובעומק קלט/פלט שגדול מ-64 או שווה לו.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64 --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --rw=write --numjobs=16 --offset_increment=100G
    
  7. בדיקת פעולות קלט/פלט בשנייה (IOPS) של כתיבה. כדי להשיג את מספר ה-IOPS המקסימלי של PD, צריך לשמור על תור עמוק של פעולות קלט/פלט. לדוגמה, אם זמן האחזור של פעולת הכתיבה הוא אלפית שנייה אחת, המכונה הווירטואלית יכולה להשיג לכל היותר 1,000 פעולות קלט/פלט בשנייה לכל פעולת קלט/פלט בתהליך. כדי להשיג 15,000 פעולות קלט/פלט של כתיבה בשנייה, המכונה הווירטואלית צריכה לשמור על לפחות 15 פעולות קלט/פלט בהמתנה. אם הדיסק והמכונה הווירטואלית יכולים להשיג 30,000 פעולות קלט/פלט של כתיבה, מספר פעולות הקלט/פלט הפעילות צריך להיות לפחות 30. אם גודל הקלט/פלט גדול מ-4 KB, יכול להיות שהמכונה הווירטואלית תגיע למגבלת רוחב הפס לפני שהיא תגיע למגבלת ה-IOPS.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256
    
  8. בדיקת זמן האחזור של פעולת הכתיבה. במהלך בדיקת זמן האחזור של קלט/פלט, המכונה הווירטואלית לא יכולה להגיע לרוחב הפס המקסימלי או ל-IOPS המקסימליים. אחרת, זמן האחזור שנצפה לא ישקף את זמן האחזור בפועל של קלט/פלט בדיסק אחסון מתמיד (persistent disk). לדוגמה, אם הגעתם למגבלת ה-IOPS בעומק קלט/פלט של 30, והפקודה fio היא כפולה, אז סך ה-IOPS נשאר זהה והחביון של הקלט/פלט שדווח הוא כפול.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randwrite --iodepth_batch_submit=4 \
      --iodepth_batch_complete_max=4
    
  9. כדי לבדוק את רוחב הפס של הקריאה, מבצעים קריאות רציפות עם כמה זרמים מקבילים (16 ומעלה), משתמשים ב-1MB כגודל הקלט/פלט ובעומק קלט/פלט ששווה ל-64 או יותר.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64 --rw=read --numjobs=16 --offset_increment=100G \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64
    
  10. בדיקת קריאה של IOPS. כדי להשיג את מספר ה-IOPS המקסימלי של PD, צריך לשמור על תור עמוק של פעולות קלט/פלט. לדוגמה, אם גודל הקלט/פלט גדול מ-4 KB, יכול להיות שהמכונה הווירטואלית תגיע למגבלת רוחב הפס לפני שהיא תגיע למגבלת פעולות הקלט/פלט בשנייה. כדי להגיע ל-IOPS מקסימלי של 100k לקריאה, צריך לציין --iodepth=256 לבדיקה הזו.

    sudo fio --name=read_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256
    
  11. בדיקת זמן האחזור של הקריאה. חשוב למלא את הדיסק בנתונים כדי לקבל מדידה מציאותית של זמן האחזור. חשוב שה-VM לא יגיע למגבלות של IOPS או של תפוקה במהלך הבדיקה הזו, כי אחרי שהדיסק אחסון מתמיד (persistent disk) יגיע למגבלת הקיבולת שלו, הוא ידחה קלט/פלט נכנס, וזה יבוא לידי ביטוי כעלייה מלאכותית בחביון של הקלט/פלט.

    sudo fio --name=read_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randread \
      --iodepth_batch_submit=4 --iodepth_batch_complete_max=4
    
  12. בדיקת רוחב הפס של קריאה רציפה.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  13. בדיקת רוחב הפס של כתיבה רציפה.

    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  14. מנקים את הדיסק של אחסון מתמיד (persistent disk) ואת מכונת ה-VM הזמניים:

    1. מוחקים את הדיסק שבו השתמשתם כדי להשוות את הביצועים.
    2. מחיקת המכונה הווירטואלית שנוצרה לצורך השוואת ביצועים.

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