低內存殺手守護進程

在Android低存儲器殺手守護進程( lmkd )過程監視器通過殺死至少必需的處理的運行Android系統並反應高內存壓力的存儲狀態,以保持系統中執行在可接受的水平。

關於內存壓力

並行運行多個進程的 Android 系統可能會遇到系統內存耗盡且需要更多內存的進程會出現明顯延遲的情況。存儲器的壓力,其中,所述系統運行於存儲器短的狀態下,需要使用Android到自由存儲器(以減輕壓力)通過節流或殺死不重要過程,請求流程,以游離的非關鍵緩存資源,等等。

從歷史上看,Android 使用內核內低內存殺手 (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 驅動程序的缺點

由於許多問題,Android 棄用了 LMK 驅動程序,包括:

  • 必須積極調整低 RAM 設備,即使這樣,在具有大型文件支持的活動頁面緩存的工作負載上也會表現不佳。糟糕的表現導致了慘敗,沒有殺戮。
  • LMK 內核驅動程序依賴於可用內存限制,不會根據內存壓力進行縮放。
  • 由於設計的剛性,合作夥伴經常定制驅動程序,以便它可以在他們的設備上運行。
  • 勾搭成板坯收縮機API,它不是為重操作,如搜索目標,並殺死它們,從而減緩了該LMK司機vmscan過程。

用戶空間 lmkd

用戶空間lmkd實現了相同的功能內核中的驅動程序,但現有的內核的機制的用途來檢測和估計存儲器的壓力。這些機制包括使用內核產生vmpressure事件或壓力停滯信息(PSI)監視器,以獲取有關內存的壓力水平的通知,並使用內存的cgroup功能限制分配給基於進程的重要性每個進程的內存資源。

在 Android 10 中使用用戶空間 lmkd

在Android中9和更高版本,用戶空間lmkd激活如果沒有檢測一個內核LMK驅動程序。由於用戶空間lmkd需要內存cgroup的內核支持,內核必須具有以下配置設置來編譯:

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 中的用戶空間 lmkd

Android的11提高了lmkd通過引入新的戰略殺害。殺策略使用在Android的10引入了內存壓力檢測PSI機制lmkd在Android的11佔內存資源利用水平和顛簸,以防止內存不足和性能下降。這種查殺策略取代了以前的策略,可以在高性能和低內存(Android Go)設備上使用。

內核要求

對於Android的11台設備, lmkd需要以下內核功能:

  • 包括 PSI 補丁並啟用 PSI(Android 通用內核 4.9、4.14 和 4.19 中提供的反向移植)。
  • 包括 PIDFD 支持補丁(Android 通用內核 4.9、4.14 和 4.19 中提供的反向移植)。
  • 對於低 RAM 設備,包括內存 cgroup。

必須使用以下配置設置編譯內核:

CONFIG_PSI=y

在 Android 11 中配置 lmkd

Android 11 中的內存殺戮策略支持下面列出的調整旋鈕和默認值。這些功能適用於高性能和低 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

以下舊的調整旋鈕也適用於新的殺戮策略。

財產利用默認
高性能低內存
ro.lmk.swap_free_low_percentage空閒交換級別佔總交換空間的百分比。 `lmkd` 將此值用作何時將系統視為交換空間不足的閾值。如果 `lmkd` 在交換空間過多時終止,請降低百分比。如果 lmkd 殺戮發生得太晚,允許 OOM 殺戮發生,增加百分比。 20 10
ro.lmk.debug這將啟用“lmkd”調試日誌。調整時啟用調試。 false