דימון (daemon) חסר זיכרון

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

מידע על לחץ על הזיכרון

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

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

מידע על עמדת הלחץ

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

מוניטורי PSI לעומת אותות vmpressure

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

שימוש בצגי PSI

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

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

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

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

מרחב משתמשים

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

שימוש במרחב המשתמשים (lmkd) ב-Android 10

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

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

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

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

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

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

מרחב המשתמשים 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

מרחב משתמשים מקומי ב-Android 11

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

דרישות ליבה (kernel)

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

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

צריך להדר את הליבה עם הגדרות התצורה הבאות:

CONFIG_PSI=y

הגדרת lmkd ב-Android 11

האסטרטגיה להרג הזיכרון ב-Android 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). אם שביצועי המכשיר יושפעו בזמן לחץ על הזיכרון, את הערך שיגביל את תעבורת הנתונים. אם ביצועי המכשיר נמחקים להגדיל את הערך כדי לאפשר יותר מדי אנרגיה, שלא לצורך רעשי רקע. 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