מושגים בנושא יצירת פרופילים

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

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

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

‫Cloud Profiler הוא כלי ליצירת פרופילים באופן רציף, שמיועד לאפליקציות שפועלות ב- Google Cloud:

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

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

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

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

*אפשר לעיין במאמרים הבאים: Google-Wide Profiling: A Continuous Profiling Infrastructure for Data Centers ו-Continuous Profiling: Where Have All the Cycles Gone?.

סוגי הפרופילים שזמינים

בטבלה הבאה מפורטים סוגי הפרופילים הנתמכים:

סוג הפרופיל המשך Java Node.js Python
זמן CPU (מעבד) YY Y
Heap YY Y
זיכרון בערימה שהוקצה Y
מחלוקת Y
Threads Y
זמן בפועל Y YY

בהמשך הקטע הזה מפורטים סוגי הפרופילים האלה.

מדידות זמן

  • זמן CPU הוא הזמן שהמעבד מבלה בהרצת בלוק קוד.

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

  • זמן בפועל (נקרא גם זמן בפועל) הוא הזמן שנדרש להפעלת בלוק קוד.

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

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

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

שימוש בזיכרון ערימה (heap)

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

  • הקצאת זיכרון בערימה (נקראת גם זיכרון בערימה שהוקצה) היא כמות הזיכרון הכוללת שהוקצתה בערימה של התוכנית במהלך המרווח שבו נאסף הפרופיל. הערך הזה כולל את כל הזיכרון שהוקצה, שוחרר וכבר לא נמצא בשימוש. לדוגמה, נניח שיש עבודה שחוזרת על עצמה ברצף הבא: הקצאת 1MiB, המתנה של 500 אלפיות השנייה, שחרור 1MiB, המתנה של 500 אלפיות השנייה. ב-10 השניות שבהן נאסף פרופיל ה-heap שהוקצה, יש 10 הקצאות ו-10 שחרורים. בפרופיל הזה יופיעו 10MiB של ערימה שהוקצתה, כי לא נלקחים בחשבון הזיכרונות ששוחררו. קצב ההקצאה הממוצע הוא ‎10 MiB/10 seconds או ‎1 MiB per second.

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

פרטי השרשור

אפליקציות שיוצרות שרשורים עלולות לסבול משרשורים חסומים ומדליפות של שרשורים:

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

שרשורים חסומים הם אחת הסיבות האפשריות לדליפת שרשורים.

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

מחלוקת

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

אוסף פרופילים

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

  • פרויקט אחד (Google Cloud )
  • שם האפליקציה
  • אזור האפליקציה
  • גרסת האפליקציה

כשאגנט מוכן ללכידת פרופיל, הוא מנפיק פקודת Profiler API ל-Profiler backend. הקצה העורפי מקבל את הבקשה הזו, ובמקרה הפשוט ביותר, משיב מיד לסוכן. התשובה מציינת את סוג הפרופיל שצריך לצלם. בתגובה, הסוכן מצלם את הפרופיל ושולח אותו אל ה-Backend. לבסוף, ה-Profiler בסביבת ה-Backend משייך את הפרופיל לפרויקט Google Cloud . אחר כך תוכלו להציג ולנתח אותו באמצעות הממשק של כלי הפרופיל.

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

בכל דקה, בממוצע, ולכל פריסה ולכל סוג פרופיל, ה-backend בוחר סוכן ומורה לו לצלם פרופיל. לדוגמה, אם הסוכנים של פריסה תומכים ב-Heap וב-Wall time profiling, בממוצע, שני פרופילים נלכדים בכל דקה:

  • בכל סוגי הפרופילים מלבד heap usage ו-threads, פרופיל יחיד מייצג נתונים שנאספו במשך 10 שניות.

  • נתוני השימוש בערימה ופרופילי השרשורים נאספים באופן מיידי.

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

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

מנתח נתונים

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

נכנסים לדף Profiler במסוף Google Cloud :

עוברים אל Profiler

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