記憶體不足終止 Daemon

Android 記憶體不足終止 Daemon (lmkd) 程序會監控記憶體 運作中的 Android 系統狀態,並透過終止 至少要維持系統運行狀態所需的最低程序 級別。

關於記憶體壓力

同時執行多個程序的 Android 系統可能會發生 當系統記憶體耗盡,或是程序需要 就會出現明顯的延遲記憶體壓力,如果 系統的記憶體不足,需要 Android 釋放記憶體 (以減少記憶體用量) 來緩解壓力) 範圍 釋出非關鍵快取資源等等。

Android 過去使用核心來監控系統記憶體壓力 記憶體不足終止工具 (LMK) 驅動程式,採用硬式編碼的固定機制 輕鬆分配獎金自核心 4.12 起,LMK 驅動程式會從上游中移除 核心和使用者空間 lmkd 會執行記憶體監控和程序終止 機器學習程式庫提供一系列預先編寫的程式碼 可用來執行機器學習工作

壓力減壓資訊

Android 10 以上版本支援新的 lmkd 模式, 使用核心壓力穩定器資訊 (PSI) 監視器來預測記憶體壓力 偵測。上游核心中的 PSI 修補程式集 (已向後移植至 4.9 和 4.14) 核心) 測量因為 記憶體不足的情況這些延遲狀況會直接影響使用者體驗 ,這個指標很方便地判斷記憶體壓力嚴重性。 上游核心還包括允許具有特殊權限的使用者空間的 PSI 監控器 指定處理程序 (例如 lmkd) 的門檻, 在違反門檻時訂閱核心中的事件。

PSI 監控與 VM 壓力信號

因為 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 核心驅動程式確實設有免費記憶體限制,且沒有使用資源調度功能 以免影響記憶體壓力
  • 基於設計的彈性,合作夥伴通常會自訂驅動程式 以便在使用者的裝置上運作
  • LMK 驅動程式掛接到 Slab 縮減器 API 專為高強度操作而設計,例如搜尋目標或殺害 進而拖慢 vmscan 程序的速度。

使用者空間標記

使用者空間 lmkd 實作的功能與核心驅動程式相同 但會利用現有的核心機制來偵測和預估記憶體壓力。這些 機制包括使用核心產生的 vmpressure 事件或壓力停滯 以便取得有關記憶體壓力等級的通知。 並使用記憶體 Cgroup 功能,限制分配給各個 決定程序的優先順序

在 Android 10 中使用使用者空間 lmkd

在 Android 9 以上版本中,lmkd 會在 未偵測到核心 LMK 驅動程式。因為使用者空間「lmkd」 需要記憶體 cgroups 的核心支援,核心必須使用 以下配置設定:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

終止策略

使用者空間 lmkd 支援以 vmpressure 事件或 PSI 為基礎的終止策略 監控器、其嚴重性和其他提示,例如交換使用率殺手 低記憶體和高效能裝置的策略有所不同:

  • 在低記憶體裝置上,系統應容許 較高的記憶體壓力, 一般作業模式
  • 在高效能裝置上,應將記憶體壓力視為異常 並在情況影響整體成效前進行修正

您可以使用 ro.config.low_ram 屬性設定終止策略。適用對象 詳細資料,請參閱 Low 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 vmpressure 的最低mem_pressure 由於可用記憶體仍足夠,因此系統會忽略事件。 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) 裝置

核心需求

如果是 Android 11 裝置,lmkd 需要下列核心功能:

  • 包含 PSI 修補程式並啟用 PSI (可在 Android 常用核心 4.9、4.14 和 4.19)。
  • 包含 PIDFD 支援修補程式 (Android 通用的向後移植項目) 核心 4.9、4.14 和 4.19)。
  • 如果是低 RAM 裝置,請加入記憶體 Cgroups。

核心必須採用下列設定進行編譯:

CONFIG_PSI=y

在 Android 11 中設定 lmkd

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 工作組錯誤數量上限佔總配額的百分比 檔案支援的網頁快取大小。如果工作組錯誤超過這個值,代表 系統判定此類網頁遭到輾轉。如果 裝置效能在記憶體壓力期間受到影響, 來限制輾轉現象。如果裝置效能遭終止 如果不是以輾轉難眠情況,不妨提高價值來達成更多 輾轉現象。 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