תהליך אנדרואיד ה-low memory killer daemon ( lmkd
) עוקב אחר מצב הזיכרון של מערכת אנדרואיד פועלת ומגיב ללחץ זיכרון גבוה על ידי הרג התהליכים הפחות חיוניים כדי לשמור על ביצועי המערכת ברמות מקובלות.
לגבי לחץ זיכרון
מערכת אנדרואיד שמפעילה מספר תהליכים במקביל עלולה להיתקל במצבים שבהם זיכרון המערכת מוצק ותהליכים הדורשים יותר חווית זיכרון בעיכובים ניכרים. לחץ זיכרון , מצב שבו המערכת אוזלת בזיכרון, מחייב את אנדרואיד לפנות זיכרון (כדי להקל על הלחץ) על ידי צרור או הרג תהליכים לא חשובים, בקשה לתהליכים לשחרר משאבים לא קריטיים במטמון וכן הלאה.
מבחינה היסטורית, אנדרואיד ניטרה את לחץ הזיכרון של המערכת באמצעות דרייבר בתוך ליבה (LMK), מנגנון קשיח התלוי בערכים מקודדים. החל מגרעין 4.12, מנהל ההתקן של LMK מוסר מהקרנל במעלה הזרם ו- 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 נמוך היו צריכים להיות מכוונים בצורה אגרסיבית, וגם אז היו ביצועים גרועים בעומסי עבודה עם pagecache פעיל מגובה קבצים גדולים. הביצועים הגרועים הביאו לחבטות וללא הרג.
- מנהל ההתקן של ליבת LMK הסתמך על מגבלות זיכרון חופשי, ללא שינוי קנה מידה המבוסס על לחץ הזיכרון.
- בגלל קשיחות העיצוב, לעתים קרובות שותפים התאימו אישית את הדרייבר כך שהוא יעבוד על המכשירים שלהם.
- נהג ה-LMK התחבר לממשק ה-API של מכווץ לוחות, שלא תוכנן לפעולות כבדות כמו חיפוש מטרות והרג שלהן, מה שהאט את תהליך ה-
vmscan
.
מרחב משתמש lmkd
ה- lmkd
מיישם את אותה פונקציונליות כמו מנהל ההתקן בתוך הליבה אך משתמש במנגנוני הליבה הקיימים כדי לזהות ולהעריך את לחץ הזיכרון. מנגנונים כאלה כוללים שימוש באירועי vmpressure
שנוצרו על ידי ליבה או צגי מידע על עיכוב לחץ (PSI) כדי לקבל הודעות על רמות לחץ זיכרון, ושימוש בתכונות cgroup של זיכרון כדי להגביל את משאבי הזיכרון המוקצים לכל תהליך בהתבסס על חשיבות התהליך.
שימוש ב-userspace lmkd באנדרואיד 10
באנדרואיד 9 ואילך, lmkd
מופעל אם לא זוהה מנהל התקן LMK בתוך הליבה. מכיוון ש- 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 |