במאמר הזה מוסבר איך להשוות לשוק את הביצועים של 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 רצה במשך חמש דקות.
יחסי תלות של התקנות:
sudo apt update sudo apt install -y fioבטרמינל, מציגים את רשימת הדיסקים שמצורפים ל-VM ומחפשים את הדיסק שרוצים לבדוק. אם דיסק האחסון המתמיד עדיין לא פורמט, צריך לפרמט את הדיסק ולהוסיף אותו.
sudo lsblkNAME 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.יוצרים ספרייה חדשה,
fiotest, בדיסק. בדוגמה הזו, הדיסק מותקן ב-/mnt/disks/mnt_dir:TEST_DIR=/mnt/disks/mnt_dir/fiotest sudo mkdir -p $TEST_DIRכדי לבדוק את קצב העברת הנתונים לכתיבה, מבצעים כתיבות רציפות עם כמה זרמים מקבילים (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כדי לבדוק את קצב הקלט/פלט (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כדי לבדוק את קצב העברת הנתונים בקריאה, מבצעים קריאות רציפות עם כמה זרמים מקבילים (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כדי לבדוק את קצב הקלט/פלט (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ניקוי:
sudo rm $TEST_DIR/write* $TEST_DIR/read*
השוואת ביצועים של דיסקים לאחסון מתמיד
אם רוצים למדוד את הביצועים של דיסקים אחסון מתמידים (persistent disk) בלבד מחוץ לסביבת הפיתוח, צריך לבדוק את ביצועי הקריאה והכתיבה של מכשיר בלוקים בדיסק אחסון מתמיד (persistent disk) ובמכונת VM זמניים. כל בדיקה של fio נמשכת חמש דקות.
הפקודות הבאות מניחות שדיסק מתמיד שמבוסס על SSD בנפח 2,500 GB מצורף למכונת ה-VM. אם גודל המכשיר שונה, צריך לשנות את הערך של הארגומנט --filesize. הגודל הזה של הדיסק נדרש כדי להגיע למגבלות של קצב העברת הנתונים של מכונה וירטואלית עם 32 יחידות vCPU. מידע נוסף מופיע במאמר ביצועים של אחסון בלוקים.
מוסיפים דיסק אחסון מתמיד (persistent disk) למכונת ה-VM שרוצים להריץ עליה בדיקת ביצועים.
יחסי תלות של התקנות:
sudo apt-get update sudo apt-get install -y fioממלאים את הדיסק בנתונים שונים מאפס. קריאות של דיסקי אחסון מתמידים (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כדי לבדוק את רוחב הפס של הכתיבה, מבצעים כתיבות רציפות עם כמה זרמים מקבילים (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בדיקת פעולות קלט/פלט בשנייה (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בדיקת זמן האחזור של פעולת הכתיבה. במהלך בדיקת זמן האחזור של קלט/פלט, המכונה הווירטואלית לא יכולה להגיע לרוחב הפס המקסימלי או ל-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כדי לבדוק את רוחב הפס של הקריאה, מבצעים קריאות רציפות עם כמה זרמים מקבילים (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בדיקת קריאה של 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בדיקת זמן האחזור של הקריאה. חשוב למלא את הדיסק בנתונים כדי לקבל מדידה מציאותית של זמן האחזור. חשוב שה-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בדיקת רוחב הפס של קריאה רציפה.
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בדיקת רוחב הפס של כתיבה רציפה.
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מנקים את הדיסק של אחסון מתמיד (persistent disk) ואת מכונת ה-VM הזמניים:
- מוחקים את הדיסק שבו השתמשתם כדי להשוות את הביצועים.
- מחיקת המכונה הווירטואלית שנוצרה לצורך השוואת ביצועים.
המאמרים הבאים
- כאן מוסבר איך בודקים את מדדי הביצועים של הדיסק כדי לעקוב אחרי הביצועים שלו.
- למחירון של Persistent Disk
- איך משפרים את הביצועים של Persistent Disk