פתרון בעיות
בדף הזה מוסבר איך לפתור בעיות ב-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 :
-
מפעילים את Cloud Profiler API.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידים אם מוצג הכיתוב 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 :
אם השירות פועל ב- Google Cloud, האימות מתבצע באופן אוטומטי, אלא אם פורסים קונטיינר ב-Compute Engine. כשפורסים קונטיינר ב-Compute Engine, צריך לציין את מזהה הפרויקטGoogle Cloud בפקודה של סוכן Profiler
start. הוראות מפורטות מופיעות במאמר בנושא קישור הנציג ל Google Cloud פרויקט.אם השירות שלכם פועל מחוץ ל- Google Cloud, אתם צריכים ליצור חשבון שירות ולקשר את סוכן Profiler לפרויקט שלכם ב-Google Cloud . מידע נוסף זמין במאמר בנושא יצירת פרופילים של אפליקציות שפועלות מחוץ ל- 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: אין פרופילים לתהליכים מסועפים
סוכני הפרופיל יכולים ליצור פרופיל רק של התהליך שהפעיל את הסוכן.
כדי לפתור את הבעיה, אם האפליקציה שלך יוצרת עותקים של תהליכים ואם רוצים לאסוף פרופילים מהתהליכים שנוצרו, צריך לאתחל את הסוכן אחרי יצירת העותקים.