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.mzph.cn/diannao/67320.shtml

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

相关文章

计算机网络速成

前言&#xff1a;最近在做一些动态的crypto&#xff0c;但是配置总搞不好&#xff0c;正好也有学web的想法&#xff0c;就先学学web再回去做密码&#xff0c;速成视频推荐b站建模老哥 目录 计算机网络概述网络的范围分级电路交换网络&#xff08;电路交换&#xff09;报文交换网…

【React】静态组件动态组件

目录 静态组件动态组件创建一个构造函数(类)使用 class 实现组件**使用 function 实现类组件** 静态组件 函数组件是静态组件&#xff1a; 组件第一次渲染完毕后&#xff0c;无法基于内部的某些操作让组件更新「无法实现自更新」&#xff1b;但是&#xff0c;如果调用它的父组…

Qt/C++ 基于 QGraphicsView 的绘图软件 (附源码下载链接)

基于 Qt 的 QGraphicsView 绘图软件项目进行深入讲解&#xff0c;分析其核心代码与功能实现&#xff0c;帮助开发者理解 QGraphicsView 的用法。 项目概览 该项目实现了一个简单的绘图应用&#xff0c;用户可以在界面中创建和编辑矩形、椭圆、直线、多边形和文本等图形对象。功…

Vue2+OpenLayers给2个标点Feature分别添加独立的点击事件(提供Gitee源码)

前言&#xff1a;之前开发都是将所有的点位存放在一个图层上面&#xff0c;并统一赋予它们相同的点击事件&#xff0c;如果其中某些点的点击事件不一样呢&#xff0c;这种问题如何解决呢&#xff0c;本篇博客就是解决这个通点。 目录 一、案例截图 二、安装OpenLayers库 三…

李宏毅机器学习课程笔记03 | 类神经网络优化技巧

文章目录 类神经网络优化技巧局部最小值local minima 与 鞍点saddle pointSaddle Point 的情况更常见 Tips for training&#xff1a;Batch and MomentumSmall Batch vs Large Batch回顾&#xff1a;optimization优化 找到参数使L最小问题&#xff1a;为什么要用Batch&#xff…

如何学习网络安全?有哪些小窍门?

学好网络安全其实没有所谓的捷径&#xff0c;也没有什么小窍门。 入门网络安全首先要有浓厚的学习兴趣&#xff0c;不然很容易就变成了从入门到放弃了。 其次要能静下心&#xff0c;踏踏实实的打好基础。如果你是零基础&#xff0c;建议从Web安全入手&#xff0c;课程难度相对…

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

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

K8S 亲和性与反亲和性 深度好文

今天我们来实验 pod 亲和性。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8-alpine docker pull nginx…

Nginx三种不同类型的虚拟主机(基于域名、IP 和端口)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年1月15日13点14分 目录 1. 基于域名的虚拟主机 …

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展&#xff0c;虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络&#xff0c;Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展&#xff0c;OVN 提供了对虚拟网络抽象的支持&#xff0c;使得大规模部署和管理…

【Flink系列】9. Flink容错机制

9. 容错机制 在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 9.1 检查点&#xff08;Checkpoint&#xff09; 9.1.1 检查点的保存 1&#xff09;周期性的触发保存 “随时存档”确实恢复起来方便&#xff0c;可是需要我…

《Keras 3 在 TPU 上的肺炎分类》

Keras 3 在 TPU 上的肺炎分类 作者&#xff1a;Amy MiHyun Jang创建日期&#xff1a;2020/07/28最后修改时间&#xff1a;2024/02/12描述&#xff1a;TPU 上的医学图像分类。 &#xff08;i&#xff09; 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 简介 设置 本教程将介…

openssl s_server源码剥离

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

51单片机 DS18B20温度储传感器

DS18B20温度传感器 64-BITROM&#xff1a;作为器件地址&#xff0c;用于总线通信的寻址&#xff0c;是唯一的&#xff0c;不可更改 SCRATCHPAD&#xff08;暂存器&#xff09;&#xff1a;用于总线的数据交互 EEPROM&#xff1a;用于保存温度触发阈值和配置参数 暂存器 单总线…

[操作系统] 深入理解操作系统的概念及定位

概念 任何计算机系统都包含⼀个基本的程序集合&#xff0c;称为操作系统(OS)。 其核心功能如图片所示&#xff0c;包括&#xff1a; 内核 (Kernel)&#xff1a; 内核是操作系统的核心部分&#xff0c;被认为是狭义上的操作系统&#xff0c;直接与硬件打交道。负责进程管理、内…

Java并发编程——线程池(基础,使用,拒绝策略,命名,提交方式,状态)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…

nginx 配置代理,根据 不同的请求头进行转发至不同的代理

解决场景&#xff1a;下载发票的版式文件&#xff0c;第三方返回的是url链接地址&#xff0c;但是服务是部署在内网环境&#xff0c;无法访问互联网进行下载。此时需要进行走反向代理出去&#xff0c;如果按照已有套路&#xff0c;就是根据不同的访问前缀&#xff0c;跳转不同的…

docker在不删除容器的情况下修改端口映射

注意&#xff1a;必须先停止docker服务&#xff01;&#xff01;&#xff01;&#xff01; 1) 停止容器 2) 停止docker服务(systemctl stop docker) 3) 修改这个容器的hostconfig.json和config.v2.json文件中的端口 先查看容器id docker inspect jenkins 进入该目录 hostcon…

【js进阶】设计模式之单例模式的几种声明方式

单例模式&#xff0c;简言之就是一个类无论实例化多少次&#xff0c;最终都是同一个对象 原生js的几个辅助方式的实现 手写forEch,map,filter Array.prototype.MyForEach function (callback) {for (let i 0; i < this.length; i) {callback(this[i], i, this);} };con…

专题 - STM32

基础 基础知识 STM所有产品线&#xff08;列举型号&#xff09;&#xff1a; STM产品的3内核架构&#xff08;列举ARM芯片架构&#xff09;&#xff1a; STM32的3开发方式&#xff1a; STM32的5开发工具和套件&#xff1a; 若要在电脑上直接硬件级调试STM32设备&#xff0c;则…