当前位置: 首页 > news >正文

用户空间 lmkd

用户空间 lmkd

  • 1、概览
    • 1.1 配置lmkd
  • 2、lmkd
    • 2.1 lmkd启动
    • 2.2 时序图

Android LowMemoryKiller原理分析
AOSP>文档>核心主题低内>存终止守护程序

1、概览

Android Low Memory Killer Daemon :system/memory/lmkd/README.md
Android 低内存终止守护程序 (lmkd) 进程可监控运行中的 Android 系统的内存状态,并通过终止最不必要的进程来应对内存压力大的问题,使系统以可接受的性能水平运行。

AOSP>文档>核心主题低内>存终止守护程序

1.1 配置lmkd

属性使用默认
ro.config.low_ram指定设备是低内存设备还是高性能设备false
ro.lmk.use_new_strategy当低内存设备(ro.config.low_ram)或无低内存阈值(ro.lmk.use_minfree_levels)策略时,使用基于zone watermarks, free swap and thrashing stats的新策略
ro.lmk.use_psi使用 PSI 监视器(而不是 vmpressure 事件)true
ro.lmk.low在低 vmpressure 水平下可被终止的进程的最低 oom_adj 得分1001
ro.lmk.medium在中等 vmpressure 水平下可被终止的进程的最低 oom_adj 得分800
ro.lmk.critical在临界 vmpressure 水平下可被终止的进程的最低 oom_adj 得分0
ro.lmk.debug启用 lmkd 调试日志false
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.use_minfree_levels使用可用内存和文件缓存阈值来做出进程终止决策 (即与内核中的 LMK 驱动程序的功能一致)false
ro.lmk.swap_free_low_percentage可用交换水平,以占总交换空间的百分比表示。“lmkd”使用该值作为阈值来判断何时将系统视为交换空间不足。如果“lmkd”因交换空间过多而终止,请降低该百分比。如果“lmkd”终止得太晚,从而导致 OOM 终止,请提高该百分比。10
ro.lmk.psi_partial_stall_ms部分 PSI 失速阈值(以毫秒为单位),用于触发内存不足通知。如果设备收到内存压力通知的时间太晚,可以降低此值以在较早的时间触发通知。如果在不必要的情况下触发了内存压力通知,请提高此值以降低设备对噪声的敏感度。70(ro.config.low_ram默认false)
ro.lmk.psi_complete_stall_ms完全 PSI 失速阈值(以毫秒为单位),用于触发关键内存通知。如果设备收到关键内存压力通知的时间太晚,可以降低该值以在较早的时间触发通知。如果在不必要的情况下触发了关键内存压力通知,可以提高该值以降低设备对噪声的敏感度。700
ro.lmk.thrashing_limit工作集 refault 数量的上限,以占具有文件支持的页面缓存总大小的百分比表示。如果工作集 refault 的数量超过该值,则视为系统对其页面缓存造成抖动。如果设备性能在内存压力期间受到影响,请降低该值以限制抖动。如果因抖动原因而导致设备性能不必要地降低,请提高该值以允许更多抖动。100(ro.config.low_ram默认false)
ro.lmk.thrashing_limit_decay抖动阈值衰减,以占在系统无法恢复时(甚至是终止后)用于降低阈值的原始阈值的百分比表示。如果持续抖动导致不必要的终止,请降低该值。如果终止后对持续抖动的响应速度过慢,请提高该值。10(ro.config.low_ram默认false)
ro.lmk.thrashing_limit_criticalGET_LMK_PROPERTY(int32, "thrashing_limit_critical", thrashing_limit_pct * 2)100*2
ro.lmk.swap_util_max最大交换内存量,以占可交换内存总量的百分比表示。如果交换的内存量超过此上限,则表示系统在交换了其大部分可交换内存后仍然存在压力。 当内存压力是由不可交换内存的分配导致时,就可能会发生这种情况,原因在于大部分可交换内存已经交换,所以无法通过交换来缓解这一压力。默认值为 100,这实际上会停用此检查。如果设备的性能在交换利用率较高且可用交换水平未降至 ro.lmk.swap_free_low_percentage 的内存压力期间受到影响,请降低该值以限制交换利用率。100
ro.lmk.filecache_min_kb抖动后文件缓存太低,继续杀死后台进程。0
ro.lmk.stall_limit_criticalPSI失速极限临界。如果系统停滞,允许杀死可感知的应用程序100

在这里插入图片描述

2、lmkd

2.1 lmkd启动

lmkd是由init进程,通过解析init.rc文件来启动的lmkd守护进程,lmkd会创建名为lmkd的socket,节点位于/dev/socket/lmkd,该socket用于跟上层framework交互。

system/memory/lmkd/lmkd.rc

service lmkd /system/bin/lmkdclass coreuser lmkdgroup lmkd system readproccapabilities DAC_OVERRIDE KILL IPC_LOCK SYS_NICE SYS_RESOURCEcriticalsocket lmkd seqpacket+passcred 0660 system systemtask_profiles ServiceCapacityLowon property:lmkd.reinit=1exec_background /system/bin/lmkd --reinit# reinitialize lmkd after device finished booting if experiments set any flags during boot
on property:sys.boot_completed=1 && property:lmkd.reinit=0setprop lmkd.reinit 1# properties most likely to be used in experiments
# setting persist.device_config.* property either triggers immediate lmkd re-initialization
# if the device finished booting or sets lmkd.reinit=0 to re-initialize lmkd after boot completes
on property:persist.device_config.lmkd_native.debug=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.kill_heaviest_task=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.kill_timeout_ms=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.swap_free_low_percentage=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.psi_partial_stall_ms=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.psi_complete_stall_ms=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.thrashing_limit=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.thrashing_limit_decay=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.thrashing_limit_critical=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.swap_util_max=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.filecache_min_kb=*setprop lmkd.reinit ${sys.boot_completed:-0}

2.2 时序图

在这里插入图片描述

http://www.lryc.cn/news/414719.html

相关文章:

  • 二叉树专题
  • Spring MVC 之简介及常见注解
  • 除了使用本地存储,还有哪些方法可以实现只出现一次的弹窗?
  • 微软蓝屏事件揭示的网络安全深层问题与未来应对策略
  • C#:通用方法总结—第11集
  • Web开发-html篇-下
  • 【C++从小白到大牛】多态那些事儿(上)
  • 网站在线查询工具箱源码分享
  • SSH简写且免密登陆终端设备
  • 算力共享中神经网络切片和算力分配策略
  • 3章4节:R的逻辑运算和矩阵运算
  • 使用EasyAR打包安卓操作注意
  • 驾驭PyCharm:破解环境配置的迷宫
  • 大数据技术原理-Hadoop的安装
  • 从根儿上学习spring 八 之run方法启动第四段(2)
  • 牛顿插值法代替泰勒公式
  • 为 Laravel 提供生产模式下的容器化环境:打造现代开发环境的终极指南
  • Visual Studio 和 VSCode 哪个好?
  • 百款精选的HTML5小游戏源码,你可以下载并直接运行在你的小程序或者自己的网站上
  • 01 LVS负载均衡群集
  • Redis结合Lua脚本的简单使用
  • Java使用zip4j加密压缩和解压文件与文件夹
  • 一款好用的开源网站内容管理系统
  • Qt Modbus 寄存器读写实例
  • centos安装es、kibana、ik
  • 调试工具之GDB的基本使用
  • C++ //练习 16.14 编写Screen类模板,用非类型参数定义Screen的高和宽。
  • 【Java】深度解析监视器的组成原理
  • Day14-Servlet后端验证码的实现
  • MySQL:数据库权限与角色