איך לבצע Benchmark לשרת VPS בצורה מקצועית
למדו לבצע Benchmark לשרת VPS באמצעות yabs.sh, fio, sysbench ו-iperf3. הסבר על פענוח התוצאות, מדוע הרצה בודדת אינה מספקת ואיך להבין את מגבלות החומרה המשותפת בשרת.
מה המשמעות של ביצוע Benchmark לשרת VPS
ביצוע Benchmark לשרת VPS מודד ארבעה פרמטרים: מהירות הליבה הבודדת של ה-CPU, רוחב הפס של הזיכרון, כמות פעולות הדיסק האקראיות הקטנות שהאחסון מסוגל לבצע בשנייה, וקצב העברת הנתונים של חיבור הרשת. הרצה אחת של yabs.sh תספק לכם תוצאות עבור ה-CPU, הדיסק והרשת בתוך כעשר דקות; השתמשו בבדיקת הזיכרון הנפרדת המופיעה בהמשך עבור רוחב פס של הזיכרון. החלק המורכב יותר הוא ניתוח התוצאות, כיוון ששרת VPS (שרת וירטואלי פרטי) חולק חומרה פיזית עם דיירים אחרים, ולכן אותו שרת יכול להציג נתון אחד בשעה 03:00 ונתון שונה מאוד בשעה 20:00.
התוכנית כאן היא להריץ את yabs.sh לקבלת תמונה מהירה, ולאחר מכן להריץ את הכלים שמתחתיו באופן ידני. הרצה עצמית של הכלים מאפשרת לכם לשנות flag מסוים, לצפות בשינוי בתוצאה, ולהבין מה הנתון הזה באמת מדד. בצעו זאת לאחר שהשרת הוגדר, ולא לפני כן. הצעדים ב-עשר הדקות הראשונות בשרת VPS חדש קודמים לכל, כיוון ששרת שעדיין מבצע את סבב העדכונים הראשון שלו יציג תוצאות Benchmark גרועות מסיבות שאינן קשורות לחומרה.
בחן את המכונה לפני שתמדוד אותה
מחצית מכל מדד ביצועים שגוי נובעת ממכונה שהכותב לא הבין.
nproc
lscpu | grep -E 'Model name|Hypervisor|Thread'
free -h
df -hT /
uname -r
systemd-detect-virtHypervisor vendor: KVM משמעותו וירטואליזציה מלאה, כך שאתה מריץ קרנל משלך. הדפסת lxc או openvz באמצעות systemd-detect-virt משמעותה וירטואליזציה מבוססת מכולות: אתה חולק את הקרנל של המארח, ומגבלות ה-CPU והזיכרון שלך הן הגדרות cgroup (קבוצת בקרה) ולא חומרה וירטואלית. במערכת cgroup v2 ניתן לקרוא את מגבלת ה-CPU מתוך ה-cgroup של המכולה; הנתיב הבא תקף כאשר ה-cgroup מעוגן ב-/sys/fs/cgroup.
cat /sys/fs/cgroup/cpu.maxmax 100000 משמעותו של-cgroup זה אין מכסה משלו; cgroups אבות עדיין יכולים להטיל אחת כזו. 200000 100000 משמעותו שניתן להשתמש ב-200000 מיקרו-שניות של CPU בכל תקופה של 100000 מיקרו-שניות, שהן מכסה השווה לשתי ליבות. תוכנית המשווקת כ-4 vCPU עם מכסה של שתי ליבות לעולם לא תשיג תוצאות של ארבע ליבות. כלי מדידת ביצועים יכולים לזהות את ההגבלה הזו: VoxelBench מדווח על מכסות CPU ומסמן CPU משותף או מוגבל כאשר המארח חושף הרבה יותר מעבדים ממה שהשרת רשאי לנצל.
df -hT / חשוב מסיבה אחרת: עמודת Type. אם מופיע בה overlay, אתה נמצא בתוך מכולה, ותוצאות הדיסק שלך יתארו את האחסון שנמצא מתחת ל-overlay הזה. רשום זאת כעת.
ניטור רציף של steal time
הערך steal time מייצג את משך הזמן שבו ה-vCPU שלכם המתין שלא מרצונו, בזמן שה-hypervisor לא הקצה לו משאבי עיבוד. זהו מדד שימושי לזיהוי חוסר בזמינות של זמן מעבד, אך הוא אינו מבחין בין עומס אצל שכנים בשרת לבין אכיפת מכסות מעבד על ידי ספק הענן.
vmstat 1 10עקבו אחר העמודה st בצד ימין. ערך steal time מתמשך מעיד על כך שזמן מעבד לא היה זמין למערכת האורחת, אך ערך הגבוה מ-5% אינו מוכיח בהכרח שהשרת המארח סובל מ-oversubscription. ספקי ענן עשויים להציג אכיפת מכסות מעבד כ-steal time באופן מכוון. העמודה top מציגה את אותו נתון המופיע ב-%st בשורת ה-CPU. הריצו את vmstat 1 בחלון SSH נפרד בזמן ביצוע ה-benchmark, ותעדו את ערך ה-steal לצד כל תוצאה.
התחלה עם yabs.sh
yabs.sh (Yet Another Bench Script) הוא סקריפט shell המריץ את fio, iperf3 ו-Geekbench ומפיק סיכום אחד. הוא משתמש ב-fio וב-iperf3 אם הם כבר מותקנים, ומוריד קבצים בינאריים סטטיים אם אינם קיימים. זהו הסטנדרט המקובל לדיוני ביצועי VPS, ולכן פלט של yabs הוא הדרך המהירה ביותר להשוות נתונים עם אחרים.
הפקודה בשורה אחת של הפרויקט היא זו:
curl -sL yabs.sh | bashפקודה זו מעבירה את כל מה שה-URL מגיש ישירות ל-shell. הורידו את הקובץ, קראו אותו, ורק אז הריצו אותו.
curl -sLo yabs.sh https://raw.githubusercontent.com/masonr/yet-another-bench-script/master/yabs.sh
less yabs.sh
bash yabs.shדגלים (flags) מתווספים אחרי -s -- בעת שימוש ב-pipe, או ישירות אחרי שם הקובץ בעת הרצה של עותק מקומי. הדגלים השימושיים הם: -f מדלג על בדיקת הדיסק, -i מדלג על בדיקת הרשת, -g מדלג על Geekbench, -r מצמצם את מיקומי ה-iperf3 לשלושה בלבד, -j מדפיס את התוצאות בפורמט JSON, ו--w results.json כותב את ה-JSON לקובץ.
bash yabs.sh -r -w yabs-run1.jsonשני דברים שכדאי לדעת לפני ההרצה הראשונה. Geekbench מעלה את התוצאה שלכם ומפיקה URL ציבורי ב-browser.geekbench.com, כך שכל מי שמחזיק בקישור יכול לראות את דגם המעבד והניקוד שלכם. -g מדלג על בדיקה זו לחלוטין. שנית, שלב ה-iperf3 מעביר תעבורה ממשית לשרתים באזורים שונים, וזה נספר כחלק ממכסת רוחב הפס החודשית שלכם. בחיבור של 1 Gbit/s, שלב רשת מלא יכול להעביר עשרות גיגה-בייטים, לכן השתמשו ב--r אם המכסה שלכם קטנה, וב--i אם החיבור שלכם מוגבל בנפח.
משמעות החלקים השונים בפלט של yabs
מקטע הדיסק מריץ את fio עם תמהיל קריאה וכתיבה של 50/50 בארבעה גדלי בלוקים: 4k, 64k, 512k ו-1m. הוא מדווח על IOPS (פעולות קלט/פלט לשנייה) ועל רוחב פס עבור כל אחד מהם. השורה של 4k היא השורה שחשוב להתמקד בה עבור מסד נתונים, שרת דואר, או כל יישום שמבצע כתיבות קטנות רבות, כיוון שרוב ה-IO בשרת הוא קטן ומבוזר. השורה של 1m מיועדת לגיבויים ולווידאו, שם מתבצעת העברה של רצפי בתים ארוכים.
מקטע הרשת מריץ iperf3 מול שרתים ציבוריים בכמה אזורים, בשני הכיוונים, תוך שימוש בזרמים מקבילים. התייחסו למספר נמוך כאן כאל סימן לשאלה ולא כתשובה סופית, כיוון ששרתי iperf3 ציבוריים הם משותפים ולעיתים קרובות עמוסים, כך שתוצאה גרועה עשויה לנבוע מהצד המרוחק.
מקטע ה-Geekbench מספק ציון לליבה בודדת וציון לריבוי ליבות. ציון ליבה בודדת חוזה כמה מהר תסתיים בקשה אחת, הידור (compile) אחד או שאילתה אחת. ציון ריבוי ליבות מעיד בעיקר על כמות הליבות האמיתית שעומדת לרשותכם.
דיסק: הרצת fio באופן עצמאי
fio (flexible IO tester) הוא הכלי שעומד מאחורי סעיף הדיסק ב-yabs, והפעלתו ישירות היא השלב שבו לדגלים (flags) מתחילה להיות משמעות.
sudo apt update && sudo apt install -y fio sysbench iperf3בדיקת קריאה אקראית של 4k בעומק תור (queue depth) של 32, על מערכת הקבצים שבאמת מעניינת אותך:
fio --name=randread4k --filename=./fio-testfile --size=2G --bs=4k \
--rw=randread --ioengine=libaio --iodepth=32 --direct=1 \
--runtime=60 --time_based --group_reportingשורת הסיכום שיש לקרוא מתוך הפלט נראית כך.
read: IOPS=184k, BW=719MiB/s (754MB/s)(42.1GiB/60001msec)מתחתיה, fio מדפיס בלוק clat percentiles. האחוזון ה-99.00 הוא הנתון שכדאי לצטט, כיוון שהוא מייצג את זמן ההמתנה של הבקשה האיטית ביותר מתוך מאה. השהיה ממוצעת (average latency) מסתירה בדיוק את העיכובים שהמשתמש מרגיש.
--direct=1פותח את הקובץ עםO_DIRECT, כך שהקריאות עוקפות את ה-page cache של ה-kernel. בלעדיו, מעבר שני על קובץ בגודל 2G במכונה עם 8G של RAM יוגש מהזיכרון, ו-fio ידווח על מיליוני IOPS. המספר הזה אמיתי, אך הוא מייצג ביצועי זיכרון.--ioengine=libaioמגיש בקשות אסינכרוניות, מה שמאפשר ל---iodepth=32להחזיק 32 מהן בתהליך (in flight). עם מנוע סינכרוני כמוpsync, ערך iodepth הגדול מ-1 לא עושה דבר, ולכן תמדוד בקשה אחת בכל פעם.--time_based --runtime=60רץ למשך 60 שניות קבועות במקום כמות עבודה קבועה, כך שדיסק מהיר ודיסק איטי מקבלים את אותו זמן שעון וההשוואה נשארת הוגנת.--size=2Gקובע את גודל קובץ הבדיקה. שמור עליו גדול מכל cache בנתיב, וודא תחילה שיש לך מספיק שטח פנוי.
כתיבה אקראית מתבצעת עם אותה פקודה בתוספת --rw=randwrite. הרץ אותה בנפרד, ולאחר מכן מחק את הקובץ.
fio --name=randwrite4k --filename=./fio-testfile --size=2G --bs=4k \
--rw=randwrite --ioengine=libaio --iodepth=32 --direct=1 \
--runtime=60 --time_based --group_reporting
rm -f ./fio-testfileעבור תמהיל הקרוב יותר לתעבורה אמיתית, השתמש ב---rw=randrw --rwmixread=70. סוג האחסון שעליו אתה נמצא משנה את התוצאות הללו יותר מכל דגל, וההבדלים הללו מפורטים ב-ההבדל בין אחסון NVMe ל-SATA SSD ב-VPS.
כאשר fio נעצר עם השגיאה Unknown error -1
אפשרות ה-Direct IO אינה זמינה בכל מערכת קבצים. כאשר fio נכשל בבקשה הראשונה שלו עם הדגל --direct=1, יש לבדוק תחילה את תקינות ה-Direct IO. הכשל עשוי להיראות כך:
fio: io_u error on file ./fio-testfile: Unknown error -1: read offset=0, buflen=4096
fio: pid=1234, err=-1/file:ioengines.c:321, func=get_events, error=Unknown error -1הריצו תחילה את df -hT .. שימוש ב-Type מסוג overlay, שהיא מערכת הקבצים ש-Docker מספק למכולה כברירת מחדל, אינו הגורם לכשל כשלעצמו. ה-overlayfs מעביר את O_DIRECT למערכת הקבצים שמתחתיו ומסרב לבצע את הפעולה רק כאשר מערכת הקבצים התחתונה אינה תומכת ב-Direct IO; לכן, --direct=1 --ioengine=libaio עובד על overlay שיושב על גבי ext4 או xfs. כאשר מערכת הקבצים שמתחת לקובץ הבדיקה אכן אינה מסוגלת לבצע Direct IO, fio בדרך כלל מציין זאת בעת פתיחת הקובץ: fio: looks like your file system does not support direct=1/buffered=0. במקרה כזה, כוונו את --filename לנתיב על גבי אחסון מקומי אמיתי, כגון volume מסוג bind mount, או הריצו את fio על ה-host במקום בתוך המכולה. אם אין גישה לאחסון אמיתי, הרצה מסונכרנת עם buffer לפחות תוכיח שהפקודה עצמה תקינה.
fio --name=randread4k-buffered --filename=./fio-testfile --size=256M --bs=4k \
--rw=randread --ioengine=psync --direct=0 --numjobs=1 \
--runtime=15 --time_based --group_reporting
rm -f ./fio-testfileהיו כנים לגבי מהות ההרצה הזו. לאחר המעבר הראשון, הקובץ בגודל 256M נמצא ב-page cache, כך שנתון ה-IOPS משקף את ביצועי ה-RAM שלכם. השתמשו בזה כדי לוודא ש-fio מותקן ושהדגלים מפורשים כראוי. לעולם אל תציגו זאת כתוצאת ביצועי דיסק.
מדוע dd אינו כלי למדידת ביצועי דיסק
dd מופיע בשרשורים רבים בנושא VPS, והוא עונה על שאלה צרה אחת בלבד.
dd if=/dev/zero of=./ddtest bs=1M count=1024 oflag=direct conv=fdatasync
rm -f ./ddtestפקודה זו מודדת קצב כתיבה סדרתי (sequential write) עם thread אחד ובקשה אחת בתהליך. מדובר בבדיקת תקינות בסיסית סבירה. היא אינה אומרת דבר על IO אקראי, ואינה מעידה על מה שקורה כאשר 32 בקשות מגיעות בו-זמנית. השמיטו את oflag=direct והכתיבה תעבור דרך ה-page cache, אך conv=fdatasync עדיין יכריח את נתוני הפלט להיכתב לאחסון לפני סיום הפקודה. השמיטו גם אותו, והתוצאה עשויה למדוד בעיקר את המהירות שבה ה-kernel מקבל כתיבות לזיכרון; זו הסיבה לכך שנתוני dd המצוטטים בפורומים הם לעיתים קרובות מופרכים.
CPU: sysbench cpu
sysbench cpu --cpu-max-prime=20000 --threads=1 run
sysbench cpu --cpu-max-prime=20000 --threads=$(nproc) runהנתון שיש לשמור הוא events per second. הריצו תחילה בשרשור יחיד (single threaded). זהו המספר הקובע באיזו מהירות מסתיימת בקשת PHP אחת או עבודת הידור (compile) אחת, והוא משתנה במידה הרבה ביותר בין מארחים באותו מחיר. לאחר מכן, הריצו עם כל השרשורים, מה שמראה כיצד התפוקה (throughput) משתנה בהתאם ל־vCPUs שהוקצו לכם.
היו ברורים לגבי מה שזה מודד: sysbench cpu מוצא מספרים ראשוניים שוב ושוב באמצעות חילוק ניסיוני. עבור כל מועמד, הוא מחשב שורש ריבועי בדיוק כפול (double precision), ולאחר מכן בודק מחלקים עם modulo של מספרים שלמים ב־64 ביט, תוך השוואת כל מחלק מול גבול הנקודה הצפה הזה. לכן, הבדיקה משלבת עבודה של מספרים שלמים ומספרים בנקודה צפה. היא אינה מאמצת את רוחב הפס של הזיכרון, את יחידות הווקטור או את ה־cache בשום צורה הדומה לעומס עבודה אמיתי, ולכן היא טובה לדירוג שני מארחים אך גרועה לניבוי אופן הפעולה של היישום שלכם.
Ubuntu 24.04 מפיצה את sysbench 1.0.20, שבו שם הבדיקה מופיע ראשון. העתקת פקודה עם --test=cpu מפוסט ישן תניב WARNING: the --test option is deprecated. ציונים מ־sysbench 0.4 ומ־sysbench 1.0 אינם ניתנים להשוואה כלל, לכן לעולם אל תשוו את עצמכם למספר שפורסם מבלי לציין את גרסת התוכנה.
זיכרון: sysbench memory
sysbench memory --memory-block-size=1M --memory-total-size=20G --memory-oper=write --threads=1 run
sysbench memory --memory-block-size=1M --memory-total-size=20G --memory-oper=read --threads=1 runהתוצאה מוצגת ב-MiB/sec. שמרו על --memory-block-size בערך של 1M, והקפידו על ערך זהה בכל המארחים שאתם משווים. ב-1K המספר קורס, כיוון שאתם משלמים את ה-overhead של כל פעולה פי 1000 יותר, כך שבסופו של דבר אתם מודדים את עלות הלולאה ולא את רוחב הפס של הזיכרון. זהו ה-flag שבו טועים הכי הרבה בהשוואות ביצועי זיכרון מפורסמות.
רשת: iperf3
הדרך האמינה לבדיקת תפוקה (throughput) היא מול מכונה שנייה שבשליטתכם, שכן כך תדעו מה קורה בשני הקצוות.
בצד המרוחק:
iperf3 -sפקודה זו מאזינה בפורט TCP 5201. פתחו את הפורט רק עבור הכתובת ממנה אתם מבצעים את הבדיקה, וסגרו אותו בסיום. המדריך כללי firewall בסיסיים ב-ufw ב-VPS מפרט את התחביר הנדרש.
מה-VPS הנבדק:
iperf3 -c 203.0.113.10 -t 30
iperf3 -c 203.0.113.10 -t 30 -R
iperf3 -c 203.0.113.10 -t 30 -P 8הפקודה הראשונה מודדת העלאה (upload) מהמכונה הנבדקת. הדגל -R הופך את כיוון הבדיקה, ובכך מודד הורדה (download). הדגל -P 8 פותח שמונה זרמים (streams) במקביל.
הריצו גם את הבדיקה בזרם בודד וגם את הגרסה המקבילית, שכן הן עונות על שאלות שונות. חיבור TCP בודד יכול להחזיק כמות נתונים לא מאושרים (unacknowledged data) בהתאם לגודל ה-window שלו, לכן התקרה שלו היא בערך גודל ה-window חלקי זמן הלוך-חזור (RTT). בשיהוי של 80 ms עם window של 4 MB, התקרה היא כ-400 Mbit/s, ללא קשר למהירות הפיזית של החיבור. נתון הזרם הבודד מציג את המהירות שתתקבל בהורדה אחת. הנתון המקבילי מציג את הקיבולת הכוללת של החיבור.
עקבו אחר מכסת רוחב הפס שלכם במהלך הבדיקות. 30 שניות במהירות 1 Gbit/s מעבירות כ-3.75 GB, ואתם צפויים להריץ את הבדיקה מספר פעמים בכל כיוון.
נתוני ייחוס, וכיצד לקרוא את הנתונים שלכם
הנתונים שמאחורי התרשים
[
{
"device": "Local NVMe",
"iops_4k_read": "180,000"
},
{
"device": "Local SATA SSD",
"iops_4k_read": "90,000"
},
{
"device": "Network block",
"iops_4k_read": "12,000"
},
{
"device": "Spinning disk",
"iops_4k_read": "180"
}
]נפח אחסון NVMe מקומי בתוצאות שפורסמו מגיע בדרך כלל לאזור ה-180,000 IOPS בקריאה אקראית של 4k. כונן SATA SSD מקומי מגיע לסביבות ה-90,000. אחסון בלוקים מרושת (Network attached block storage), שבו כל בקשה חוצה רשת לפני שהיא מגיעה לדיסק, נמצא קרוב יותר ל-12,000, ודיסק מגנטי מסתובב מנהל בערך 180, כיוון שהוא מזיז ראש פיזי עבור כל בקשה אקראית.
אלו הם נתונים טיפוסיים שפורסמו עבור כל סוג אחסון, ולא מדידות ממארח יחיד. השתמשו בהם למטרה אחת בלבד: לוודא שהתוצאה שלכם נמצאת בסדר הגודל הנכון. אם תוכנית שנמכרת כ-NVMe מציגה בבדיקות ביצועים אלפים בודדים של 4k IOPS, ראשית ודאו ש---direct=1 היה פעיל. אם הוא היה פעיל, בדקו את מגבלות ה-IOPS ונקודות ה-burst של התוכנית, וכן את רמת העומס על האחסון ואת החומרה המוצהרת.
מדוע הרצה בודדת אינה נחשבת ל-benchmark
תוצאה בודדת היא תמונת מצב של דקה אחת על מכונה משותפת. התייחסו אליה כאל דגימה אחת בלבד.
- בצעו כל בדיקה לפחות חמש פעמים, בפריסה על פני שעות שונות ולפחות יומיים שונים. שמרו את החציון ואת טווח התוצאות. תוצאה שמפורסמת ללא טווח היא נתון שיווקי.
- תעדו את ה-steal time לצד כל הרצה. שמרו הרצות שבהן ה-
stהיה גבוה ובדקו האם הן משקפות עומס (contention) או את מכסת ה-CPU של התוכנית; פסילת הרצות אלו עלולה להסתיר את הביצועים שאתם מקבלים בפועל. - בצעו את בדיקת הדיסק בשני משכי זמן. תוכניות רבות מעניקות מכסת IOPS לפרצי פעילות (burst) שמתמלאת עם הזמן, אך הרצת fio של 60 שניות או
--runtime=600אינן מבטיחות שמדדתם את רצפת הביצועים. ה-credits של AWS gp2 יכולים לתמוך ב-3,000 IOPS למשך 30 דקות לפחות מיתרה מלאה, כך ששתי ההרצות עלולות למדוד ביצועי burst בלבד. בדקו את מודל ה-credits של הספק ונטרו את יתרת ה-credits לפני שאתם מגדירים תוצאה כביצועים מתמשכים (sustained performance). - ודאו ששום דבר אחר אינו רץ.
unattended-upgradesשמתחיל טרנזקציית apt באמצע בדיקת CPU עולה לכם בנקודות ממשיות, ו-ps -e -o comm= | grep -E 'apt|dpkg'לפני כל הרצה גוזל זמן. - שנו משתנה אחד בכל פעם. גרסאות שונות של כלים, גדלי בלוקים או מספר threads מפיקים מספרים שלא ניתן להשוות ביניהם, ללא קשר למידת הדמיון ביניהם.
כאשר אתם משווים בין שני ספקים, בצעו את הבדיקות באותה שעה ובאותו יום. אחרת, מדדתם את השפעת השעה ביום ולא את ביצועי השרת.
בצעו Benchmark לעומס העבודה שלכם בסוף
כלים סינתטיים מדרגים מכונות. רק עומס העבודה האישי שלכם יקבע אם מכונה מסוימת מספיקה לצרכיכם. מדדו את הפעולה שאתם מבצעים בפועל.
time tar -czf /tmp/bench.tgz /usr/share
rm -f /tmp/bench.tgzפעולה זו דוחסת כמה מאות מגה-בייטים, ולכן היא מפעילה את ה-CPU ואת הדיסק בו-זמנית ומשתנה כאשר אחד מהם משתנה. האזהרה Removing leading / from member names היא תקינה. עדיף מכך, מדדו את ה-build שלכם, את השאילתה האיטית ביותר שלכם, או את רינדור הדף שלכם. build שלוקח 4 דקות על שרת אחד ו-7 דקות על אחר מכריע את הסוגיה, ללא קשר למה ש-Geekbench הציג. זוהי גם המדידה שתבהיר לכם מתי תוספת כוח מחשוב מפסיקה להיות משתלמת, דבר שכדאי לדעת לפני שבודקים כמה VPS באמת עולה בחודש או מעבירים את עומס העבודה ל-שרת ייעודי.
FAQ
מדוע אני מקבל תוצאות benchmark שונות בכל הרצה?
שרת VPS חולק משאבי CPU, אחסון ורשת פיזיים עם דיירים אחרים, לכן התוצאה תלויה בפעילות שלהם באותו רגע. הריצו את vmstat 1 במהלך הבדיקה ועקבו אחר העמודה st: הערך steal time מתעד זמן CPU שלא היה זמין עבורכם, אך הוא עשוי לשקף גם אכיפה של הקצאת ה-CPU שרכשתם וגם עומס על השרת המארח. ערך הגבוה מ-5% אינו מעיד בהכרח על הגורם לבעיה. הפתרון הוא מתודולוגי ולא כוונון. בצעו כל בדיקה חמש פעמים או יותר בשעות שונות, ודווחו על החציון יחד עם טווח התוצאות.
מדוע fio מדווח על מיליוני IOPS?
כמעט תמיד בגלל שחסר --direct=1. בלעדיו, fio קורא דרך ה-page cache של ה-kernel, כך שאחרי המעבר הראשון, קובץ בדיקה בגודל 2G מוגש מה-RAM ומדדתם למעשה את רוחב הפס של הזיכרון. הוסיפו את --direct=1 ושמרו על קובץ הבדיקה גדול מכל cache בנתיב. אם --direct=1 נכשל לאחר מכן, הריצו את df -hT . ובדקו היכן קובץ הבדיקה מאוחסן. סוג overlay אינו הבעיה כשלעצמו, כיוון ש-overlayfs מעביר את O_DIRECT לאחסון שמתחתיו. העבירו את קובץ הבדיקה לאחסון מקומי אמיתי רק אם מערכת הקבצים שמתחת מסרבת לבצע direct IO.
האם yabs.sh מספיק כשלעצמו?
למבט ראשוני, כן. הוא מריץ fio בארבעה גדולי בלוקים, iperf3 בשני הכיוונים ו-Geekbench, ומפיק סיכום אחד שאחרים יכולים לקרוא. הוא מפסיק להספיק כאשר רוצים להבין מדוע מספר מסוים הוא כפי שהוא, כיוון שלא ניתן לשנות את ה-flags שלו עבור כל בדיקה בנפרד. ברגע שתוצאת yabs נראית שגויה, שחזרו אותה ישירות עם fio או sysbench ושנו flag אחד בכל פעם.
איזה מספר בודד מנבא כיצד היישום שלי ירגיש?
מהירות ליבה בודדת של ה-CPU וזמן השהיה (latency) של קריאה אקראית ב-4k, לפי סדר זה, עבור רוב עומסי העבודה של אתרי אינטרנט ומסדי נתונים. נתוני תפוקה (throughput) נראים מרשימים אך לעיתים רחוקות קובעים משהו, כיוון שבקשה טיפוסית היא קטנה. ציינו את האחוזון ה-99 מתוך בלוק ה-clat percentiles של fio במקום את הממוצע, שכן הבקשה האיטית האחת מתוך מאה היא זו שהמשתמש מרגיש.
האם עלי להתקין משהו לפני ביצוע ה-benchmark?
הכלים fio, sysbench ו-iperf3 נמצאים במאגרים של Ubuntu ו-Debian: sudo apt install -y fio sysbench iperf3. הכלי yabs.sh רץ ב-Bash וזקוק ל-curl או wget עבור הורדות, בתוספת tar כדי לחלץ את Geekbench; ללא tar, הוא ידלג על Geekbench. הוא משתמש ב-fio וב-iperf3 כאשר הם מותקנים ומוריד קבצים בינאריים סטטיים כאשר הם חסרים. מחקו כל קובץ בדיקה בסיום, כיוון שקובץ fio בגודל 2G שנשאר על דיסק של 20G הופך להתראת "דיסק מלא" עבור מישהו אחר בעוד מספר שבועות.