דימון רוצח זיכרון נמוך

תהליך אנדרואיד ה-low memory killer daemon ( lmkd ) עוקב אחר מצב הזיכרון של מערכת אנדרואיד פועלת ומגיב ללחץ זיכרון גבוה על ידי הרג התהליכים הפחות חיוניים כדי לשמור על ביצועי המערכת ברמות מקובלות.

לגבי לחץ זיכרון

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

מבחינה היסטורית, אנדרואיד ניטרה את לחץ הזיכרון של המערכת באמצעות מנהל התקן בתוך ליבה (LMK), מנגנון קשיח התלוי בערכים מקודדים. החל מגרעין 4.12, מנהל ההתקן של LMK מוסר מהקרנל במעלה הזרם ו-userspace lmkd מבצע משימות ניטור זיכרון והרג תהליכים.

מידע על עיכוב לחץ

אנדרואיד 10 ואילך תומכות במצב lmkd חדש המשתמש במסכי מידע על עיכוב לחץ ליבה (PSI) לזיהוי לחץ זיכרון. ערכת התיקון של ה-PSI בקרנל במעלה הזרם (מועבר לגרעין 4.9 ו-4.14) מודד את משך הזמן שבו משימות מתעכבות כתוצאה ממחסור בזיכרון. מאחר שהעיכובים אלה משפיעים ישירות על חווית המשתמש, הם מייצגים מדד נוח לקביעת חומרת לחץ הזיכרון. הקרנל במעלה הזרם כולל גם צגי PSI המאפשרים לתהליכי מרחב משתמש מועדף (כגון lmkd ) לציין ספים לעיכובים אלו ולהירשם לאירועים מהקרנל כאשר סף נפרץ.

צגי PSI לעומת אותות vmpressure

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

שימוש במסכי PSI

כדי להשתמש במסכי PSI במקום באירועי vmpressure , הגדר את המאפיין ro.lmk.use_psi . ברירת המחדל היא true , מה שהופך את צגי PSI למנגנון ברירת המחדל של זיהוי לחץ הזיכרון עבור lmkd . מכיוון שצגי PSI דורשים תמיכה בליבה, הליבה חייבת לכלול את תיקוני ה-PSI האחורי ולהיות קומפילציה עם תמיכת PSI מופעלת ( CONFIG_PSI=y ).

חסרונות של מנהל התקן LMK בתוך הליבה

אנדרואיד מוציאה משימוש את מנהל ההתקן של LMK עקב מספר בעיות, כולל:

  • התקני RAM נמוך היו צריכים להיות מכוונים בצורה אגרסיבית, וגם אז היו ביצועים גרועים בעומסי עבודה עם קבצים פעילים בגיבוי קבצים. הביצועים הגרועים הביאו לחבטות וללא הרג.
  • מנהל ההתקן של ליבת LMK הסתמך על מגבלות זיכרון פנוי, ללא שינוי קנה מידה המבוסס על לחץ הזיכרון.
  • בגלל קשיחות העיצוב, לעתים קרובות שותפים התאימו את הדרייבר כך שיעבוד על המכשירים שלהם.
  • נהג ה-LMK התחבר לממשק ה-API של מכווץ לוחות, שלא תוכנן לפעולות כבדות כמו חיפוש מטרות והרג שלהן, מה שהאט את תהליך vmscan .

מרחב משתמש lmkd

ה-userspace lmkd מיישם את אותה פונקציונליות כמו מנהל ההתקן בתוך הליבה אך משתמש במנגנוני הליבה הקיימים כדי לזהות ולהעריך את לחץ הזיכרון. מנגנונים כאלה כוללים שימוש באירועי vmpressure שנוצרו על ידי ליבה או צגי מידע על עיכוב לחץ (PSI) כדי לקבל הודעות על רמות לחץ זיכרון, ושימוש בתכונות cgroup של זיכרון כדי להגביל את משאבי הזיכרון המוקצים לכל תהליך בהתבסס על חשיבות התהליך.

שימוש ב-userspace lmkd באנדרואיד 10

באנדרואיד 9 ואילך, userspace lmkd מופעל אם לא זוהה מנהל התקן LMK בתוך הליבה. מכיוון ש-userspace lmkd דורש תמיכת ליבה עבור קבוצות cgroups של זיכרון, על הקרנל להיות קומפילד עם הגדרות התצורה הבאות:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

אסטרטגיות להרוג

Userspace lmkd תומך באסטרטגיות הרג המבוססות על אירועי vmpressure או צגי PSI, חומרתם ורמזים אחרים כגון שימוש בהחלפה. אסטרטגיות הריגה שונות בין מכשירים בעלי זיכרון נמוך לבעלי ביצועים גבוהים:

  • במכשירים בעלי זיכרון נמוך, המערכת אמורה לסבול לחץ זיכרון גבוה יותר כמצב פעולה רגיל.
  • במכשירים בעלי ביצועים גבוהים, יש לראות את לחץ הזיכרון כמצב לא נורמלי ולתקן אותו לפני שהוא משפיע על הביצועים הכוללים.

אתה יכול להגדיר את אסטרטגיית ההרוג באמצעות המאפיין ro.config.low_ram . לפרטים, ראה תצורת RAM נמוך .

Userspace lmkd תומך גם במצב מדור קודם שבו הוא מקבל החלטות להרוג באמצעות אותן אסטרטגיות כמו מנהל ההתקן של LMK בתוך הליבה (כלומר, זיכרון פנוי וספי מטמון קבצים). כדי להפעיל מצב מדור קודם, הגדר את המאפיין ro.lmk.use_minfree_levels ל- true .

הגדרת lmkd

הגדר lmkd עבור התקן ספציפי באמצעות המאפיינים הבאים.

תכונה להשתמש בְּרִירַת מֶחדָל
ro.config.low_ram ציין אם ההתקן הוא התקן בעל זיכרון RAM נמוך או בעל ביצועים גבוהים. false
ro.lmk.use_psi השתמש בצגי PSI (במקום אירועי vmpressure ). true
ro.lmk.use_minfree_levels השתמש בספי זיכרון פנוי ומטמון קבצים לקבלת החלטות הרג תהליך (כלומר, התאמה לפונקציונליות של מנהל ההתקן של LMK בתוך הליבה). false
ro.lmk.low ציון oom_adj המינימלי עבור תהליכים שמתאימים להיהרג ברמת vmpressure נמוכה. 1001
(נָכֶה)
ro.lmk.medium ציון oom_adj המינימלי עבור תהליכים שמתאימים להרוג ברמת vmpressure בינונית. 800
(שירותים שמור או לא חיוניים)
ro.lmk.critical ציון oom_adj המינימלי עבור תהליכים שמתאימים להרוג ברמת vmpressure קריטית. 0
(כל תהליך)
ro.lmk.critical_upgrade אפשר שדרוג לרמה קריטית. false
ro.lmk.upgrade_pressure ה- mem_pressure המקסימלי שבו הרמה משודרגת בגלל שהמערכת מחליפה יותר מדי. 100
(נָכֶה)
ro.lmk.downgrade_pressure ה- mem_pressure המינימלי שבו מתעלמים מאירוע vmpressure מכיוון שעדיין זמין מספיק זיכרון פנוי. 100
(נָכֶה)
ro.lmk.kill_heaviest_task הרוג את המשימה הכשירה הכבדה ביותר (ההחלטה הטובה ביותר) לעומת כל משימה כשירה (החלטה מהירה). true
ro.lmk.kill_timeout_ms משך באלפיות שניות לאחר הרג כאשר לא ייעשה הרג נוסף. 0
(נָכֶה)
ro.lmk.debug אפשר יומני ניפוי באגים lmkd . false

תצורת מכשיר לדוגמה:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.lmk.low=1001 \
    ro.lmk.medium=800 \
    ro.lmk.critical=0 \
    ro.lmk.critical_upgrade=false \
    ro.lmk.upgrade_pressure=100 \
    ro.lmk.downgrade_pressure=100 \
    ro.lmk.kill_heaviest_task=true

Userspace lmkd באנדרואיד 11

אנדרואיד 11 משפר את lmkd על ידי הצגת אסטרטגיית הרג חדשה. אסטרטגיית ההרג משתמשת במנגנון PSI לזיהוי לחץ זיכרון שהוצג באנדרואיד 10. lmkd באנדרואיד 11 אחראית לרמות השימוש במשאבי הזיכרון ולחבוט כדי למנוע הרעבה בזיכרון והדרדרות ביצועים. אסטרטגיית הרג זו מחליפה אסטרטגיות קודמות וניתן להשתמש בה במכשירים בעלי ביצועים גבוהים ועם זיכרון RAM נמוך (Android Go).

דרישות הליבה

עבור מכשירי אנדרואיד 11, lmkd דורש את תכונות הליבה הבאות:

  • כלול תיקוני PSI ואפשר PSI (יציאות אחוריות זמינות בקרנלים נפוצים של אנדרואיד 4.9, 4.14 ו-4.19).
  • כלול תיקוני תמיכה ב-PIDFD (יציאות אחוריות זמינות בקרנלים נפוצים של אנדרואיד 4.9, 4.14 ו-4.19).
  • עבור התקני RAM נמוך, כלול קבוצות זיכרון cgroups.

על הקרנל להיות קומפילד עם הגדרות התצורה הבאות:

CONFIG_PSI=y

הגדרת lmkd באנדרואיד 11

אסטרטגיית הריגת הזיכרון באנדרואיד 11 תומכת בכפתורי הכוונון ובברירות המחדל המפורטות להלן. תכונות אלה פועלות הן על התקני ביצועים גבוהים והן על התקני RAM נמוך.

תכונה להשתמש בְּרִירַת מֶחדָל
ביצועים גבוהים זיכרון RAM נמוך
ro.lmk.psi_partial_stall_ms סף הפסקת ה-PSI החלקי, באלפיות שניות, להפעלת התראה על זיכרון נמוך. אם המכשיר מקבל התראות על לחץ זיכרון מאוחר מדי, הקטן ערך זה כדי להפעיל התראות קודמות. אם התראות על לחץ זיכרון מופעלות שלא לצורך, הגדל ערך זה כדי להפוך את המכשיר לפחות רגיש לרעש. 70 200
ro.lmk.psi_complete_stall_ms סף ההשבתה המלא של PSI, באלפיות שניות, להפעלת התראות זיכרון קריטיות. אם המכשיר מקבל התראות על לחץ זיכרון קריטי מאוחר מדי, הקטן ערך זה כדי להפעיל התראות קודמות. אם התראות על לחץ זיכרון קריטי מופעלות שלא לצורך, הגדל ערך זה כדי להפוך את המכשיר לפחות רגיש לרעש. 700
ro.lmk.thrashing_limit הכמות המקסימלית של תקלות חוזרות של ערכת עבודה כאחוז מסך גודל ה-pagecache המגובה בקובץ. הגדרות חוזרות של ערכות עבודה מעל ערך זה אומרות שהמערכת נחשבת למחיקה של ה-pagecache שלה. אם הביצועים של המכשיר מושפעים במהלך לחץ זיכרון, הקטינו את הערך כדי להגביל את ה-thashing. אם הביצועים של המכשיר נהרגו שלא לצורך מסיבות חבטה, הגדל את הערך כדי לאפשר חבטה נוספת. 100 30
ro.lmk.thrashing_limit_decay דעיכת סף החבטה מתבטאת כאחוז מהסף המקורי ששימש להורדת הסף כאשר המערכת לא מתאוששת, גם לאחר הרג. אם חבטות מתמשכות מייצרות הרג מיותר, הקטינו את הערך. אם התגובה לחבטות מתמשכות לאחר הרג איטית מדי, הגדל את הערך. 10 50
ro.lmk.swap_util_max הכמות המקסימלית של זיכרון שהוחלף כאחוז מסך הזיכרון שניתן להחלפה. כאשר הזיכרון המוחלף גדל מעל הגבול הזה, זה אומר שהמערכת החליפה את רוב הזיכרון הניתן להחלפה ועדיין נמצאת בלחץ. זה יכול לקרות כאשר הקצאות שאינן ניתנות להחלפה יוצרות לחץ זיכרון אשר לא ניתן לשחרור על ידי החלפה מכיוון שרוב הזיכרון שניתן להחלפה כבר הוחלף. ערך ברירת המחדל הוא 100, מה שמבטל למעשה את הבדיקה הזו. אם הביצועים של המכשיר מושפעים במהלך לחץ הזיכרון בזמן שניצול ההחלפה גבוה ורמת ההחלפה החופשית לא יורדת ל- ro.lmk.swap_free_low_percentage , הורד את הערך כדי להגביל את ניצול ההחלפה. 100 100

כפתורי הכוונון הישנים הבאים עובדים גם עם אסטרטגיית ההרג החדשה.

תכונה להשתמש בְּרִירַת מֶחדָל
ביצועים גבוהים זיכרון RAM נמוך
ro.lmk.swap_free_low_percentage רמת ההחלפה החופשית כאחוז מסך שטח ההחלפה. `lmkd` משתמש בערך זה כסף למתי להתייחס למערכת כשטח החלפה מורעב. אם `lmkd` הורג בזמן שיש יותר מדי מקום בהחלפה, הקטן את האחוז. אם הריגות `lmkd` מתרחשות מאוחר מדי, מתן אפשרות להרג OOM להתרחש, הגדל את האחוז. 20 10
ro.lmk.debug זה מאפשר יומני ניפוי באגים של `lmkd`. אפשר ניפוי באגים בזמן כוונון. false