ואוו איך הקרמה התפוצצה לי בפרצוף מהר הפעם.
זוכרים איך בפוסט הקודם דיברתי קצת על איך להתכונן PoC, על החשיבות של תיאום ציפיות, של הכנה מוקדמת ועל כמה חשוב לשמור על אוירה חיובית? אז יצא שבדיוק שבוע לאחר מכן טסתי שוב להריץ PoC בהודו, הפעם בדלהי, וכל מה שיכל היה להשתבש, אכן השתבש.
נתחיל מהעובדה שבנתב"ג, אחרי שעמדתי 55 דקות בתור לביטחון ועוד 50 דקות בתור לצ'ק-אין למרות שעשיתי צ'ק-אין באתר של טורקיש ולכאורה אני אמור להגיע לאקספרס צ'ק-אין, הודיעו לי שאני לא יכול לעלות לטיסה לאיסטנבול. המטוס שאמור להגיע מאיסטנבול לקחת אותנו מאחר, הוא עדיין לא המריא מאיסטנבול ואין סיכוי שנספיק לעלות על טיסת ההמשך שלנו לדלהי. אחרי המתנה ארוכה ומעצבנת, סתם בעמידה מול דלפקי הצ'ק-אין, העבירו אותי לטיסת לופטהנזה לפרנקפורט. הקונקשן בפרנקפורט עוד יותר קצר ושדה התעופה עוד יותר גדול אז אחרי ריצה – נסיעה ברכבת הפנימית – ריצה – שיחה מתנשפת עם נציגת air india הספקתי לארגן לעצמי מקום ביציאת חירום לטיסת ההמשך הארוכה ואז הגיעה נקודת האור הכמעט יחידה בנסיעה הזו, הספקתי לאכול שתי נקניקיות ולשתות בירה אחת לפני שעליתי לטיסת ההמשך. אני מקצין קצת כי לא באמת הספקתי לשתות את הבירה אבל הרשו לי לעלות איתה לטיסה וככה זכיתי להיות מהאחרונים שעולים על 787 עמוס ולקבל מבטים של כל הנוסעים "הנה השיכור שבגללו אנחנו מתעכבים" למרות שלא היה עיכוב בכלל ועליתי בזמן תפסיקו להסתכל עלי don’t you judge me! אגב 787 אכן מטוס נחמד מאד וכשמטים את המשענת אחורה המושב מחליק טיפה קדימה, די קול.
ככה יצא שהגעתי לדלהי בתשע וחצי בבוקר במקום בארבע וחצי בבוקר אבל זה בסדר כי לא היה לקוח לעבוד איתו. בניגוד לתיאום הציפיות ולתכנון המקורי, הלקוח לא הכין שום דבר לעבודה, רק בשעה שתים בצהרים התחלנו לעבוד שוב על הצבת הדרישות וגם למחרת לא היה שום דבר מוכן ולא יצאתי מהמלון כל היום כי כל שעתיים קבענו שעוד שעתיים ניסע לאתר ואז גילינו שלא השתנה כלום אז דחינו בעוד שעתיים וכתבתי למעלה שכל מה שיכל היה להשתבש אכן השתבש? אז גם המלון היה בשיפוצים ככה שלא היה איפה לבלות את הזמן המיותר הזה, לא בריכה ולא לאונג' ולא נעליים. בחדר.
למחרת, היום השלישי, סוף סוף קיבלנו מהלקוח את המינימום הנדרש לעבודה, ואני ממש מתכוון למינימום הנדרש, שרת לינוקס וירטואלי יחיד, על hyper-v. זהו, בלי גישה לניהול מערכת האחסון עצמה, בלי גישה למערכת המוניטור, בלי גישה לממשק הניהול של hyper-v, כלום, רק טרמינל לתוך שרת CentOS אחד וזהו. וזה בעצם נושא הפוסט היום כי למדתי להשתמש ב Vdbench ואני מרשה לעצמי לנחש שלא כל הקוראים מכירים.
אז נכון שאנחנו מעדיפים באופן מובהק לעבוד עם עומסי עבודה אמיתיים ולא מחוללי ביצועים סינטטיים אבל אנחנו לא שוכחים את החיים עצמם והלקוח הזה שהיה אמור להכין שרתי oracle DB הכין שרת וירטאולי אחד, ריק מאפליקציות, ואני כבר בהודו יומיים ועוד לא עשינו כלום, אז לפעמים אתה מתפשר ומתפשר עד שאתה מקבל בדיוק מה שאתה רוצה (נדמה לי שזה ציטוט של נבון למרות שגוגל מראה לי עכשיו שזה של אשכול).
Vdbench הוא כלי של אורקל שמיועד לבדיקות עומסים ותקינות של מערכות אחסון. מדובר בכלי פשוט מבוסס Java ולכן ירוץ כמעט על כל מערכת הפעלה שתתקלו בה כולל הפצות Windows, UX, AIX, לינוקס, Mac ואפילו RaspBerry Pi (למרות שקשה לי לראות מה המטרה להריץ עומסים מכלי כל כך קטן, אולי אם מריצים כמה במקביל).
אם הכלי הוא כלי Java אז צריך Java . אם קיבלתם שרת ריק, כמוני, ואם השרת שלכם הוא שרת ממשפחת הפדורה, כל מה שצריך לעשות זה להריץ yum install java. צריך הרשאות root לבצע את זה אז אם אתם ל root ואני מקווה שאתם לא עובדים עם root סתם אז תריצו sudo yum install java. השרת צריך גישה לאינטרנט כדי שהתהליך הזה יעבוד חלק, הוא יגש לrepository, יוריד לעצמו את כל מה שהוא צריך ואחרי כמה דקות ושני אישורים זה מה שאתם רוצים לראות:
Installed:
java-1.8.0-openjdk.x86_64 1:1.8.0.141-1.b16.el7_3
Dependency Installed:
copy-jdk-configs.noarch 0:1.2-1.el7 fontconfig.x86_64 0:
fontpackages-filesystem.noarch 0:1.44-8.el7 giflib.x86_64 0:4.1.
java-1.8.0-openjdk-headless.x86_64 1:1.8.0.141-1.b16.el7_3 javapackages-tools.n
libICE.x86_64 0:1.0.9-2.el7 libSM.x86_64 0:1.2.2
libXcomposite.x86_64 0:0.4.4-4.1.el7 libXext.x86_64 0:1.3
libXfont.x86_64 0:1.5.1-2.el7 libXi.x86_64 0:1.7.4
libXrender.x86_64 0:0.9.8-2.1.el7 libXtst.x86_64 0:1.2
libfontenc.x86_64 0:1.1.2-3.el7 libxslt.x86_64 0:1.1
lksctp-tools.x86_64 0:1.0.17-2.el7 python-javapackages.
python-lxml.x86_64 0:3.2.1-4.el7 ttmkfdir.x86_64 0:3.
tzdata-java.noarch 0:2017b-1.el7 xorg-x11-font-utils.
xorg-x11-fonts-Type1.noarch 0:7.5-9.el7
Dependency Updated:
nspr.x86_64 0:4.13.1-1.0.el7_3 nss.x86_64 0:3.28.4-1.2.el7_3 nss-sysini
nss-tools.x86_64 0:3.28.4-1.2.el7_3 nss-util.x86_64 0:3.28.4-1.0.el7_3
Complete!
ואז מהגיע החלק הכייפי. הכלי מוכן לפעולה. צריך להכין לו קובץ הגדרות וזה די נוח כי אפשר להעתיק את הקובץ, לשלוח ללקוח בדיוק מה להריץ, לערוך ב offline ובמקרה שלי לקבל פלט ממה שחברי הטוב איתי הריץ במעבדה כדי לבוא מוכן עם משהו סביר לעבודה.
מה הכוונה משהו סביר לעבודה? החלק החשוב בבדיקות כאלו הוא לדמות משהו ריאלי, אין הרבה טעם להריץ 100% read IO של בלוקים בגודל 2K. למה? כי אין הרבה אפליקציות שככה נראה הIO Pattern שלהן אז למרות שנקבל מספרים די מגניבים, אלו מספרים חסרי משמעות יישומית ללקוח. היות וניסינו לעבוד מסודר ועשינו את עבודת ההכנה ידענו איך נראה ה workload של הלקוח לשרת בודד וככה בנינו את קובץ ההגדרות שלנו ואז אפשר לשחק עם הקובץ, להריץ אותו לדמות שרת בודד, להריץ אותו לדמות כמה שרתים, להוריד את ה performance peak, להריץ רק את performance peak וכן הלאה. הסיבה להוריד את ה performance peak או להריץ רק את השיא היא שלפעמים יש שונות מאד גדולה בין מה שהשרת עושה במהלך רוב הזמן ומה שהוא עושה בשיא הביצועים, במקרה שלנו למשל, בשיא הפעילות השרת מריץ בלוקים פי 2 יותר גדולים בקריאה ופי 10 יותר גדולים בכתיבה (batch job) ולכן כדאי לראות כמה וריאציות שונות של היחס בין אלו לאלו.
קובץ הקונפיגורציה צריך לכלול על מה מריצים, את מה מריצים וכמה מריצים. בואו נסתכל על הדוגמא הבאה שמועתקת (עם קרדיט כמובן) ישירות מהדוגמאות המצורפות לחבילה ההורדה של Vdbench:
*
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
*
* Author: Henk Vandenbergh.
*
*Example 1: Single run, one raw disk
*SD: Storage Definition
*WD: Workload Definition
*RD: Run Definition
*
sd=sd1,lun=/dev/rdsk/c0t0d0sx
wd=wd1,sd=sd1,xfersize=4096,rdpct=100
rd=run1,wd=wd1,iorate=100,elapsed=10,interval=1
*Single raw disk, 100% random read of 4k records at i/o rate of 100 for 10 seconds
SD מגדיר את הדיסקים אליהם אנחנו רוצים לכתוב, במקרה הזה דיסק בודד שנמצא בנתיב /dev/rdsk/c0t0d0sx
WD מגדיר מה מרצים כלומר איך נראה ה workload, בדוגמה הזו מדובר על בלוקים בגודל 4K ואגב, אפשר פשוט לכתוב 4K במקום 4096 ומדובר כאן על 100% קריאה – rdpct=100 – read percent 100
RD מגדיר כמה מריצים וכאן מוגדר להריץ iorate=100 כלומר 100 פעמים מה שמוגדר ב WD.
לבדיקות ביצועים אמינות ויציבות כדאי להריץ לפני כן workload בסיסי של fillup שמטרתו די ברורה מהשם שלו, למלא את הדיסקים לפחות באופן חלקי. למה? כי כולנו יודעים שמערכת ריקה לא מתנהגת כמו מערכת מלאה או מלאה חלקית, אם היא ריקה אז אין תחרות על משאבים, תהליכי ה metadata פשוטים יותר, אין בעיות למצוא מקום פנוי לבצע תהליכי כתיבה, כל תהליכי הקריאה פשוטים, אין בשום מקום תהליכי scrub או תהליכי garbage collection, הכל נקי וחלק ופנוי ולא אמין.
ההרצה בפועל היא פקודה מאד פשוטה
./vdbench -f configfilename
ואם רוצים גם לקבל פלט תוצאות, נניח במקרה ואין לכם גישה למוניטור של הסביבה (סתם נניח,שמעתי זה קורה לפעמים), אז מריצים את אותה פקודה בתוספת -o outputfilename
וזו התוצאה הצפויה, הכלי מדווח שהוא יוצר את קובץ הפלט, שההתקנים מחוברים ושהוא מתחיל לעבוד על קובץ הקונפיגורציה שבחרתם. הפלט למטה מראה לנו בערך 6000 IOps של כתיבה בלבד בבלוקים של 256K, זה שלב ה fillup ובבלוקים כאלו גדולים גם זמן התגובה (latency) בהתאם
13:30:44.188 Created output directory '/home/vdbench50406/ outputfilename
13:30:44.202 input argument scanned: '- configfilename
13:30:44.202 input argument scanned: '- outputfilename
13:30:44.341 Starting slave: /home/vdbench50406/vdbench SlaveJvm -m localhost
13:30:44.865 All slaves are now connected
13:30:46.001 Starting RD=fillup; I/O rate: 15000; elapsed=30000; For loops: threads=32
Aug 02, 2017 interval i/o MB/sec bytes read resp read write re
rate 1024**2 i/o pct time resp resp m
13:31:06.042 1 6073.95 1518.49 262144 0.00 51.710 0.000 51.710 107.9
13:31:26.049 2 6148.60 1537.15 262144 0.00 51.924 0.000 51.924 103.0
13:31:46.045 3 6184.25 1546.06 262144 0.00 51.756 0.000 51.756 106.2
כמובן שאפשר להריץ במקביל יותר מ workload אחד, יותר מגודל בלוק אחד לכל workload ולשחק ביחס בין ה workloads השונים, זה כלי די גמיש ונוח לשימוש אחרי שמתרגלים לקונספטים הבסיסיים שלו. אתם מוזמנים לדבר איתי אם יש לכם שאלות או צריכים עזרה בשכלול היכולות, אני רחוק מלהיות power user אבל אשמח לתת יד בכל מקרה.
כמובן שהנסיעה הזו לא היתה החמצה מוחלטת, הלקוח יצא די מרוצה ממה שכן הצלחנו הראות לו וקבענו מועדים להמשך פעילות כדי לכסות את מה שלא בוצע בפועל. בין לבין הצלחתי גם ללכת לראות את המבנה היפה הזה, אי שקט באמצע הברדק של דלהי, קברו של Safdar Jang, שליט מדינת אודה בהודו, שנבנה ב1754 . המבנה תחת שיפוץ כרגע, בכל רחבי המבנה והגן הסובב אותו זוגות צעירים מסתודדים, איש המכירות המקומי הסביר לי שהם בורחים לכאן כי באופן כללי מאד לא מקובל שזוגות לפני החתונה נפגשים לבד ומסתודדים ככה.
בפן הקולינרי של הנסיעה, מסעדת שודדי הגריל לא היתה מוצלחת במיוחד אבל הגימיק של להגיש מספר גדול של שיפודים לשולחן נחמד, הקינוחים היו מצויינים ושיפוד האננס היה מעולה! שימו לב שהלינק הוא לאתר הביקורות Zomato שמאד פופולרי בהודו ולכן, כך נאמר לי, אמין יותר מאפליקציות כמו trip advisor וכאלו.
זהו, יצא די ארוך הפעם, מקווה שיועיל למישהו.
אה, רגע, לסיום, בגלל שחזרתי עם טורקיש, הפעם בלי דחיות וביטולים, אז טסתי מעל אפגניסטן. חויה מוזרה לישראלי הנשוי לפרנואידית. סתם בונוס קטן.
אל תהססו לספר לי מה דעתכם.
שלכם תמיד,
ניר מליק
5 מחשבות על “הקרמה באה בבעיטת סיבוב ואז היא הריצה Vdbench”