Android-V lmkd 中的那些属性值

源码基于:Android V

相关博文:

Android lmkd 机制详解(一)

Android lmkd 机制详解(二)

Android lmkd 机制从R到T

1. 汇总

属性名说明默认值

ro.lmk.debug

启动 lmkd 的debug 模式,会打印一些调试信息

false

ro.lmk.use_psi

启动 PSI monitor,否则使用memcg 的方式,详细可以查看 init_monitors() 函数

true

ro.lmk.use_new_strategy

启动mp_event_psi 处理策略,否则使用 mp_event_common 常规策略

默认值依赖:low_ram_device || !use_minfree_levels

ro.lmk.use_minfree_levels

使用水位等级,详细查看 ProcessList.java

否则,使用指定的等级,使用 ro.lmk.low、medium、critical 指定的水位adj

false

ro.config.low_ram

低 ram 设备,用以确定是否使用 psi 策略,详细见 ro.lmk.use_new_strategy

false

ro.config.per_app_memcg

日志记录是否精确到每个进程的memcg

默认值为 ro.config.low_ram

ro.lmk.low

mp_event_common() 函数中使用,依赖于memcg 统计且值在cgroup v1 中生效。

三个prop 用以标记在三个等级下的被查杀的最小 adj。

1001

ro.lmk.medium

800

ro.lmk.critical

0

ro.lmk.critical_upgrade

允许提升pressure level 等级,mp_event_common() 函数中使用

false

ro.lmk.upgrade_pressure

提升压力等级的阈值,依赖 ro.lmk.critical_upgrade 使能

如果mem_pressure < upgrade_pressure,则调用 upgrade_level() 提示压力等级

100

ro.lmk.downgrade_pressure

降低压力等级的阈值,当mem_pressure 低于该值,会考虑降低压力等级

100

ro.lmk.kill_heaviest_task

kill 符合条件的最繁重的task(最好决定) VS kill 符合条件的任何task(最快决定)

false

ro.lmk.kill_timeout_ms

查杀进程后等待进程释放资源的 timeout,如果超过时间没有释放资源,系统将强制结束该进程。

100

ro.lmk.pressure_after_kill_min_score

当 cycle_after_kill && wmark < WMARK_LOW 时,指定min_score_adj

查杀回收无法满足进程对内存的消耗时,会进入连续查杀,此时指定最小 adj

0

ro.lmk.delay_monitors_until_boot

推迟 init_monitors,直到 boot completed

false

属性名说明 默认值
高性能低性能

ro.lmk.psi_partial_stall_ms

PSI stall ms,medium 等级

70

200

ro.lmk.psi_complete_stall_ms

PSI stall ms,critical 等级

700

ro.lmk.stall_limit_critical

严重失速限定值,当 FULL_10 大于该值,标记严重失速,min_score_adj 将指定到0

100

ro.lmk.swap_free_low_percentage

swap 分区可用内存占swap total 的百分比,用以判断swap 分区是否处于 low

10

ro.lmk.swap_util_max

swap 内存的利用率,用以确定是否有可回收的内存,如果达到该阈值,则表示因无法swap引起的内存压力

100

ro.lmk.swap_compression_ratio

用以 ZRAM 的压缩比,通常根据 easy_available 计算出 swap free 内存空间

1

ro.lmk.thrashing_limit

某段时间内 workingset refault (Kernel5.9之后特指 file)在 file lru 中的百分比阈值

100

30

ro.lmk.thrashing_limit_decay

为了尽快停止抖动,thrashing_limit 会进行衰减,该值为每次衰减的比例

10

50

ro.lmk.thrashing_limit_critical

严重抖动的阈值,默认值为 ro.lmk.thrashing_limit * 3,

ro.lmk.filecache_min_kb

上一轮查杀是因为抖动,这一轮查杀若无其他原因,则会确认系统 file lru 是否过低

0

ro.lmk.direct_reclaim_threshold_ms

直接内存回收的耗时阈值,如果超过该阈值,则表示设备因为直接内存回收卡住了,0 表示不使能该检查

0

ro.lmk.lowmem_min_oom_score

LOW_MEM 原因查杀时,指定的 min_score_adj 最终与 PERCEPTIBLE_APP_ADJ + 1 比较,取最大值

PREVIOUS_APP_ADJ + 1

2. ro.lmk.swap_free_low_percentage

这用以标记 swap free 的水位线,当swap free 小于该线时,则表示处于 low 状态:

    if (swap_free_low_percentage) {swap_low_threshold = mi.field.total_swap * swap_free_low_percentage / 100;swap_is_low = get_free_swap(&mi) < swap_low_threshold;} else {swap_low_threshold = 0;}

2.1 变量 swap_is_low

从上面代码可知,swap_is_low 是 get_free_swap() 小于 swap_low_threshold。

static inline int64_t get_free_swap(union meminfo *mi) {if (swap_compression_ratio)return std::min(mi->field.free_swap, mi->field.easy_available * swap_compression_ratio);return mi->field.free_swap;
}

get_free_swap() 的返回值为 meminfo 中的 free_swap 以及 easy_available * swap_compression_ratio 之间的最小值。

这里设计到三个数值:

  • free_swap
  • easy_available
  • swap_compression_ratio

第一个 free_swap 不必多说,先来看下 swap_compression_ration。这里 zram 的压缩率,在V 之前直接是 3,即默认认为压缩比是 1:3,而在 V 中使用了prop 动态控制,默认值为 1。

再来看下 easy_available

mi->field.easy_available = mi->field.nr_free_pages + mi->field.inactive_file;

 swap 虽然还有很多,但实际可用的需要根据实际剩余的物理内存来判定,即系统留给 zram 压缩的可用物理空间。

从官方解释来看:

lmkd: measure free swap as available and easily reclaimable memory In the case of ZRAM,
SwapFree does not represent the actual free swap amount because swap space is taken from
the free memory or reclaimed. Therefore use free memory and easily reclaimable memory as an 
approximation of how much free swap system can use. Use SwapFree as a measure of how much
swap space the system will consider using. Min of those two measurements is used to decide
how much usable swap the system still has.

因此,swap_is_low 不仅仅要看 free_swap,还需要考虑实际剩余物理内存以及压缩比。

3. ro.lmk.swap_util_max

是查杀策略中的一种,用以判断 swap 的利用率:

    } else if (wmark < WMARK_HIGH && swap_util_max < 100 &&(swap_util = calc_swap_utilization(&mi)) > swap_util_max) {/** Too much anon memory is swapped out but swap is not low.* Non-swappable allocations created memory pressure.*/kill_reason = LOW_MEM_AND_SWAP_UTIL;
static int calc_swap_utilization(union meminfo *mi) {int64_t swap_used = mi->field.total_swap - get_free_swap(mi);int64_t total_swappable = mi->field.active_anon + mi->field.inactive_anon +mi->field.shmem + swap_used;return total_swappable > 0 ? (swap_used * 100) / total_swappable : 0;
}

系统匿名页越大,表示可以swap 的内存越大,最后比值就会越小。

即,该阈值用以确认系统中可回收的内存,默认值为100时,实际上会停止该检查。

4. ro.lmk.thrashing_limit

在某段时间内,系统会出现 workingset refault,从Kernel 5.9 开始特指文件页的workingset refault:

thrashing = (workingset_refault_file - init_ws_refault) * 100 / (base_file_lru + 1);

抖动就是在某段时间内 workingset_refault_file 在file lru 中的百分比。

每次 mp_event_psi() 的触发都会检查抖动值,且在进入查杀后会对 thrashing_limit 进行衰减,更加严格控制抖动值,以此加快停止抖动。

5. ro.lmk.thrashing_limit_decay

thrashing_limit 的衰减比例,通常衰减10%,在 low ram 设备中衰减50%。

将 thrashing_limit 值进行衰减,用以在 1s 连续查杀释放内存,以此尽快停止抖动:

        int pages_freed = find_and_kill_process(min_score_adj, &ki, &mi, &wi, &curr_tm, &psi_data);if (pages_freed > 0) {killing = true;max_thrashing = 0;if (cut_thrashing_limit) {/** Cut thrasing limit by thrashing_limit_decay_pct percentage of the current* thrashing limit until the system stops thrashing.*/thrashing_limit = (thrashing_limit * (100 - thrashing_limit_decay_pct)) / 100;}}

注意 thrashing_limit 会在 THRASHING_RESET_INTERVAL_MS(1000) 时间后恢复到 thrashing_limit_pct,也就是恢复到 ro.lmk.thrashing_limit 设定的阈值:

    since_thrashing_reset_ms = get_time_diff_ms(&thrashing_reset_tm, &curr_tm);if (since_thrashing_reset_ms > THRASHING_RESET_INTERVAL_MS) {...thrashing_limit = thrashing_limit_pct;}

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

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

相关文章

web开发工具之:三、JWT的理论知识,java的支持,封装的工具类可以直接使用

文章目录 前言一、JWT的理论知识1. 什么是 JWT&#xff08;JSON Web Token&#xff09;&#xff1f;2. **JWT 的组成**3. **JWT 的特点**4. **JWT 的使用场景**5. **JWT 的生命周期**6. **JWT 的优点**7. **JWT 的注意事项**5. **JWT 示例**总结 二、java的springboot支持1. po…

Jira中bug的流转流程

Jira中bug的状态 1. 处理Bug的流程2. bug状态流转详述bug的状态通常包括 1. 处理Bug的流程 2. bug状态流转详述 bug的状态通常包括 未解决 1. 测试人员创建一个bug&#xff0c;填写bug的详细信息&#xff0c;如概要、bug级别、复现步骤、现状、预期结果等 2. 定位bug&#x…

ChatGPT结合Excel辅助学术数据分析详细步骤分享!

目录 一.Excel在学术论文中的作用✔ 二.Excel的提示词✔ 三. 编写 Excel 命令 四. 编写宏 五. 执行复杂的任务 六. 将 ChatGPT 变成有用的 Excel 助手 一.Excel在学术论文中的作用✔ Excel作为一种广泛使用的电子表格软件&#xff0c;在学术论文中可以发挥多种重要作用&a…

Vue篇-07

Vue UI组件库 一、移动端常用的UI组件库 1.1、Vant 1.2、Cube UI 1.3、Mint UI 二、PC端常用的UI组件库 2.1、Element UI Element - The worlds most popular Vue UI framework 安装&#xff1a; 按需引入&#xff1a; 135_尚硅谷Vue技术_element-ui按需引入_哔哩哔哩_b…

LabVIEW实现油浸式变压器自主监测与实时报告

油浸式变压器广泛应用于电力系统中&#xff0c;尤其是在电力传输和分配领域。为了确保变压器的安全、稳定运行&#xff0c;及时监测其工作状态至关重要。传统的变压器监测方法通常依赖人工巡检和定期检查&#xff0c;但这不能及时发现潜在的故障隐患&#xff0c;且效率较低。随…

测试工程师的linux 命令学习(持续更新中)

1.ls """1.ls""" ls -l 除文件名称外&#xff0c;亦将文件型态、权限、拥有者、文件大小等资讯详细列出 ls -l等同于 ll第一列共10位&#xff0c;第1位表示文档类型&#xff0c;d表示目录&#xff0c;-表示普通文件&#xff0c;l表示链接文件。…

如何使用Ultralytics训练自己的yolo5 yolo8 yolo10 yolo11等目标检测模型

Ultralytics正在以惊人的速度吸收优秀的CV算法&#xff0c;之前Ultralytics定位于YOLOV8&#xff0c;但逐渐地扩展到支持其他版本的YOLO&#xff0c;最新版本的ultralytics全面支持yolo5 yolo7 yolo8 yolo9 yolo10 yolo11&#xff0c;包含模型的训练、验证、预测、部署等。毫无…

使用 Java 实现基于 DFA 算法的敏感词检测

使用 Java 实现基于 DFA 算法的敏感词检测 1. 引言 敏感词检测在内容审核、信息过滤等领域有着广泛的应用。本文将介绍如何使用 DFA&#xff08;Deterministic Finite Automaton&#xff0c;确定有限状态自动机&#xff09; 算法&#xff0c;在 Java 中实现高效的敏感词检测。…

Digital Document System (DDS)

Digital Document System (DDS&#xff09; 数字档案平台 信息注入

将图像输入批次扁平化为CNN

将图像输入批次扁平化为CNN 欢迎回到这个神经网络编程系列。在这篇文章中&#xff0c;我们将可视化一个单一灰度图像的张量扁平化操作&#xff0c;并且我们将展示如何扁平化特定的张量轴&#xff0c;这在使用CNN时通常是必需的&#xff0c;因为我们处理的是输入批次&#xff0…

精度论文:【Focaler-IoU: More Focused Intersection over Union Loss】

Focaler-IoU: 更聚焦的交并比损失 Focaler-IoU: More Focused Intersection over Union Loss Focaler-IoU: 更聚焦的交并比损失I. 引言II. 相关工作III. 方法IV. 实验V. 结论 原文地址&#xff1a;官方论文地址 代码地址&#xff1a;官方代码地址 摘要——边界框回归在目标检…

交直流混合微电网多台互联变换器并联

在交直流混合微电网中&#xff0c;多台互联变换器的并联操作是为了实现功率按比例分担。这样的系统通常涉及直流-直流&#xff08;DC-DC&#xff09;、直流-交流&#xff08;DC-AC&#xff09;以及交流-直流&#xff08;AC-DC&#xff09;变换器的组合。通过适当的控制策略&…

PyTorch使用教程(2)-torch包

1、简介 torch包是PyTorch框架最外层的包&#xff0c;主要是包含了张量的创建和基本操作、随机数生成器、序列化、局部梯度操作的上下文管理器等等&#xff0c;内容很多。我们基础学习的时候&#xff0c;只有关注张量的创建、序列化&#xff0c;随机数、张量的数学数学计算等常…

Matplotlib基础

概述 1、什么是Matplotlib 是专门用于开发2D图表(包括3D图表)以渐进、交互式方式实现数据可视化 2、为什么要学习Matplotlib 可视化是在整个数据挖掘的关键辅助工具&#xff0c;可以清晰的理解数据&#xff0c;从而调整我们的分析方法。 能将数据进行可视化,更直观的呈现使数据…

警惕IDEA 2024版重大Bug问题:LomBok失效、Gradle冲突、Spring Boot启动错误

一直以来我认为工具类的软件是越新越好&#xff0c;因为工具代表着一定的先进性&#xff1b;但是IDEA 2024好好的给我上了一课&#xff0c;比如lombok 不起作用、比如Spring Boot 3.4.x 启动报错、再比如MyBatis log plus冲突、再比如Gradle插件冲突. 一、Lombok 失效问题 请不…

EI Scopus双检索 | 2025年第四届信息与通信工程国际会议(JCICE 2025)

会议简介 Brief Introduction 2025年第四届信息与通信工程国际会议(JCICE 2025) 会议时间&#xff1a;2025年7月25日-27日 召开地点&#xff1a;中国哈尔滨 大会官网&#xff1a;www.jcice.org 由黑龙江大学和成都信息工程大学主办&#xff0c;江苏科技大学协办的2025年第四届信…

JavaWeb 前端基础 html + CSS 快速入门 | 018

今日推荐语 指望别人的救赎&#xff0c;势必走向毁灭——波伏娃 日期 学习内容 打卡编号2025年01月17日JavaWeb 前端基础 html CSS018 前言 哈喽&#xff0c;我是菜鸟阿康。 今天 正式进入JavaWeb 的学习&#xff0c;简单学习 html CSS 这2各前端基础部分&am…

Flask学习入门笔记

Flask学习入门笔记 前言1. 安装Flask2. 创建一个简单的Flask应用3. 路由与视图函数3.1 基本路由3.2 动态路由3.3 HTTP方法 4. 请求与响应4.1 获取请求数据4.2 返回响应 5. 模板渲染5.1 基本模板渲染5.2 模板继承 6. 静态文件6.1 静态文件的目录结构6.2 在模板中引用静态文件6.2…

菜品管理(day03)

公共字段自动填充 问题分析 业务表中的公共字段&#xff1a; 而针对于这些字段&#xff0c;我们的赋值方式为&#xff1a; 在新增数据时, 将createTime、updateTime 设置为当前时间, createUser、updateUser设置为当前登录用户ID。 在更新数据时, 将updateTime 设置为当前时间…

Python股票量化交易分析-开发属于自己的指标

需求&#xff1a;股票的量化交易指标很多&#xff0c;我想做一个自己的量化交易图表&#xff1a; 展示每天交易量和股价振幅的关系图进一步的话想知道单位金额对股价振幅的影响&#xff0c;最终实现大概估计需要多少买入成交量能拉升多少股价&#xff09; &#xff0c; 目前未…