memory issue

black h0le

New member
memory issue

שלום,
יש לי מערכת, שמאוכסנת על שרת shared צנוע. שמתי לב לאיטיות רבה לפעמים, ושאלתי את התמיכה של השרת, והם אמרו שיש חריגות של זיכרון, ולכן סקריפטים שלהם חוסמים אוטומטית תהליכים.
זה גרם לי להחליט לבחון איפה הבעיה. שמתי בסקריפט מסויים שורה פשוטה:
echo memory_get_usage();

את השורה הזאת הוספתי בתחילת הסקריפט, ובסוף הסקריפט. מכיוון שאין לי רקע sys-admin או הבנה עמוקה בנושאי זיכרון וכו', החלטתי לשאול כאן.
האם פלט כמו: 113696 בתחילת הסקריפט ו: 1894096 בסופו הוא פלט תקין ומתקבל על הדעת?
איזה צעדים אני יכול לנקוט כדי להפחית את צריכת הזיכרון של סקריפט?
 
התשובה שלהם תמוהה

לPHP יש דרך להגביל זיכרון פר תהליך אבל מה שקורה שכשאתה עובר אותו זה שהתליך מת, לא "מואט"
1894096 זה 1.8 מגה בייט זיכרון שזה לא נראה לי הרבה אבל בלי לדעת מה הקוד שלך עושה אי אפשר בדיוק לדעת מה זה תקין מבחינתך, אני הרצתי קבצי PHP שדרשו גם 500 מגה RAM
תנסה לבדוק את memory_get_peak_usage כדי לראות לכמה זיכרון הוא הגיע בשיא.
 

black h0le

New member
peak usage

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

אני מניח שאני אצטרך לבדוק איזה פונקציה/סקריפט גורם לעומס במצבים מסוימים. אבל במקום לשים memory_get_peak_usage או memory_get_usage בכל מקום שני במערכת, אין דברים מסוימים שאני יכול להימנע מהם/לעשות כדי להוריד את צריכת הזיכרון? קווים מנחים מסוימים?
 
לPHP יש הגדרה בשם memory_limit

http://www.php.net/manual/en/ini.core.php#ini.memory-limit
שברגע שהסקריפט מנסה להקצות יותר זיכרון ממה שמוגדר שם הוא מת
כדי להבין איפה הסקריפטים שלך "משתוללים" לטענתם, תוודא שיש לךerror log PHP מופעל, ששם ירשמו השגיאות של החריגות זיכרון
- תעיף בו כבר עכשיו מבט לראות אם יש דברים מעניינים.

תבדוק מה הערך של memory_limit ב)(PHPINFO או INI_GET)(

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

אתה גם יכול לנסות להקטין אותו לבד באופן מקומי עם ini_set או htaccess אבל לחברות shared יש נטייה לבטל את האפשרויות הללו.
 
ובנוגע לקווים מנחים

זיכרון זה אומר המשתנים שלך. אם קראת קובץ בגודל מגהבייט לתוך משתנה(file_get_contents נניח) אז הסקריפט שלך "ישמין" בעוד מגה זיכרון.
מאיפה מגיע המידע שנכנס למשתנים שלך?
הכל מוגדר בתוך הקובץ? אתה עושה שאילותת שעלולות להיות מאוד גדולות בDB? אתה עושה קריאות מקבצים?
מה אופי הקוד?
 

amitayh

New member
גם אם עובדים עם שאילתות גדולות או קבצים

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