למה מדידת ביצועים היא תמיד פעולה פולשנית
למה מדידת ביצועים היא תמיד פעולה פולשנית
כמעט כל מערכת מודרנית נמדדת כל הזמן. Latency, Throughput, CPU, זיכרון, טרייסים, מטריקות.
ההנחה האינטואיטיבית היא שהמדידה “יושבת בצד” - מתבוננת, אבל לא משפיעה.
בפועל, זה אף פעם לא נכון.
עצם המדידה משנה את המערכת.
Overhead של metrics ו-tracing
כל מדידה עולה משהו.
כתיבת מטריקה:
- צורכת CPU
- נוגעת בזיכרון
- מוסיפה סנכרון
Tracing:
- עוטף קריאות
- מוסיף הקצאות
- מאריך מסלולי ביצוע
ברוב המקרים זה overhead קטן - אבל הוא מצטבר, והוא לא אחיד.
האירוניה היא שמדידה נועדה לחשוף צווארי בקבוק, אבל היא עצמה יכולה להפוך לאחד מהם.
למה בנצ’מרק “נקי” קשה להשגה
בנצ’מרק מושלם מניח עולם שלא קיים:
- בלי לוגים
- בלי מטריקות
- בלי טרייסים
- בלי מנגנוני הגנה
כלומר - מערכת אחרת.
במציאות, מערכת בפרודקשן:
- נמדדת
- מנוטרת
- נצפית
ולכן הביצועים שלה שונים מבנצ’מרק “סטרילי”.
הפער הזה לא נובע מחוסר דיוק - אלא מכך שהמדידה עצמה היא חלק מהמערכת.
המשל
דמיינו ניסיון למדוד זרימה בצינור על-ידי חיבור חיישנים, שסתומים ומד-לחץ.
כל רכיב כזה:
- מפריע לזרימה
- משנה לחץ
- משפיע על התוצאה
המדידה לא משקרת - אבל היא גם לא ניטרלית.
איך להבחין בין מדידה שימושית למדידה מזיקה
השאלה הנכונה איננה: “האם זה מוסיף overhead?”
אלא: “מה הערך שהמדידה מחזירה ביחס למחיר שלה?”
מדידה שימושית:
- עונה על שאלה ברורה
- מאפשרת החלטה
- מופעלת כשיש צורך אמיתי
מדידה מזיקה:
- נאספת “ליתר ביטחון”
- לא נצרכת בפועל
- מוסיפה רעש והאטה בלי תובנה
יותר נתונים לא בהכרח מקרבים לאמת - לפעמים הם פשוט משנים אותה.
השורה התחתונה
מדידת ביצועים היא לא פעולה חיצונית למערכת. היא חלק ממנה.
מערכת שמתוכננת היטב לא מנסה למדוד הכול כל הזמן, אלא בוחרת בקפידה מה למדוד - ומתי.
כי מדידה טובה לא שואפת להיות בלתי מורגשת, אלא להיות שווה את המחיר שהיא גובה.