Android Native 之 lmkd進程和kernel kswapd的關聯

lwkd進程屬于native層啟動的一個守護進程,他的作用貫穿android世界的始終。他的另外一個大家都屬于的名字lowmemorykiller。

根據readme的介紹lmkd是用來對android系統內存檢查的守護進程,它通過終止不重要的進程來達到系統穩定運行的狀態。在Linux Kernel 4.12之前是這項任務是放在了kernel進行管理,在Linux Kernel 4.12之后移到了native層中,因為在kernel進程管理中直接干掉某個應用進程太過暴力。

后面介紹了我們可以通過一些屬性的值來控制lmkd進程的效果,如下:

  • ro.config.low_ram: choose between low-memory vs high-performance device. Default = false.

  • ro.lmk.use_minfree_levels: use free memory and file cache thresholds for making decisions when to kill. This mode works the same way kernel lowmemorykiller driver used to work. Default = false

  • ro.lmk.low: min oom_adj score for processes eligible to be killed at low vmpressure level. Default = 1001 (disabled)

  • ro.lmk.medium: min oom_adj score for processes eligible to be killed at medium vmpressure level. Default = 800 (non-essential processes)

  • ro.lmk.critical: min oom_adj score for processes eligible to be killed at critical vmpressure level. Default = 0 (all processes)

  • ro.lmk.critical_upgrade: enables upgrade to critical level. Default = false

  • ro.lmk.upgrade_pressure: max mem_pressure at which level will be upgraded because system is swapping too much. Default = 100 (disabled)

  • ro.lmk.downgrade_pressure: min mem_pressure at which vmpressure event will be ignored because enough free memory is still available. Default = 100 (disabled)

  • ro.lmk.kill_heaviest_task: kill heaviest eligible task (best decision) vs. any eligible task (fast decision). Default = false

  • ro.lmk.kill_timeout_ms: duration in ms after a kill when no additional kill will be done. Default = 0 (disabled)

  • ro.lmk.debug: enable lmkd debug logs, Default = false

  • ro.lmk.swap_free_low_percentage: level of free swap as a percentage of the total swap space used as a threshold to consider the system as swap space starved. Default for low-RAM devices = 10, for high-end devices = 20

  • ro.lmk.thrashing_limit: number of workingset refaults as a percentage of the file-backed pagecache size used as a threshold to consider system thrashing its pagecache. Default for low-RAM devices = 30, for high-end devices = 100

  • ro.lmk.thrashing_limit_decay: thrashing threshold decay expressed as a percentage of the original threshold used to lower the threshold when system does not recover even after a kill. Default for low-RAM devices = 50, for high-end devices = 10

  • ro.lmk.psi_partial_stall_ms: partial PSI stall threshold in milliseconds for triggering low memory notification. Default for low-RAM devices = 200, for high-end devices = 70

  • ro.lmk.psi_complete_stall_ms: complete PSI stall threshold in milliseconds for triggering critical memory notification. Default = 700

lmkd will set the following Android properties according to current system configurations:

  • sys.lmk.minfree_levels: minfree:oom_adj_score pairs, delimited by comma

  • sys.lmk.reportkills: whether or not it supports reporting process kills to clients. Test app should check this property before testing low memory kill notification. Default will be unset.

一、LMKD源碼分析

1、LMKD進程的啟動

1.1 三種啟動方式

同其他native進程一致,他的啟動還是通過init rc機制來啟動。如下代碼

總結如下:

  • 標記為core類的服務會在init.rcon early-initon init階段被啟動,未顯式設置disabled屬性時,core類服務會隨init進程初始化自動啟動。PS:在core進行啟動是為了防止核心服務沒有啟動導致系統異常
  • 監聽sys.boot_completed開機屬性然后傳遞--reinit參數進行完整啟動。PS:從后文可以了解到reinit會去讀取一系列相關屬性,即這是完整啟動
  • 最后監聽屬性變更,傳遞--reinit參數,應該是做成不需要重啟系統就能夠動態生效這些參數的效果

1.2 主函數三部曲

二、Kernel?kswapd線程分析

kernel_platform/msm-kernel/mm/page_alloc.c?是 Linux 內核中負責?物理頁幀分配與管理?的核心實現文件,主要功能如下:

一、核心功能

  1. ?伙伴系統(Buddy System)?

    • 實現alloc_pages()/free_pages()等接口,通過2^n階頁塊管理物理內存13
    • 處理內存碎片合并與拆分(如__free_one_page()函數)3
  2. ?頁分配策略?

    • 控制GFP標志(GFP_KERNEL/GFP_ATOMIC等)的分配行為14
    • 實現水位線(WMARK_MIN/WMARK_LOW)和內存回收觸發邏輯3
  3. ?NUMA架構支持?

    • 多節點內存分配(__alloc_pages_nodemask()

二、關鍵代碼結構

函數/宏功能說明
__alloc_pages_nodemask分配頁幀的核心邏輯(含慢速路徑/快速路徑)3
get_page_from_freelist從空閑列表獲取可用頁幀3
zone_watermark_ok檢查內存水位是否滿足分配需求3
__free_pages_ok釋放頁幀到伙伴系統3

三、與lmkd的關聯

lmkd觸發內存回收時,最終會通過該文件中的分配器獲取/釋放物理頁幀24。例如:

  • GFP_KERNEL分配可能觸發直接內存回收(__perform_reclaim
  • 低內存時通過__alloc_pages_slowpath進入回收流程3

注:該文件是內存管理子系統(MM)的核心組件,代碼路徑通常為/mm/page_alloc.c,MSM內核版本會包含高通平臺的特定優化13。

__setup_per_zone_wmarks這個函數是干什么的?

__setup_per_zone_wmarks是Linux內核中用于初始化內存管理區(zone)水位線(watermark)的關鍵函數,其核心功能如下:

一、核心作用

  1. ?計算并設置三檔水位值?

    • 根據min_free_kbytes全局參數,為每個zone動態計算WMARK_MIN(最低警戒線)、WMARK_LOW(kswapd喚醒線)、WMARK_HIGH(kswapd休眠線)14
    • 默認比例關系:LOW = MIN * 5/4HIGH = MIN * 3/246
  2. ?NUMA架構適配?

    • 針對不同內存節點(node)的zone獨立計算水位,考慮局部內存特性

二、水位線的作用機制

水位等級觸發行為
?WMARK_HIGH?內存充足,kswapd線程進入休眠狀態69
?WMARK_LOW?空閑內存低于此值,喚醒kswapd進行異步回收57
?WMARK_MIN?觸發直接內存回收(direct reclaim),可能阻塞進程分配請求

三、典型調用流程

  1. 系統啟動時通過init_per_zone_wmark_min()調用該函數4
  2. 根據公式計算每個zone的min_free_kbytes分攤值:zonemin=min_free_kbytes×zonesizetotal_non_highmem_pageszonemin?=total_non_highmem_pagesmin_free_kbytes×zonesize??再基于此值推導其他水位

四、相關代碼邏輯

// mm/page_alloc.c static void __setup_per_zone_wmarks(void) { // 計算各zone的min水位 for_each_zone(zone) { zone->watermark[WMARK_MIN] = calc_min_watermark(zone); // 推導low/high水位 zone->watermark[WMARK_LOW] = min_wmark_pages(zone) + (tmp >> 2); zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) + (tmp >> 1); } }

該函數是內存分配器(如get_page_from_freelist)判斷是否觸發回收的核心依據

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83097.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83097.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【生活】程序員防猝si指南

note 一、定期體檢二、均衡飲食,多食用對心臟有保護作用的食物三、每周運動四、減壓五、保證睡眠六、戒煙限酒7、控制血壓8、警惕流感攻擊心臟9、關注牙齒健康10、不要抵觸吃藥 文章目錄 note一、定期體檢二、均衡飲食,多食用對心臟有保護作用的食物三、…

245. 2019年藍橋杯國賽 - 數正方形(困難)- 遞推

245. 數正方形(困難) 2019年藍橋杯國賽 - 數正方形(困難) 標簽:2019 國賽 遞推 題目描述 在一個 N N N N N N 的點陣上,取其中 4 個點恰好組成一個正方形的 4 個頂點,一共有多少種不同的取…

代碼隨想錄刷題day30

1、零錢兌換II 給你一個整數數組 coins 表示不同面額的硬幣,另給一個整數 amount 表示總金額。 請你計算并返回可以湊成總金額的硬幣組合數。如果任何硬幣組合都無法湊出總金額,返回 0 。 假設每一種面額的硬幣有無限個。 題目數據保證結果符合 32 位帶…

SpringBoot EhCache 緩存

一、EhCache核心原理 層級存儲 堆內緩存(Heap):高速訪問,受JVM內存限制堆外緩存(Off-Heap):突破JVM堆大小限制(直接內存)磁盤存儲(Disk)&#xff…

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的選項之一, 并非唯一 1 先厘清概念 點說明authenticationMethodURLAuthenticationChallenge.protectionS…

盤古信息PCB行業解決方案:以全域場景重構,激活智造新未來

一、破局:PCB行業的時代之問 在數字經濟蓬勃發展的浪潮中,PCB(印制電路板)作為 “電子產品之母”,其重要性愈發凸顯。隨著 5G、人工智能等新興技術的加速滲透,PCB行業面臨著前所未有的挑戰與機遇。產品迭代…

數據通信與計算機網絡——數據與信號

主要內容 模擬與數字 周期模擬信號 數字信號 傳輸減損 數據速率限制 性能 注:數據必須被轉換成電磁信號才能進行傳輸。 一、模擬與數字 數據以及表示數據的信號可以使用模擬或者數字的形式。數據可以是模擬的也可以是數字的,模擬數據是連續的采用…

循環語句之while

While語句包括一個循環條件和一段代碼塊&#xff0c;只要條件為真&#xff0c;就不斷 循環執行代碼塊。 1 2 3 while (條件) { 語句 ; } var i 0; while (i < 100) {console.log(i 當前為&#xff1a; i); i i 1; } 下面的例子是一個無限循環&#xff0c;因…

藍橋杯第十屆國B 質數拆分

題目描述 本題為填空題&#xff0c;只需要算出結果后&#xff0c;在代碼中使用輸出語句將所填結果輸出即可。 將 2019 拆分為若干個兩兩不同的質數之和&#xff0c;一共有多少種不同的方法&#xff1f; 注意交換順序視為同一種方法&#xff0c;例如 220172019 與 201722019 …

曼昆《經濟學原理》第九版 第十二章稅收制度的設計

一、稅收基本概念 稅收分類&#xff1a; 比例稅&#xff1a;稅率不隨稅基變化&#xff08;如部分增值稅&#xff09;累進稅&#xff1a;稅率隨稅基增加而上升&#xff08;如個人所得稅&#xff09;累退稅&#xff1a;稅率隨稅基增加而下降&#xff08;如社會保險稅上限&#…

在Spring Boot中集成RabbitMQ的完整指南

前言 在現代微服務架構中&#xff0c;消息隊列&#xff08;Message Queue&#xff09;是實現異步通信、解耦系統組件的重要工具。RabbitMQ 是一個流行的消息中間件&#xff0c;支持多種消息協議&#xff0c;具有高可靠性和可擴展性。 本博客將詳細介紹如何在 Spring Boot 項目…

IDC智能機房整體解決方案

該文檔為 IDC 智能機房整體解決方案,目標是實現機房智能化、可視化、遠程化管理,提升運維效率與客戶服務能力。方案涵蓋物理安全智能化(智能電子鎖,支持遠程控制、權限管理及離線 / 在線授權,兼容 1-3mm 門板厚度等)、監控智能化(人員定位、攝像頭、機柜溫濕度監控、能耗…

Kafka入門-集群基礎環境搭建(JDK/Hadoop 部署 + 虛擬機配置 + SSH 免密+Kafka安裝啟動)

Kafka 簡介 傳統定義&#xff1a;Kafka是一個分布式的基于發布/訂閱模式的消息隊列&#xff0c;應用于大數據實時處理領域。 Kafka最新定義&#xff1a;Apache Kafka是一個開源分布式事件流平臺&#xff0c;被數千家公司用于高性能數據管道、流分析、數據集成和關鍵任務應用…

【仿生機器人】建模—— 圖生3D 的幾個辦法

兩件事&#xff01; 第一件&#xff1a; 強如 Gemini&#xff0c;在多模態和三維空間的理解中&#xff0c;如果不微調去做下游應用&#xff0c;直接 Zero-shot 的 效果是很差的 好處是有多視角圖生3D&#xff0c;效果還可以&#xff0c;但是也沒有很精細&#xff0c;&#xf…

簡約商務通用宣傳年終總結12套PPT模版分享

IOS風格企業宣傳PPT模版&#xff0c;年終工作總結PPT模版&#xff0c;簡約精致扁平化商務通用動畫PPT模版&#xff0c;素雅商務PPT模版 簡約商務通用宣傳年終總結12套PPT模版分享:商務通用年終總結類PPT模版https://pan.quark.cn/s/ece1e252d7df

modelscope下載gguf格式模型

modelscope下載gguf格式模型 ollama加載模型 模型地址 https://www.modelscope.cn/models/okwinds/CompassJudger-1-7B-Instruct-GGUF-V3-LOT pip install modelscope modelscope download --modelokwinds/CompassJudger-1-7B-Instruct-GGUF-V3-LOT --include "CompassJ…

關于uniapp展示PDF的解決方案

在 UniApp 的 H5 環境中使用 pdf-vue3 組件可以實現完整的 PDF 預覽功能。以下是詳細實現步驟和注意事項&#xff1a; 一、安裝依賴 安裝 pdf-vue3 和 PDF.js 核心庫&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…

解決Excel詞典(xllex.dll)文件丟失或損壞問題的終極指南:從基礎到高級修復技巧

在日常使用Microsoft Excel的過程中&#xff0c;許多用戶可能會遇到一個令人沮喪的問題&#xff1a;Excel詞典文件xllex.dll丟失或損壞。這不僅會影響到Excel的正常功能&#xff0c;還可能導致數據處理效率的降低。在這篇文章中&#xff0c;我們將深入探討這一問題的原因&#…

Linux中《基礎IO》詳細介紹

目錄 理解"文件"狹義理解廣義理解文件操作的歸類認知系統角度文件類別 回顧C文件接口打開文件寫文件讀文件稍作修改&#xff0c;實現簡單cat命令 輸出信息到顯示器&#xff0c;你有哪些方法stdin & stdout & stderr打開文件的方式 系統?件I/O?種傳遞標志位…

第11篇:數據庫中間件系統可配置化設計與動態規則加載機制

11.1 引言&#xff1a;為什么需要可配置化&#xff1f; 數據庫中間件在企業級環境中往往需要支持多租戶、多業務場景、多數據庫后端&#xff0c;因此固定邏輯會迅速過時或僵化。 為了提升 靈活性、可擴展性、部署效率&#xff0c;中間件系統亟需實現&#xff1a; ? 高度可配置…