WEBA

פרופיילינג ב-Cloudflare לא יתפוס זינוק בהתנעה

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

556 מילים20 עובדות אומתו

לוגים של שרתי קצה הם בדרך כלל המקום שבו תעלומות מגיעות כדי להישאר פתוחות. שגיאת זיכרון מסוג Exceeded Memory ב־Cloudflare Workers מודיעה לכם שה־Worker נזרק מהזיכרון כי חרג ממגבלת 128 מגה־בייט, אבל היא לא טורחת לספר איזה מערך גדל בלי שליטה או איזו פונקציה שכפלה אובייקט. בהודעה שפרסמה Cloudflare מציגה החברה יכולת חדשה להפעלת פרופיילינג לפי דרישה ישירות בסביבת הייצור. אפשר להפעיל דגימת מעבד או זיכרון ישירות מהדשבורד או מפקודת ה־CLI, ולקבל תרשים Flamegraph שמציג איפה הקוד שורף מחזורי ריצה. סוף סוף יש דרך לראות מה מתרחש בפנים, אבל המנגנון הזה מגיע עם שורת אותיות קטנות שמשאירה את בעיות האתחול מחוץ לתחום.

מציצים לתוך ה-Isolate החי

במקום לדמות עומסים בסביבת פיתוח מקומית עם כלים כמו Chrome DevTools שלא משחזרים את הניתוב האמיתי ברשת, הכלי מתחבר ישירות אל מופע קיים. המערכת מקצה נעילה קצרה ל־isolate של V8 רק כדי לאתחל את הדוגם, ואז משחררת אותה מיד. עבור פרופיל מעבד נלקחת דגימה בכל מילי־שנייה, ועבור פרופיל זיכרון מתבצע רישום של מחסנית הקריאות בכל הקצאה של 512 קילו־בייט. בסיום פרק הזמן שנבחר, שנע בין 1000 ל־50000 מילי־שניות, הנעילה נתפסת שוב לשבריר שנייה כדי לחלץ את הנתונים בלי לעצור את הטיפול בבקשות של משתמשים אמיתיים.

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

זה לא מספיק.

התעבורה חובה, האתחול נשאר עיוור

התנאי ההכרחי של הכלי הוא קיומה של תעבורה שוטפת. הפרופיילר אינו מפעיל את הקוד שלכם בעצמו אלא מתעלק על מופע פעיל. אם תפעילו דגימה על Worker שמקבל פניות בודדות בדקה, תקבלו קובץ ריק. יתרה מזאת, ב־Workers רגילים המערכת דוגמת מופע יחיד שנבחר באקראי מבין מאות מרכזי נתונים ברחבי העולם, כך שקשה לדעת אם לכדתם isolate שסובל מבעיה נקודתית או שרת שמייצג את הממוצע. הדיוק משתפר רק ב־Durable Objects, שם ניתן לציין מזהה מופע מדויק של 64 תווים הודות לעובדה שמדובר באובייקט בעל מצב עם מיקום פיזי מוגדר.

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

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

הקצאות זיכרון מול דליפה אמיתית

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

השוואה בין סוגי הפרופיילינג הזמינים ב-Workers
פרמטרפרופיל מעבד (CPU)פרופיל זיכרון (Heap)
קצב דגימהכל 1 מילי-שנייהכל 512 קילו-בייט מוקצים
מה נמדד בפועלזמן ריצה בפונקציות פעילותהקצאות זיכרון חדשות
יכולת זיהוי שאריות זיכרוןלא רלוונטילא (מודד הקצאה ולא retained)
משך ריצה נתמך1 עד 50 שניות1 עד 50 שניות

צוותי הפיתוח הפנימיים של החברה סיפקו דוגמה שממחישה היכן הדבר כן עוזר. בבדיקת Worker פנימי אחר שסבל מבעיות זיכרון, מופע הגיע בצריכת P999 לכ־133 מגה־בייט מול מגבלת 128 מגה־בייט ונזרק שוב ושוב. דגימת הזיכרון העלתה שקוד Prometheus, שהיה אמור להיות מושבת, היה אחראי לכ־66.7 אחוז מההקצאות בפרופיל. הסרה מלאה שלו הורידה את צריכת P999 ל־118 מגה־בייט ומנעה קריסות.

לא הייתי ממהר להסתמך רק על זה.

בלי סורס מאפס תראו ג'יבריש

אם אתם בונים פרויקט מבוסס TypeScript, הפעלת הפרופיילר בלי הכנה מוקדמת תציג לכם שמות פונקציות מקוצרים וחסרי משמעות מהקוד המהודר. לפי מדריך Source maps בדוקומנטציה, יש לוודא שמוגדר upload_source_maps בקובץ ההגדרות של ה־Worker לפני הפריסה. התקרה לקובץ מיפוי עומדת על 15 מגה־בייט דחוסים, והיא תאפשר ל־Flamegraph לפענח את שמות הפונקציות המקוריים.

משתמשים שמחפשים ניתוח עמוק יותר יכולים להשתמש ב־Cloudflare CLI כדי להוריד ישירות קובץ pprof בינארי. הפקודה מזרימה את המידע ישירות למחשב שלכם, ושם אפשר לפתוח אותו בכלים ייעודיים. עד שהפרופיילינג הרציף יגיע, תצטרכו להמשיך להנדס תעבורה ידנית רק כדי לתפוס באגים של עומס.

מה לעשות עכשיוהפעילו העלאת Source maps בהגדרות הפרויקט והורידו קובץ pprof ידני רק בזמן שמוזרמת תעבורת אמת לשרת.

מקורות

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

מה שואלים על זה

האם הפעלת הפרופיילר עוצרת את התעבורה ל-Worker?

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

למה הפרופיילר לא מזהה צריכת זיכרון שמתרחשת בעת עליית השרת?

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

איך מזהים שמות פונקציות מקוריים מתוך קוד TypeScript מהודר?

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