אימות הביצועים

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

מדידת ביצועים של נפח אחסון באמצעות Fio

משתמשים בכלי ליצירת קלט/פלט, Fio, כדי למדוד את ביצועי הבסיס.

שימוש ב-Fio

הכלי Fio מחיל עומס עבודה שאפשר לציין דרך ממשק שורת פקודה או קובץ תצורה. במהלך ההרצה, Fio מציג אינדיקטור התקדמות עם נתונים של קצב העברת הנתונים הנוכחי ונתוני קלט ופלט לשנייה (IOPS). אחרי שהשיחה מסתיימת, מוצג סיכום מפורט.

דוגמה לתוצאות של Fio

בדוגמאות הבאות מוצגת משימת כתיבה אקראית של 4k עם שרשור יחיד שפועלת במשך 60 שניות. זו דרך שימושית למדידת זמן האחזור הבסיסי. בפקודות הבאות, הפרמטר --directory מצביע על תיקייה עם שיתוף של NetApp Volumes שמוגדר כ-mounted:

  $ FIO_COMMON_ARGS=--size=10g --fallocate=none --direct=1 --runtime=60 --time_based --ramp_time=5
  $ fio $FIO_COMMON_ARGS --directory=/netapp --ioengine=libaio --rw=randwrite --bs=4k --iodepth=1 --name=nv
  cvs: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
  fio-3.28
  Starting 1 process
  cvs: Laying out IO file (1 file / 10240MiB)
  Jobs: 1 (f=1): [w(1)][100.0%][w=7856KiB/s][w=1964 IOPS][eta 00m:00s]
  cvs: (groupid=0, jobs=1): err= 0: pid=1891: Wed Dec 21 14:56:37 2022
    write: IOPS=1999, BW=7999KiB/s (8191kB/s)(469MiB/60001msec); 0 zone resets
      slat (usec): min=4, max=417, avg=12.06, stdev= 5.71
      clat (usec): min=366, max=27978, avg=483.59, stdev=91.34
      lat (usec): min=382, max=28001, avg=495.96, stdev=91.89
      clat percentiles (usec):
      |  1.00th=[  408],  5.00th=[  429], 10.00th=[  437], 20.00th=[  449],
      | 30.00th=[  461], 40.00th=[  469], 50.00th=[  482], 60.00th=[  490],
      | 70.00th=[  498], 80.00th=[  515], 90.00th=[  529], 95.00th=[  553],
      | 99.00th=[  611], 99.50th=[  652], 99.90th=[  807], 99.95th=[  873],
      | 99.99th=[ 1020]
    bw (  KiB/s): min= 7408, max= 8336, per=100.00%, avg=8002.05, stdev=140.09, samples=120
    iops        : min= 1852, max= 2084, avg=2000.45, stdev=35.06, samples=120
    lat (usec)   : 500=70.67%, 750=29.17%, 1000=0.15%
    lat (msec)   : 2=0.01%, 4=0.01%, 50=0.01%
    cpu          : usr=2.04%, sys=3.25%, ctx=120561, majf=0, minf=58
    IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
      submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
      complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
      issued rwts: total=0,119984,0,0 short=0,0,0,0 dropped=0,0,0,0
      latency   : target=0, window=0, percentile=100.00%, depth=1

  Run status group 0 (all jobs):
    WRITE: bw=7999KiB/s (8191kB/s), 7999KiB/s-7999KiB/s (8191kB/s-8191kB/s), io=469MiB (491MB), run=60001-60001msec

בשורות הבאות מפורטות תוצאות הביצועים:

  • זמן האחזור: lat (usec): min=382, max=28001, avg=495.96, stdev=91.89

    זמן האחזור הממוצע הוא 495.96 מיקרו-שניות (‎µsec), בערך 0.5 אלפיות השנייה, שזה זמן אחזור אידיאלי.

  • IOPS: min= 1852, max= 2084, avg=2000.45, stdev=35.06, samples=120

    בדוגמה שלמעלה מוצג ממוצע של 2,000 פעולות קלט/פלט בשנייה. זהו הערך הצפוי למשימה עם שרשור יחיד וזמן אחזור של 0.5 אלפיות השנייה (IOPS = 1000 ms/0.5 ms = 2000).

  • קצב העברת נתונים: bw ( KiB/s): min= 7408, max=8336, per=100.00%, avg=8002.05, stdev=140.09

    התפוקה הממוצעת היא ‎8,002 KiBps, שזהו התוצאה הצפויה ל-2,000 IOPS עם גודל בלוק של ‎4 KiB ‏ (2000 1/s * 4 KiB = 8,000 KiB/s).

מדידת זמן האחזור

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

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

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

Linux

fio --directory=/netapp \
 --ioengine=libaio \
 --rw=randwrite \
 --bs=4k --iodepth=1 \
 --size=10g \
 --fallocate=none \
 --direct=1 \
 --runtime=60 \
 --time_based \
 --ramp_time=5 \
 --name=latency

Windows

fio --directory=Z\:\
--ioengine=windowsaio
--thread
--rw=randwrite
--bs=4k
--iodepth=1
--size=10g
--fallocate=none
--direct=1
--runtime=60
--time_based
--ramp_time=5
--name=latency

מחליפים את הפרמטרים rw (read/write/randread/randwrite) ואת bs (גודל הבלוק) בהתאם לעומס העבודה. גדלים גדולים יותר של בלוקים מובילים לזמן אחזור גבוה יותר, שבו הקריאות מהירות יותר מהכתיבות. התוצאות יופיעו בשורה lat.

מדידת IOPS

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

Linux

fio --directory=/netapp \
--ioengine=libaio \
--rw=randread \
--bs=4k \
--iodepth=32 \
--size=10g \
--fallocate=none \
--direct=1 \
--runtime=60 \
--time_based \
--ramp_time=5 \
--name=iops

Windows

fio --directory=Z\:\
--ioengine=windowsaio
--thread
--rw=randread
--bs=4k
--iodepth=32
--size=10g
--fallocate=none
--direct=1
--runtime=60
--time_based
--ramp_time=5
--numjobs=16
--name=iops

מחליפים את הפרמטרים rw (read/write/randread/randwrite),‏ bs (blocksize) ו-iodepth (concurrency) בהתאם לעומס העבודה. התוצאות יופיעו בשורה iops.

מדידת התפוקה

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

Linux

fio --directory=/netapp \
--ioengine=libaio \
--rw=read \
--bs=64k \
--iodepth=32 \
--size=10g \
--fallocate=none \
--direct=1 \
--runtime=60 \
--time_based \
--ramp_time=5 \
--numjobs=16 \
--name=throughput

Windows

fio --directory=Z\:\
--ioengine=windowsaio
--thread
--rw=read
--bs=64k
--iodepth=32
--size=10g
--fallocate=none
--direct=1
--runtime=60
--time_based
--ramp_time=5
--numjobs=16
--name=throughput

מחליפים את הפרמטרים rw (read/write/randread/randwrite),‏ bs (blocksize) ו-iodepth (concurrency) בהתאם לעומס העבודה. אפשר להשיג תפוקה גבוהה רק באמצעות גדלי בלוקים של 64k ומעלה, וריבוי משימות בו-זמנית.

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

בודקים את נקודות ההשוואה של הביצועים.