NodeJS הזיכרון מתנפח
-
יש לי שרת ב Nodejs.
מחוברים אליו מאות קליינטים.
זה קרה לי באופן פתאומי, הזיכרון של התהליך התנפתח מאוד, עד שהגיע לכמויות גבוהות, מעל 1 GB. וה PM2 עשה לו ריסטרט.זה היה לפני הרבה זמן. מאז פיצלתי את השרת לכמה עותקים (על אותה המכונה), וכל קבוצת קליינטים ניגשת לשרת אחר.
עשיתי לאחרונה איזשהו עדכון ומאז הזיכרון של השרתים התחיל שוב לקפוץ.
אבל לא ברור לי למה. זה לא קורה תמיד. הזיכרון של כל תהליך הוא בדר"כ באיזור 250 MB. ולפעמים יש לו קפיצות עד 700MB שהוא יכול להשתחרר מהם לבד. ולפעמים הוא עובר את ה 1 GB ונופל ע"י ה PM2.מטרת השאלה שלי היא, מה לדעתכם יכול בעיקר לגרום לבעיות זיכרון כאלו.
האם עצם זה שיש בקשות http רבות יכול לגרום לעומס זיכרון?
האם זה שיש websocket מול כל הקליינטים יכול לגרום לעומס זיכרון?
זה שיש הרבה קריאות ל DB יכול להשפיע על הזיכרון של השרת?כי לא שיניתי הרבה, יש רק פונקציה אחת שהשתנתה. והיא פונקציה שרצה בשביל כל קליינט, אחת או פעמיים לדקה. נניח שעל כל שרת יש אפילו 300 קליינטים פעילים (משהו שלא נראה לי סביר. אלא אולי 150). הפונקציה מריצה כמה שאילתות ב DB, ועושה כמה לולאות. לא משהו חריג בכלל.
עריכה: גם ה CPU יכול לעלות במקביל ל RAM.
-
@מנצפך אמר בNodeJS הזיכרון מתנפח:
פונקציה מריצה כמה שאילתות ב DB, ועושה כמה לולאות. לא משהו חריג בכלל
לא מומחה גדול, אבל חושב שיעזור שתפרט מה בדיוק מזה התחדש.
אצלי כשזה קרה התברר בסוף כטעות בלולאה, שיצרה מערכים בגדלים מטורפים.
לכרום יש כלי שמראה מה בדיוק (טוב לא בדיוק) לוקח את הזכרון / CPU (2 טסטים נפרדים). -
@אהרן אמר בNodeJS הזיכרון מתנפח:
אצלי כשזה קרה התברר בסוף כטעות בלולאה, שיצרה מערכים בגדלים מטורפים.
מסתבר מאוד שזה רק בגלל שגיאה כל שהיא ולא מחמת עומס בקשות.
אצלי היה משהו דומה, לא בלולאה, אלא בעדכון נתונים מסויים במקום לדרוס נתונים זה הוסיף נתונים.
מה שגרם בכל לחיצה לצריכה נוספת של הראם עוד ועוד, עד שכל השרת קרס והפסיק להגיב, והוצרכתי להפעילו מחדש בהדשבורד של AWS.
אולי אצלך יש משהו דומה, או שאולי אתה מוריד כמות מטורפת של נתונים בכל בקשה, אולי לא שמתwhere
נכונים בבבקשות?ואגב מעניין שלא היה לי אז הגבלה לריסטארט מצד ה PM2.
אולי כי לא הגעתי לג'יגה בתהליך ההוא אלא השרת קרס לפני זה, (בהמשך הכפלתי זכרון ראם, בלי קשר, אלא ליתר בטחון), או שזה הגדרה ידנית בPM2? -
@אהרן
מה שמשגע אותי שזה לא קורה תמיד. הזיכרון לכל שרת הוא בדר"כ סביב 200-300 MB ולפעמים הוא מתנפח עד ל 600-700 ויורד חזרה, ולפעמים חוצה את ה 1 GB וקורס (ייתכן שהיה מצליח לבד לשחרר את הזיכרון, לולא ה PM2 היה מוריד אותו).לא מצאתי עדיין איזושהי פונקציה או מצב ספציפי שגורם לזה.
אני חושב שניהול זיכרון לא הכי טוב של JS + שימוש בספריות לא פופולריות + טעויות שלי בקוד, גורם לזה לקרות פתאום. ולא בהכרח פונקציה מסויימת.כרגע אני פותר את זה ע"י חילוק המערכת לשרתים קדמיים ושרת אחורי אחד.
בגדול השרת האחורי הוא עותק של השרתים הקדמיים, מלבד זה שאין לו בכלל ווב סוקט, אין לי ניהול סשנים (השרתים הקדמיים משתמשים בסשנים - ע"י redis- , דבר ששכחתי להזכיר שנראה לי מאוד תורם לבעיות הזיכרון).השרת האחורי מטפל בעיקר בשאילתות הפחות חשובות.
דבר נוסף, בגלל שזה פרוייקט שהתחלתי אותו עוד לפני שידעתי ארכיטקטורת ווב בסיסית, השרת API עצמו מספק גם את הקבצים הסטטיים (זו אפליקציית SPA). זה דבר שוודאי יכול לתרום לעומסים על השרת, גם אם לא על ה RAM, אז על התעבורה. אני אפריד את זה מהשרת API ונראה מה קורה.