Android13 针对low memory killer内存调优

引入概念

在旧版本的安卓系统中,当触发lmk(low memory killer)的时候一般认为就是内存不足导致,但是随着安卓版本的增加lmk的判断标准已经不仅仅是内存剩余大小,io,cpu同样会做评判,从而保证设备性能。这里引入的概念就是psi(Pressure Stall Information)压力失速信息,用来检测内存压力,这样能够更全面的保证我们的内存性能,提高设备反应速度。

Android 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策略

内核中 LMK 驱动程序的缺点

由于存在大量问题,Android 弃用了 LMK 驱动程序,问题包括:

  • 对于低内存设备,必须主动进行调整,即便如此,在处理涉及支持大文件的活跃页面缓存的工作负载时,其性能也较差。性能不良会导致出现抖动,但不会终止。
  • LMK 内核驱动程序依赖于可用内存限制,不会根据内存压力进行扩缩。
  • 由于设计的严格性,合作伙伴通常会自定义该驱动程序,使其可以在自己的设备上使用。
  • LMK 驱动程序已挂接到 Slab Shrinker API,该 API 并非为了执行繁重操作(例如搜索并终止目标)而设计,这类操作会导致 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指定设备是低内存设备还是高性能设备。false
ro.lmk.use_psi使用 PSI 监视器(而不是 vmpressure 事件)。true
ro.lmk.use_minfree_levels使用可用内存和文件缓存阈值来做出进程终止决策(即与内核中的 LMK 驱动程序的功能一致)。false
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由于系统交换次数过多,将在该水平执行水平升级的 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

注意mem_pressure = 内存使用量/RAM_and_swap 使用量(以百分比的形式表示)。

设备配置示例:

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。该终止策略使用 PSI 机制来执行 Android 10 中引入的内存压力检测。Android 11 中的 lmkd 会根据内存资源使用情况和抖动来防止出现内存不足和性能下降。这一终止策略取代了以前的策略,可同时用于高性能设备和低内存 (Android Go) 设备。

内核要求

对于 Android 11 设备,lmkd 需要以下内核功能:

  • 添加 PSI 补丁程序并启用 PSI(Android 通用内核 4.9、4.14 和 4.19 中提供向后移植)。
  • 添加 PIDFD 支持补丁程序(Android 通用内核 4.9、4.14 和 4.19 中提供向后移植)。
  • 对于低内存设备,添加内存 cgroup。

必须使用以下配置设置编译内核:

CONFIG_PSI=y

在 Android 11 中配置 lmkd

Android 11 中的内存终止策略支持下面列出的调节旋钮和默认值。这些功能在高性能设备和低内存设备上都可使用。

属性使用默认
高性能低内存
ro.lmk.psi_partial_stall_ms部分 PSI 失速阈值(以毫秒为单位),用于触发内存不足通知。如果设备收到内存压力通知的时间太晚,可以降低此值以在较早的时间触发通知。如果在不必要的情况下触发了内存压力通知,请提高此值以降低设备对噪声的敏感度。70200
ro.lmk.psi_complete_stall_ms完全 PSI 失速阈值(以毫秒为单位),用于触发关键内存通知。如果设备收到关键内存压力通知的时间太晚,可以降低该值以在较早的时间触发通知。如果在不必要的情况下触发了关键内存压力通知,可以提高该值以降低设备对噪声的敏感度。700
ro.lmk.thrashing_limit工作集 refault 数量的上限,以占具有文件支持的页面缓存总大小的百分比表示。如果工作集 refault 的数量超过该值,则视为系统对其页面缓存造成抖动。如果设备性能在内存压力期间受到影响,请降低该值以限制抖动。如果因抖动原因而导致设备性能不必要地降低,请提高该值以允许更多抖动。10030
ro.lmk.thrashing_limit_decay抖动阈值衰减,以占在系统无法恢复时(甚至是终止后)用于降低阈值的原始阈值的百分比表示。如果持续抖动导致不必要的终止,请降低该值。如果终止后对持续抖动的响应速度过慢,请提高该值。1050
ro.lmk.swap_util_max最大交换内存量,以占可交换内存总量的百分比表示。如果交换的内存量超过此上限,则表示系统在交换了其大部分可交换内存后仍然存在压力。 当内存压力是由不可交换内存的分配导致时,就可能会发生这种情况,原因在于大部分可交换内存已经交换,所以无法通过交换来缓解这一压力。默认值为 100,这实际上会停用此检查。如果设备的性能在交换利用率较高且可用交换水平未降至 ro.lmk.swap_free_low_percentage 的内存压力期间受到影响,请降低该值以限制交换利用率。100100

以下旧的调节旋钮也可用于新的终止策略。

属性使用默认
高性能低内存
ro.lmk.swap_free_low_percentage可用交换水平,以占总交换空间的百分比表示。“lmkd”使用该值作为阈值来判断何时将系统视为交换空间不足。如果“lmkd”因交换空间过多而终止,请降低该百分比。如果“lmkd”终止得太晚,从而导致 OOM 终止,请提高该百分比。2010
ro.lmk.debug这会启用“lmkd”调试日志。在调节时启用调试。false

问题实例

客户做重启压测,发现重启过程中概率出现应用被杀情况。本次被杀应用为launcher,对应log如下:

02-04 11:02:19.762 D/lowmemorykiller(  440): critical pressure event triggered
02-04 11:02:19.763 D/lowmemorykiller(  440): nr_free_pages: 39252 nr_inactive_file: 216786 nr_active_file: 84889 workingset_refault: 0 pgscan_kswapd: 199494 pgscan_direct: 0 pgscan_direct_throttle: 0 init_pgscan_direct: 0 init_pgscan_kswapd: 0 base_file_lru: 0 init_ws_refault: 0 free_swap: 393151 total_swap: 393215 swap_free_percentage: 99%
02-04 11:02:19.763 D/lowmemorykiller(  440): pgskip deltas: DMA: -1DMA32: 0 Normal: 0 High: -1 Movable: 0
02-04 11:02:19.763 D/lowmemorykiller(  440): reclaim: 1 in_compaction : 0
02-04 11:02:19.763 E/lowmemorykiller(  440): zoneinfo_parse_node per-node stats not found in zone DMA32; moving to next zone
02-04 11:02:19.763 E/lowmemorykiller(  440): calc_zone_watermarks pgskip_deltas_val: 0 pgskip_deltas[PGSKIP_IDX(i++)]: 0
02-04 11:02:19.763 D/lowmemorykiller(  440): Zone: 0 nr_free_pages: 38701 min: 18432 low: 25249 high: 32066 present: 778880 nr_cma_free: 207 max_protection: 0
02-04 11:02:19.763 D/lowmemorykiller(  440): Zone: 1 nr_free_pages: 0 min: 0 low: 0 high: 0 present: 0 nr_cma_free: 0 max_protection: 0
02-04 11:02:19.763 D/lowmemorykiller(  440): Aggregate wmarks: min: 18432 low: 100996 high: 128264 (nr_free - nr_cma_free): 38494 wbf_effective: 4
02-04 11:02:19.763 D/lowmemorykiller(  440): smallest wmark breached: high free_pages: 38494 cached_pages_considered_free: 0 breached_wm_level: 128264
02-04 11:02:19.763 D/lowmemorykiller(  440): nr_free_pages: 38701 Cached: 301751 Unevictable: 1712 Shmem: 985 mlocked: 1711 SwapCached: 0 active_anon: 522 inactive_anon: 141235cma_free: 207
02-04 11:02:19.765 E/ThermalEngine( 2896): parse_cooling_devices: Added cooling device: pause-cpu7 with cdev id:13
02-04 11:02:19.766 I/lowmemorykiller(  440): Kill 'com.android.launcher3' (2671), uid 10091, oom_score_adj 100 to free 102928kB rss, 0kB swap; reason: critical pressure and device is low on memory
02-04 11:02:19.766 E/ThermalEngine( 2896): parse_cooling_devices: Added cooling device: ufs with cdev id:1
02-04 11:02:19.766 I/killinfo(  440): [2671,10091,100,50,102928,1,2726892,154804,1207004,0,9144,3940,6848,6844,1572860,1572604,2088,564940,339556,867144,87576,174144,26928,57000,0,0,828,0,23977,0,0,0,66404,0,0,0.180000,0.180000,6.140000,2.280000,23.650000]
 

通过log来看触发的是critical pressure event。

通过lmk源码排查如下:

system\memory\lmkd\lmkd.cpp

通过注释可以知道,这是因为内存回收太慢导致。这里控制是通过监听kernel里的epoll事件,然后做相关判断进行进程的kill,这里代表了内存失速,由于我们3g内存其实也并不是很宽裕,需要经常回收内存,通过killinfo我们可以看到psi最后一项达到了23.650000证明cpu压力很大,证明系统回收内存压力较大,我们通过修改

ro.lmk.psi_scrit_complete_stall_ms来延长反应时间增大到400ms,从而解决此问题,下一篇文章将会详细分解lmk相关代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/261473.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

挑战杯 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径,图像尺寸,数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

阿里巴巴中国站获得淘口令真实url API(1688.item_password)

阿里巴巴(1688.com)是一个B2B电商平台,而淘口令(或称为淘宝口令)是一种在阿里巴巴集团旗下的淘宝和天猫平台中分享商品或活动链接的特殊形式。淘口令通常包含一串字符,用户可以复制这串字符并在淘宝或天猫的…

YOLOv5代码解读[02] models/yolov5l.yaml文件解析

文章目录 YOLOv5代码解读[02] models/yolov5l.yaml文件解析yolov5l.yaml文件检测头1--->耦合头检测头2--->解耦头检测头3--->ASFF检测头Model类解析parse_model函数 YOLOv5代码解读[02] models/yolov5l.yaml文件解析 yolov5l.yaml文件 # YOLOv5 🚀 by Ult…

Maven 私服 Nexus3

一、Maven和Nexus3 简介 Maven是一个采用纯Java编写的开源项目管理工具,采用一种被称之为Project Object Model(POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中, 通过该文件Maven可以管理项目的整个生命周期,包括…

Unity xLua开发环境搭建与基础进阶

Unity是一款非常流行的游戏开发引擎,而xLua是一个为Unity开发者提供的Lua框架,可以让开发者使用Lua语言来进行游戏开发。在本文中,我们将介绍如何搭建Unity xLua开发环境,并进行基础进阶的学习。 环境搭建 首先,我们需…

华为算法题 go语言

1 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返…

Internet Download Manager 6.42.3 (IDM) 中文免激活绿色版

相信很多网友都遇到过一种情况,网页有些视频资源或者音频资源不知道如何下载,一直不知道如何解决,为此小编特意带来了这款:Internet Download Manager电脑版,这是一款非常专业且十分好用的下载工具,也就是大…

Mysql系列之命令行登录、连接工具登录、数据库表常用命令

登录与常用命令 连接工具登录命令行登录数据库1、查看数据库2、指定数据库3、查看当前数据库4、建库语句 数据表1、查看数据表2、查看表结构信息3、查看建表语句4、建表语句 连接工具登录 首先下载mysql连接工具,解压后直接打开软件,按以下步骤操作&…

单调栈总结以及Leetcode案例解读与复盘

单调栈总结以及Leetcode案例解读与复盘 一、单调栈是什么? 单调栈(monotonous stack)是指栈的内部从栈底到栈顶满足单调性的栈结构。 二、如何维护单调性 新元素入栈时,会与栈顶元素进行比较,使得栈始终保持单调性…

LInux-信号1

文章目录 前言一、信号是什么?二、学习步骤使用kill -l命令查看信号列表可以看到有那么多信号,那么进程是如何识别这么多信号的呢? 使用kill命令终止进程信号的捕捉kill函数raise函数abort函数 Core dump如何查看自己的核心转储功能是否被打开…

公司如何防止终端核心文件数据\资料外泄、泄漏?

如何防止电脑文件被拷贝? 防止电子文件泄密是一个重要的信息安全问题。 PC端地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是一些建议的措施: 加强员工教育和培训:提高员工对电子文…

【Python】2019年蓝桥杯省赛真题——完全二叉树的权值

蓝桥杯 2019 省 A&B:完全二叉树的权值 题目描述 给定一棵包含 N N N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是 A 1 , A 2 , ⋯ A N A_1,A_2, \cdots A_N A1​,A2​,⋯AN​,如下图所…

FISCO BCOS(十七)利用脚本进行区块链系统监控

要利用脚本进行区块链系统监控,你可以使用各种编程语言编写脚本,如Python、Shell等 利用脚本进行区块链系统监控可以提高系统的稳定性、可靠性,并帮助及时发现和解决潜在问题,从而确保区块链网络的正常运行。本文可以利用脚本来解…

【网站项目】167校园失物招领小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

四、分类算法 - 随机森林

目录 1、集成学习方法 2、随机森林 3、随机森林原理 4、API 5、总结 sklearn转换器和估算器KNN算法模型选择和调优朴素贝叶斯算法决策树随机森林 1、集成学习方法 2、随机森林 3、随机森林原理 4、API 5、总结

无人机快递(物流)技术方案,无人机快递(物流)基础知识

无人机快递技术是一种利用无人机进行快递配送的先进技术。通过利用无人机,快递企业能够在偏远地区或难以通行的地区提供配送服务,同时提高配送效率并降低人力成本。 无人机基本情况 无人驾驶飞机简称“无人机”,是利用无线电遥控设备和自备的…

板块一 Servlet编程:第七节 ServletContext对象全解与Servlet三大域对象总结 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程:第七节 ServletContext对象全解与Servlet三大域对象总结 一、什么是ServletContext对象二、获取ServletContext对象及常用方法(1)获取 ServletContext 对象(2)ServletContext对象提供的方法 三、se…

js设计模式:依赖注入模式

作用: 在对象外部完成两个对象的注入绑定等操作 这样可以将代码解耦,方便维护和扩展 vue中使用use注册其他插件就是在外部创建依赖关系的 示例: class App{constructor(appName,appFun){this.appName appNamethis.appFun appFun}}class Phone{constructor(app) {this.nam…

开年红!亚信安全荣获2023年网络安全国家标准优秀实践案例一等奖

近日,全国网络安全标准化技术委员会(以下简称“网安标委”)正式发布《关于公布2023年网络安全国家标准优秀实践案例获奖名单的通知》,由国家信息中心牵头,亚信安全等多家单位联合申报的“GB/T42583-2023《信息安全技术…

利用RBI(Remote Browser Isolation)技术访问ChatGPT

系统组网图 #mermaid-svg-Bza2puvd8MudMbqR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Bza2puvd8MudMbqR .error-icon{fill:#552222;}#mermaid-svg-Bza2puvd8MudMbqR .error-text{fill:#552222;stroke:#552222;…