תהליך הדימון (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 |