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 的方式,详细可以查看 | true |
| ro.lmk.use_new_strategy | 启动mp_event_psi 处理策略,否则使用 mp_event_common 常规策略 默认值依赖: | |
| 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;}
相关文章:
Android-V lmkd 中的那些属性值
源码基于:Android V 相关博文: Android lmkd 机制详解(一) Android lmkd 机制详解(二) Android lmkd 机制从R到T 1. 汇总 属性名说明默认值 ro.lmk.debug 启动 lmkd 的debug 模式,会打印一…...
PageHelper快速使用
依赖 <!--分页插件PageHelper--> <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version> </dependency>示例 /** * 封装分页结果…...
图像处理基础(3):均值滤波器及其变种
均值滤波器可以归为低通滤波器,是一种线性滤波器,其输出为邻域模板内的像素的简单平均值,主要用于图像的模糊和降噪。 均值滤波器的概念非常的直观,使用滤波器窗口内的像素的平均灰度值代替图像中的像素值,这样的结果就…...
力扣刷题心得_JAVA
数学 > 数组 > 链表 > 字符串 > 哈希表 > 双指针 > 递归 > 栈 > 队列 > 树 //一般力扣中传入的参数和新建的对象作为返回值,都不列入空间复杂度中 //但是面试的时候要和面试官商量好,灵活定义空间复杂度 //当然最好是就在传入的对象作为返回值,(在原…...
音乐播放器实现:前端HTML,CSS,JavaScript综合大项目
音乐播放器实现:前端HTML,CSS,JavaScript综合大项目 项目概述项目视图效果一、侧边栏相关代码(一)HTML代码(二)css代码 二、登录页面(一)HTML代码(二)css代码…...
Unity编辑器缩放设置
Unity默认界面UI字体太小了,可以设置一下缩放 打开首选项, UI Scaling 设置成125%或者更大 ,然后重启...
ChatGPT大模型极简应用开发-CH1-初识 GPT-4 和 ChatGPT
文章目录 1.1 LLM 概述1.1.1 语言模型和NLP基础1.1.2 Transformer及在LLM中的作用1.1.3 解密 GPT 模型的标记化和预测步骤 1.2 GPT 模型简史:从 GPT-1 到 GPT-41.2.1 GPT11.2.2 GPT21.2.3 GPT-31.2.4 从 GPT-3 到 InstructGPT1.2.5 GPT-3.5、Codex 和 ChatGPT1.2.6 …...
Golang学习笔记_27——单例模式
Golang学习笔记_24——泛型 Golang学习笔记_25——协程Golang学习笔记_25——协程 Golang学习笔记_26——通道 文章目录 单例模式1. 介绍2. 应用场景3. 实现3.1 饿汉式3.2 懒汉模式 源码 单例模式 1. 介绍 单例模式是一种创建型设计模式,它确保一个类只有一个实例…...
хорошо哈拉少wordpress俄语主题
хорошо哈拉少wordpress俄语主题 wordpress俄文网站模板,推荐做俄罗斯市场的外贸公司建俄语独立站使用。 演示 https://www.jianzhanpress.com/?p7360...
[数据结构与算法]js实现二叉树
DFS 与 BFS dfs 递归 本质通过栈结构 bfs 层序遍历 通过队列结构 function permute(nums) {let res [];let cur []; // 记录当前内容let visted {}; //记录访问过的节点let len nums.length;function dfs(nth) {//递归终止条件if (nth len) {res.push([...cur]);return …...
MySQL程序之:连接到服务器的命令选项
本节介绍大多数MySQL客户端程序支持的选项,这些选项控制客户端程序如何建立与服务器的连接、连接是否加密以及连接是否压缩。这些选项可以在命令行或选项文件中给出。 连接建立的命令选项 本节介绍控制客户端程序如何建立与服务器的连接的选项。 表6.4连接建立选…...
python3GUI--仿崩坏三二次元登录页面(附下载地址) By:PyQt5
文章目录 一.前言二.预览三.实现方案1.实现原理1.PyQt52. 具体实现 2.UI设计1.UI组件化、模块化2.UI设计风格思路 3.项目代码结构4.使用方法3.代码分享1.支持跳转网页的QLabel组件2.三角形ICON按钮 四.总结 大小:33.3 …...
阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化
在直播场景中,阿里云 Serverless 应用引擎 SAE 提供的无缝弹性伸缩与极速部署能力,确保直播间高并发时的流畅体验,降低了我们的运营成本,简化了运维流程。结合阿里云云原生数据库 PolarDB 的 Serverless 能力,实现了数…...
Unity 学习指南与资料分享
Unity学习资料 Unity学习资料 Unity学习资料 Unity 作为一款强大的跨平台游戏开发引擎,在游戏开发及实时 3D 内容创作领域占据着重要地位。它功能丰富、易于上手,支持多平台发布,为开发者提供了广阔的创作空间。下面为你带来全面的 Unity 学…...
Android SystemUI——CarSystemBar视图解析(十一)
前面文章我们已经把 CarSystemBar 从启动到构建视图,再到将视图添加到 Window 的流程分析完毕,我们知道默认情况下在车载系统中只显示顶部栏和底部栏视图的。这里我们在前面文章的基础上以顶部栏为例具体解析其视图的结构。 一、顶部栏解析 通过《CarSystemBar车载状态栏》这…...
.NET周刊【1月第1期 2025-01-05】
国内文章 3款.NET开源、功能强大的通讯调试工具,效率提升利器! https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具,旨在提高调试效率。这些工具包括LLCOM,提供串口调试和自动化处…...
初识go语言之指针用法
一、环境准备 安装go语言编译环境,官网地址:https://go.dev/dl/ 或者 https://golang.google.cn/dl/ 点击下载按提示安装即可 vscode 安装go语言扩展 测试 package mainimport "fmt"func main() {fmt.Println("Hello, World!") …...
用户中心项目教程(二)---umi3的使用出现的错误
目录 1.情况的说明 2.遇到的问题 1)第一个问题-关于npx的使用 2)第二个问题--unsupport问题 3)第三个收获--nodejs安装问题 4)第四个收获---nvm下载问题 5)第五个问题--尚未解决的问题 3.个人总结 1.情况的说明…...
Android设备:Linux远程gdb调试
更多内容:XiaoJ的知识星球 目录 1.准备工作1)安装Android NDK:2)连接Android手机3)编译程序 2.启动gdbserver1)**推送gdbserver及可执行文件**:**2)启动gdbserver**:3&am…...
(十四)WebGL纹理坐标初识
纹理坐标是 WebGL 中将 2D 图像(纹理)应用到 3D 物体表面的重要概念。在 WebGL 中,纹理坐标通常使用一个二维坐标系,称为 uv 坐标,它们决定了纹理图像如何映射到几何体上。理解纹理坐标的核心就是明白它们如何将二维纹…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
C++11 constexpr和字面类型:从入门到精通
文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...
Java高级 |【实验八】springboot 使用Websocket
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...
