פתרון בעיות

בדף הזה מוסבר איך לפתור בעיות ב-Cloud Profiler.

שגיאות בהגדרת הפרויקט ב- Google Cloud

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

‫Cloud Profiler API מושבת

השגיאה הבאה מתרחשת כש-Profiler API לא מופעל בפרויקט Google Cloud :

failed to create a profile, will retry: rpc error: code = PermissionDenied
desc = Cloud Profiler API has not been used in project 012345 before or it is disabled.

כדי לפתור את הבעיה, צריך להפעיל את Profiler API בפרויקט Google Cloud :

  1. מפעילים את Cloud Profiler API.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    להפעלת ה-API

  2. אם מוצג הכיתוב API enabled, סימן שממשק ה-API כבר מופעל. אם לא, לוחצים על הכפתור הפעלה.

למתקשר אין הרשאה

השגיאה הבאה מתרחשת כשאין לכם הרשאה לכתוב נתוני פרופיל לפרויקט Google Cloud :

failed to create a profile, will retry: rpc error: code = PermissionDenied
desc = The caller does not have permission.

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

שגיאות ב-Node.js

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

האפליקציה לא יוצאת כרגיל עם Node.js

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

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

שגיאות ב-Python

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

חריג אחד (NotImplementedError) עם Python

החריגה הבאה מופעלת במהלך ההרצה של הפונקציה start כשהאפליקציה מורצת בסביבה שאינה Linux:

NotImplementedError

כדי לפתור את הבעיה, צריך להפעיל את האפליקציה בסביבת Linux.

חריג אחד (ValueError) עם Python

החריגה הבאה מופעלת במהלך start אם הארגומנטים של הפונקציה לא תקינים, אם אי אפשר לקבוע את המידע הנדרש ממשתני הסביבה והארגומנטים, או אם השבתתם את פרופיל הזמן של ה-CPU ואת פרופיל הזמן בפועל:

ValueError

כדי לפתור את הבעיה, צריך לבדוק את כל הדברים הבאים:

  • מוודאים ששם השירות והגרסה עומדים בדרישות שמוגדרות במאמר ארגומנטים של שם השירות והגרסה.
  • אם הפרופיל של Wall מופעל, חשוב לוודא שהפונקציה start מופעלת מה-thread הראשי.
  • מוודאים שאתם משתמשים בגרסה נתמכת של Python ושהפרופיל של זמן CPU (מעבד) או זמן בפועל מופעל. מידע נוסף זמין במאמר בנושא פונקציית start.
  • אם אתם מפעילים את התכונה מחוץ ל-Google Cloud, צריך לוודא שציינתם את הפרמטר project_id ל-start. מידע נוסף זמין במאמר בנושא הפונקציה start.

שגיאות שקשורות למשאב שלא זמין זמנית ב-Python

יומן השגיאות מכיל את הרשומות הבאות אחרי הפעלת Profiler:

BlockingIOError: [Errno 11] Resource temporarily unavailable
Exception ignored when trying to write to the signal wakeup fd

ההודעות האלה מופיעות כשאפליקציה נרשמת לתיאור הקובץ של האות wakeup, signal.set_wakeup_fd. כברירת מחדל, אם המאגר של מתאר הקובץ מתמלא, האזהרה נרשמת ב-stderr.

כש-Cloud Profiler אוסף פרופילים, הוא מפעיל אותות בתדירות גבוהה, ועלול לגרום לתיאור קובץ האותות להתמלא. למידע נוסף על הבעיה ב-GitHub, אפשר לעיין במאמר בנושא BlockingIOError ב-App Engine.

כדי לפתור את הבעיה תוכלו לנסות אחד מהפתרונות הבאים:

  • אם האפליקציה יכולה לפעול בצורה בטוחה גם כשאין אותות, אפשר להשתמש ב-Cloud Profiler. אם אתם משתמשים ב-Python 3.7 ואילך ורוצים להשבית את הודעות האזהרה, צריך להעביר את warn_on_full_buffer=False כפרמטר אל signal.set_wakeup_fd.

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

חסרים כל הפרופילים

יש שתי סיבות נפוצות לכך שלא מוצגים פרופילים:

  • השירות לא פועל מספיק זמן כדי לאסוף פרופילים.
  • השירות לא מוגדר לאימות.

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

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

חסרים פרופילים מסוג מסוים

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

מידע כללי

אם אתם רוצים לראות סוג פרופיל מסוים אבל אין פרופילים מהסוג הזה, כדאי לבדוק את הדברים הבאים:

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

‫Go: לא נאספים פרופילים של זמן CPU עבור c-archives

כשיוצרים אפליקציית Go עם הדגל -buildmode שמוגדר לערך c-archive או c-shared, פרופיל הזמן של השימוש במעבד מושבת כברירת מחדל. מתבצע איסוף של פרופילים של Heap,‏ contention ו-thread. מידע נוסף אפשר למצוא במאמר בעיה מספר 993 ב-GitHub: הכלי ליצירת פרופילים לא אוסף נתוני CPU עבור קוד Go בארכיון c.

כדי לפתור את הבעיה הזו, צריך להפעיל את איסוף פרופילי הזמן של מעבד לפני קריאות השירות profiler.Start, ולהוסיף קריאה ל-signal.Notify(make(chan os.Signal), syscall.SIGPROF). מידע נוסף על signal.Notify זמין במאמר func Notify.

‫Java: לא מתבצע איסוף של תמונות מצב של ערימה כשמופעלים כמה פרופילים

הפעלתם כמה כלי פרופיל של ערימה לאפליקציית Java ואין פרופילים.

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

כדי לפתור את הבעיה, מפעילים פרופילר אחד.

‫Python: אין פרופילים של זמן מעבד ואין פרופילים של זמן שעון כשמשתמשים ב-uWSGI

כש-uWSGI משתמש בכמה תהליכי worker כדי לטפל בבקשות, התנהגות ברירת המחדל היא לבצע אתחול של האפליקציה רק בתהליך הראשי (master). התהליכים המפוצלים לא מבצעים את רצף האתחול.

אם מגדירים את סוכן הפרופילים ברצף האתחול של האפליקציה – לדוגמה, אם מגדירים את סוכן הפרופילים בשיטה AppConfig.ready() של אפליקציית Django – סוכן הפרופילים לא מוגדר לתהליכים המפוצלים.

כדי לפתור את הבעיה, צריך לבצע אתחול של האפליקציה בכל תהליכי העובד על ידי הגדרת הדגל lazy-apps לערך true.

‫Python: יש פרופילים של זמן CPU, אבל אין פרופילים של זמן שעון קיר כשמשתמשים ב-uWSGI

הכלי Wall profiler מסתמך על מודול האותות של Python. כשמהדרים את מתורגמן Python עם תמיכה בשרשור, התצורה שמוגדרת כברירת מחדל משביתה את הטיפול באותות מותאמים אישית לתהליכים מסועפים.

כדי לפתור את הבעיה, צריך להפעיל את הטיפול באותות בהתאמה אישית באפליקציות uWSGI. לשם כך, מגדירים את הדגל py-call-osafterfork לערך true.

‫Python: אין פרופילים לתהליכים מסועפים

סוכני הפרופיל יכולים ליצור פרופיל רק של התהליך שהפעיל את הסוכן.

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