סוגי פרופילים ומתי כל אחד מהם שימושי

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

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

נתוני מעקב של המערכת

דוגמה לתיעוד עקבות המערכת
איור 1.: דוגמה לתיעוד עקבות המערכת.

מערכת עקבות היא פרופיל עוצמתי שמכיל מידע על תהליכים, שרשורים, מידע על תזמון, ביצוע של מעבד ומשימות ואירועים מוגדרים על ידי המערכת או המשתמש.

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

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

  • פרוסות של מעקב: מייצגות את הזמן בין נקודות שונות בקוד. אפשר להוסיף אותם באמצעות ממשקי ה-API‏ Trace.beginSection ו-Trace.endSection.
  • מונים של מעקב: ערכים מספריים שמייצגים מדדים, למשל גודל הערימה. אפשר להוסיף אותם באמצעות Trace.setCounter API.

עקבות מערכת מכילים גם מדדים שאפשר ליצור משאילתות PerfettoSQL, ואפשר להשתמש בהם כדי לבצע ניתוחים או להשוות בין עקבות.

מומלץ להשתמש במעקב אחר המערכת כדי לבצע את המשימות הבאות:

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

  • איתור חישובים משוכפלים המעקב יכול לחשוף אם חישובים מסוימים חוזרים על עצמם, מה שעשוי להצביע על פעולות מיותרות.

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

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

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

נתוני מעקב של המערכת תומכים גם בשאילתות באמצעות PerfettoSQL. התכונה המתקדמת הזו מאפשרת לכם:

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

פרופילים של מקבץ דגימות

דוגמה לפרופיל של דגימת מחסנית
איור 2.: דוגמה לפרופיל של דגימת ערימה.

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

מומלץ להשתמש בדוגמאות של מחסנית כדי לבצע את הפעולות הבאות:

  • אופטימיזציה של אזורים חמים. דגימות של מחסנית עוזרות לזהות חלקים בקוד עם פעילות גבוהה של CPU, כלומר השרשור נמצא לעיתים קרובות במצב 'פועל'.
  • הסבר על הרצת קוד דגימות של מחסנית יכולות לעזור לכם להבין את ההתנהגות הכוללת של ה-codebase.
  • מזהים קוד שלא אמור לפעול. יכול להיות שתמצאו מחסניות קריאות שלא היו אמורות לפעול בכלל, מה שמצביע על הזדמנויות מיידיות לאופטימיזציה.

תמונות מצב של הזיכרון

דוגמה לתמונת מצב של הזיכרון
איור 3.: דוגמה לתמונת מצב של הזיכרון.

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

מומלץ לאסוף נתוני heap dump כדי לבצע את הפעולות הבאות:

  • גילוי אובייקטים כפולים. קובצי dump של ערימה (heap) מציגים את מספר האובייקטים הפעילים, וזה שימושי למעקב אחרי אובייקטים כפולים. הם גם מספקים הפניות לאובייקטים, ועוזרים לכם לאתר את המיקום בקוד שבו האובייקטים נוצרו.
  • למצוא דליפות זיכרון. קובצי Heap dump יכולים לחשוף זיכרון שלא אמור להיות בשימוש יותר בזמן יצירת הקובץ, מה שמצביע על דליפות זיכרון פוטנציאליות.
  • זיהוי אובייקטים שאפשר לבצע בהם אופטימיזציה. ה-heap dumps מציגים אובייקטים שצורכים הרבה זיכרון ואת המספר שלהם, וכך עוזרים לזהות דפוסי שימוש לא יעילים בזיכרון.

תמונות מצב של ערימה

דוגמה לתמונת מצב של ערימה
איור 4.: דוגמה לתמונת מצב של ערימה.

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

מומלץ להשתמש בפרופילים של ערימות כדי לבצע את הפעולות הבאות:

  • צמצום העמסת זיכרון. פרופילים של ערימות (heap) מספקים דגימות עם מיקומי קוד להקצאות זיכרון. כך תוכלו לזהות אזורים שיוצרים הרבה אובייקטים זמניים, שיכולים לתרום ל-Garbage Collections (איסוף אשפה) תכופים באפליקציה.
  • זיהוי דליפות זיכרון. אפשר להשתמש בפרופילים של הזיכרון עם פרופילים אחרים של הזיכרון כדי לאבחן ולתקן דליפות זיכרון. הם עוזרים לכם לזהות מיקומים שמקצים הרבה יותר זיכרון מהצפוי.

מיזוג פרופילים

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

כדאי לשקול מיזוג פרופילים בתרחישים הבאים:

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

  • תרחיש 2: ניתוח של דליפות זיכרון ואיסוף נתונים לא רלוונטיים (garbage collection). תארו לעצמכם שמערכת עוקבת אחרי עלייה קבועה בזיכרון של ערימת Java בגלל הקצאות, מה שגורם לאיסוף תדיר של נתונים לא רלוונטיים (GC). כדי להבין את האובייקטים שהוקצו, יוצרים פרופיל של הערימה או תמונת מצב של הזיכרון. הגישה המשולבת הזו עוזרת לכם לזהות דרכים לצמצם את השימוש בזיכרון. לדוגמה, שימוש במטמון כדי לצמצם הקצאות מיותרות או כאלה שאפשר לבצע אופטימיזציה שלהן עשוי למנוע את ההתרחשות של איסוף נתונים.