一、lmkd/README.md


Android 低內存殺手守護進程

=================================

簡介
------------

Android 低內存殺手守護進程 (lmkd) 是一個監控運行中的 Android 系統內存狀態的進程,它會在內存壓力過高時通過終止一些非必要進程來維持系統性能在可接受的範圍內。

背景
----------

在 Android 系統中,內存監控和終止非必要進程的任務通常由內核的 lowmemorykiller 驅動程序負責。

自 Linux 內核 4.12 版本起,lowmemorykiller 驅動程序已被移除,取而代之的是用户空間的 lmkd 守護進程來執行這些任務。

Android 屬性
------------------

可以使用以下 Android 屬性在特定系統上配置 lmkd:

ro.config.low_ram:選擇低內存或高性能設備。默認值 = false。

ro.lmk.use_minfree_levels:使用空閒內存和文件緩存閾值來決定何時終止進程。此模式的工作方式與內核 lowmemorykiller 驅動程序的工作方式相同。默認值 = false。實際工程配為true.

ro.lmk.low:低 vmpressure 級別下可終止進程的最小 oom_adj 分數。默認值 = 1001(禁用)。實際工程配為空

ro.lmk.medium:中等 vmpressure 級別下可終止進程的最小 oom_adj 分數。默認值 = 800(非必要進程)。實際工程配為空

ro.lmk.critical:臨界 vmpressure 級別下可終止進程的最小 oom_adj 分數。默認值 = 0(所有進程)。

ro.lmk.critical_upgrade:啓用升級到關鍵級別。默認值 = false

ro.lmk.upgrade_pressure:最大內存壓力,超過此值系統交換過多時將升級到更高級別。默認值 = 100(禁用)

ro.lmk.downgrade_pressure:最小內存壓力,超過此值系統仍有足夠的可用內存時將忽略 vmpressure 事件。默認值 = 100(禁用)

ro.lmk.kill_heaviest_task:終止最耗資源的符合條件的任務(最佳決策)還是終止任何符合條件的任務(快速決策)。默認值 = false. 實際工程配為true.

ro.lmk.kill_timeout_ms:終止任務後不再執行其他終止操作的超時時間(毫秒)。默認值 = 0(禁用)。實際工程配為15.

ro.lmk.debug:啓用 lmkd 調試日誌,默認值 = false

ro.lmk.swap_free_low_percentage:可用交換空間佔總交換空間的百分比,用作判斷系統是否交換空間不足的閾值。低內存設備默認值為 10,高端設備默認值為 20。

ro.lmk.thrashing_limit:工作集故障次數佔文件級頁面緩存大小的百分比,用作判斷系統是否頻繁抖動頁面緩存的閾值。低內存設備默認值為 30,高端設備默認值為 100

ro.lmk.thrashing_limit_decay:抖動閾值衰減,以原始閾值的百分比表示,用於在系統即使在進程被終止後仍無法恢復時降低閾值。低內存設備的默認值為 50,高端設備的默認值為 10。

ro.lmk.psi_partial_stall_ms:觸發低內存通知的部分 PSI 停頓閾值(以毫秒為單位)。低內存設備的默認值為 200,高端設備的默認值為 70。

ro.lmk.psi_complete_stall_ms:觸發嚴重內存通知的完整 PSI 停頓閾值(以毫秒為單位)。默認值為 700。

lmkd 將根據當前系統配置設置以下 Android 屬性:

sys.lmk.minfree_levels:minfree:oom_adj_score 對,以逗號分隔。工程實際配置:

# getprop sys.lmk.minfree_levels
55296:0,69120:100,82944:200,96768:250,165888:900,241920:950

sys.lmk.reportkills:是否支持向客户端報告進程終止情況。測試應用在測試低內存強制終止通知之前應檢查此屬性。默認情況下,此屬性未設置。實際工程默認是1.