ביצוע instrumentation אפליקטיבי הוא חלק הכרחי במערכות תוכנה סבוכות. כתיבה עשירה של tracing ו logging מאפשר לנו לעקוב אחר ההתנהגות של האפליקציה שלנו - במיוחד בסביבות פרודקשין שבו אנחנו לא יכולים להתחיל לדאבג את המערכות.
זה מתחיל להיות קריטי עבור מערכות High-performance (למשל אפליקציות BIZTALK)שבהם כל כתיבה ללוג או ל Trace יכול להפחית את ביצועי המערכת.
האופציות השכיחות לכתוב ל Trace (באמצעות קומפוננטות צד שלישי):
זה מתחיל להיות קריטי עבור מערכות High-performance (למשל אפליקציות BIZTALK)שבהם כל כתיבה ללוג או ל Trace יכול להפחית את ביצועי המערכת.
האופציות השכיחות לכתוב ל Trace (באמצעות קומפוננטות צד שלישי):
אבל:
- כאשר נפתח את DebugView כדי לצפות בEvent-ים הרבים , הכלי יצרוך כ 85% ממשאבי ה CPU. (הכלי DebugView מתפקד כ Debugger ונרשם ל OUTPUT_DEBUG_STRING_EVENT) כתוצאה מכך יש פגיעה משמעותי ב Performance של האפליקציה. אם מדברים על אפליקציית Biztalk, יתכן מצב שכתוצאה מכך יכנסו לנו תהליכים למצב של Suspended.
- ביצועים נמוכים-System.Diagnostic.Trace.Component יודע לכתוב כ 2000-8000 כתיבות בשניה (כאשר DebugView Event Capture במצב Enabled)
- כל שינוי ב tracing configuration דורש אתחול של האפליקציה (לרוב..). בפרויקט ביזטוק נדרש לאתחל את ה Host Instance- לפעמים זה לא מתאפשר בסביבת ה Prod.
לכן, הפתרון המומלץ:
Event Tracing For Windows-ETW- תשתית לוגים סקאלאבילית שמערכת ההפעלה מספקת לנו (מאז שנת 2000). החסרון זה שלא קל לעבוד מול התשתית הזאת, אך יש המון דוגמאות באינטרנט כיצד לעבוד מול התשתית.
אז מה התשתית מספקת לנו:
- בניסוי שנערך על מחשב עם 4 ליבות, התשתית כתבה כ 1.4 מיליון!!! של Trace event לשניה!
- כל שינוי ב tracing configuration לא דורש אתחול של האפליקציה
- צריכה נמוכה של משאבי CPU- התשתית משתמשת בפתרון Buffering שממומש על גבי הKernel, שכותב באופן א-סינכרוני לדיסק ע"י Thread נפרד.
להלן בדיקות הביצועים שנעשו על גבי כל 4 התשתיות שציינתי:
הבדיקה נעשתה ע"י הרצה של מטודה שכותבת ל Trace רשומה אחת, ואותה הריצו בלולאה 100,000 פעמים. בסיום ההרצה התשתיות היו צריכות לספק קובץ לוג מבוסס Text
אפשר לראות בבירור את השימוש ב ETW עבור מערכות High-Performance.
תהנו!
