שרת NodeJS. קפיצת RAM
-
יש לי שרת NodeJS ומסד נתונים Postgresql.
ה Sessions נשמרים ב Redis.
ע"י PM2.
בדר"כ הRAM של הפרוסס הוא 170 mb.
היום השרת נפל כמה פעמים בגלל שהוא הגיע ל RAM של 500 MB! ולכן ה PM2 הפיל אותו.
באיזשהו שלב גם ה Redis לא הצליח לשמור Sessions בגלל שלא היה לו RAM פנוי.גם השרת אותחל כמה פעמים ובאיזשהו שלב הוא הצליח לרדת חזרה ל 170 MB.
מאיפה יכול להיות שהגיעה הזליגה?
על מה להתמקד?
היה לי אישהו מודל שיוצר PDF בזיכרון ושולח במייל. יכול להיות שהוא עשה את הבעיה? כי הורדתי אותו, ואחרי כמה פעמים השרת חזר לעצמו כאמור.אולי הבעיה בשאילתות הזויות? זה גם לא אמור להיות עד כדי כך.
אשמח לרעיונות את מה לבדוק. -
@מנצפך אמר בשרת NodeJS. קפיצת RAM:
בדר"כ הRAM של הפרוסס הוא
זה יכול להיות התקפת בוטים שיצרה הרבה סשנים בזיכרון, אם יש לך אפשרות לבדוק כמה סשנים פתוחים או סתם ליצור מונה כניסות פשוט זה יכול לתת אינדיקציה.
-
@יוסף-בן-שמעון בנוד ריבוי שסנים עובד עם פרוסס בודד, כלומר זה בכלל לא עולה.
-
@מנצפך אמר בשרת NodeJS. קפיצת RAM:
@dovid למה לא עולה? אם נניח שיש 100000 שמתחברים בו זמנית וודאי זה מכביד על הפרוסס היחיד.
וודאי שאצלי הסשנים נשמרים ב redis.שלילי, זה לא מכביד. זה כל הפואנטה של נוד.
בשביל רדיס 10,0000 שסנים מתבטא בכמה מ"ב בודדים בראם, זהו.
אני לא מכיר את האפליקציה שלך, ייתכן שנעשים שמה דברים פר שסן שאכן גורמים לתלות בין מספרם לבין זלילת הזיכרון, אבל אם תעשה helow world עם שסן ברדיס, תוכל לראות שהקשר בין הזיכרון למס' השסנים הוא קלוש. -
לדעתי הבעיה בספריה של הPDF או באופן השימוש איתה.
זה מאוד מאוד נפוץ בנוד השאלה איך הזיכרון מתנפח, המון פעמים נתקעים בזה. פה בפורום הייתה לי את אותה בעיה ולא מצאנו פתרון חוץ מלהתקין התקנה נקיה לחלוטין ותוך כדי עבודה נמחק לנו הנתונים וככה הפורום חזר חודש אחורה, בדיעבד אולי בזכות המחיקה הבעיה הסתדרה... -
@dovid אמר בשרת NodeJS. קפיצת RAM:
@יוסף-בן-שמעון בנוד ריבוי שסנים עובד עם פרוסס בודד, כלומר זה בכלל לא עולה.
לא הבנתי מה אתה מתכוון, הוא שומר סשנים בזיכרון לטווח ארוך, בתקוה שכל גולש ישמור את הסשן וישלח אותו בחיבור הבא בעוגיות, במקרה שהרובוט לא שולח את הID של הסשן שלו, השרת מנפיק לו ID חדש וטוען אותו לזיכרון, למה זה לא יכביד על הזיכרון?
-
זה יכול להיות גם ששכחת לסגור קונקשנים למסד, או שימוש במשתנים גלובליים במקום להשתמש בלוקאלים פר בקשות, זה אולי יותר מהיר אבל זה גורם שהזיכרון לא מתנקה
-
@יוסף-בן-שמעון אמר בשרת NodeJS. קפיצת RAM:
@dovid אמר בשרת NodeJS. קפיצת RAM:
@יוסף-בן-שמעון בנוד ריבוי שסנים עובד עם פרוסס בודד, כלומר זה בכלל לא עולה.
לא הבנתי מה אתה מתכוון, הוא שומר סשנים בזיכרון לטווח ארוך, בתקוה שכל גולש ישמור את הסשן וישלח אותו בחיבור הבא בעוגיות, במקרה שהרובוט לא שולח את הID של הסשן שלו, השרת מנפיק לו ID חדש וטוען אותו לזיכרון, למה זה לא יכביד על הזיכרון?
הוא משתמש ברדיס, וזה אומר שnodejs לא שומר אפילו לשניה שסן אחרי סיום בקשה.
בקשר לרדיס 10K רשומות לא אמור להיות יותר כמה מ"ב, בפרט אם כל רשומה מכילה עשרות בתים בודדים. -
אתאר את ההתהנגות של השרת:
הוא התחיל להעלות את ה RAM. כשהוא הגיע לאיזור 500 MB הוא נכבה ונדלק שוב.
כך שכל המשתנים וכו' הלכו לפח.ברגע שהוא נדלק שוב הוא שוב התחיל לטפס והגיע לאיזור 500 MB ואותחל שוב.
כך בערך 7 פעמים.בסופו של דבר הוא חזר לעצמו.
ייתכן שהדבר נגרם משאילתות גדולות שלאחר מעשה ביטלתי את האפשרות לגשת אליהם.
(שאילתות שמאחזרות את כל המשתמשים, ומסכמת לכל אחד כל מיני נתונים).
כל שאילתה כזו היא אולי 100 MB.
ואם כמה משתמשים עשו ביחד שאילתה יש מצב שהגענו למצב הזה.ייתכן שזה קשור.
-
-
@מנצפך אמר בשרת NodeJS. קפיצת RAM:
לא חושב. NodeJS במימוש הזה שומר את הסשנים ב live. ו redis מועיל רק למקרה שבו אתחלתי את השרת. נראה לי אפילו למקרה שכיביתי את המכונה.
ברור שלא, זה מיותר בטירוף, כי הרדיס עושה בדיוק מה שאתה מתאר.
במקרה של express-session הם בפירוש ממליצים לא להשתמש כלל בMemoryStore כי זה לצרכי דבאג וזה עלול לקחת זיכרון רב (וזה לא רק הבו זמני, כי שסן יכול לחיות לנצח בהגדרתו).