提高进程优先级,降低被low memory killer杀死的机率

简介: 笔记

在项目中遇到服务被偶然杀死的问题,通过kernel log看到:

lowmem_shrink: 5 callbacks suppressed
lowmemorykiller: [ pid ]   uid  tgid total_vm      rss   swap cpu oom_score_adj name
lowmemorykiller: [  121]     0   121      131       38     18   0          -941 ueventd
lowmemorykiller: [  128]  1023   128      884       65     30   0          -941 sdcard
lowmemorykiller: [  129]     0   129      358       31      4   1          -941 healthd
lowmemorykiller: [  130]  1000   130      254       44     15   0          -941 servicemanager
lowmemorykiller: [  131]     0   131     1171       73     69   0          -941 vold
lowmemorykiller: [  132]  1000   132      786       53     21   0          -941 download
lowmemorykiller: [  133]  1000   133      767       42     36   1          -941 modem_control
lowmemorykiller: [  134]  1000   134     1540       48     40   0          -941 modemd
lowmemorykiller: [  135]  1000   135     1334       56     51   0          -941 wcnd
lowmemorykiller: [  136]  1000   136       90        3      3   0          -941 batterysrv
lowmemorykiller: [  137]  1000   137      749       40     30   0          -941 modemDriver_vpa
lowmemorykiller: [  138]     0   138     2452       89     84   1          -941 netd
lowmemorykiller: [  143]     0   143      284       43     34   1          -941 debuggerd
lowmemorykiller: [  144]     0   144     1509      150     47   0          -941 slog
lowmemorykiller: [  146]  1000   146    11892      920    124   0          -941 surfaceflinger
lowmemorykiller: [  147]     0   147    51702     2089   1565   0          -941 zygote
lowmemorykiller: [  148]  1019   148     2949      159    172   0          -941 drmserver
lowmemorykiller: [  149]  1013   149    12314      345    537   0          -941 mediaserver
lowmemorykiller: [  150]  1012   150      251       47     32   1          -941 installd
lowmemorykiller: [  151]  1017   151      842       62     80   1          -941 keystore
lowmemorykiller: [  153]  2000   153      328       62     63   0          -941 slogmodem
lowmemorykiller: [  154]     0   154      267       35     30   0          -941 srtd
lowmemorykiller: [  155]  1000   155     1456       96     63   0          -941 thermald
lowmemorykiller: [  162]     0   162      267       25     31   1          -941 srtd
lowmemorykiller: [  164]  1000   164     7750      116    107   0          -941 phoneserver
lowmemorykiller: [  165]     0   165     3723      201    299   1          -941 engpc
lowmemorykiller: [  166]  1001   166     2728      168     49   1          -941 rild_sp
lowmemorykiller: [  170]  1001   170     2459      141     46   1          -941 rild_sp
lowmemorykiller: [  171]     0   171     1308       88    765   1          -941 cp_diskserver
lowmemorykiller: [  172]  2000   172      234       31     29   0          -941 sh
lowmemorykiller: [  175]     0   175     2927       91    260   0          -941 engpc
lowmemorykiller: [  179]  1023   179      884       53     46   1          -941 sdcard
lowmemorykiller: [  182]     0   182     1380       58     62   0          -941 collect_apr
lowmemorykiller: [  183]  1000   183      799       49     40   1          -941 refnotify
lowmemorykiller: [  561]  1000   561    83930     5461   2529   0          -941 system_server
lowmemorykiller: [  629]  1001   629    83097     5956   1728   0          -705 m.android.phone
lowmemorykiller: [  639] 10035   639    61751     4469   1329   0          -705 ndroid.systemui
lowmemorykiller: [  716] 10029   716    53242     1687   1869   0            58 android.smspush
lowmemorykiller: [  759] 10014   759    56097     3128   1370   0           294 d.process.acore
lowmemorykiller: [  777] 10040   777    60884     3855   1364   0             0 ndroid.incallui
lowmemorykiller: [  792]  1000   792    53277     1435   2135   1          -705 eadst.validator
lowmemorykiller: [  799] 10000   799    54030     1440   2137   0          -705 oid.modemassert
lowmemorykiller: [ 1036]  2000  1036      892       42      7   1          -941 adbd
lowmemorykiller: [ 5576] 10039  5576    55422     3100   1298   0           470 yscale.atclient
lowmemorykiller: [ 5982] 10013  5982    54468     3466   1259   1           529 com.svox.pico
lowmemorykiller: [ 6022]  1000  6022     7750      116    107   0          -941 phoneserver
lowmemorykiller: Killing 'com.svox.pico' (5982), adj 9,
lowmemorykiller: Killing 'yscale.atclient' (5576), adj 8,  //这是我的应用包名,显示的不全
lowmemorykiller: Killing 'oadcastreceiver' (6139), adj 9,
lowmemorykiller: Killing 'com.android.mms' (6096), adj 9,

从Log中看到我应用的adj等级为8,所以需要降低这个值,越小越不容易被杀死。


方法一


在代码里面调用  startForeground/stopForeground  添加为前台程序/去掉前台程序

//在onCreate()/onStartCommand()方法
/**
  * 设置前台进程
*/
private void startForegournd() {
        Notification notification = new Notification();
        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
        //把该service创建为前台service
        startForeground(8888, notification);
}
//onDestory()方法
stopForeground(true);

方法二


设置为系统应用

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      android:persistent="true"
      android:sharedUserId="android.uid.system"
     package="com.flyscale.atclient">

设置好后,查看adj值,方法如下:

//oom_adj代表当前进程的优先级,这个优先级是kernel中的优先级
adb shell
shell@sp9820w_modem:/ $ ps
u0_a39    798   146   243272 17252 ffffffff 00000000 S com.flyscale.atclient
//pid为798
shell@sp9820w_modem:/ $ cat proc/798/oom_adj
1    //adj值变为1了

其它命令


查看低内存管理的adj值及对应的内存限值

shell@sp9820w_modem:/ $ cat  /sys/module/lowmemorykiller/parameters/adj
0,1,2,3,9,15 //说明的系统分为0,1,2,3,9,15这7个等级,为什么是7个?因为这几个值只是一个分界线

越小越难被杀死,前台程序是0,init进程是-16。在init.rc里面有这样一句话 write /proc/1/oom_adj -16

上面的等级对应的低内存回收极限可以通过下面的命令查看

shell@sp9820w_modem:/ $ cat /sys/module/lowmemorykiller/parameters/minfree
2560,3840,4608,6144,7680,9216

例如:当内存低于9216时,会杀掉adj>=15的进程

  1. 对每个进程来说:
    /proc/pid/oom_adj:代表当前进程的优先级,这个优先级是kernel中的优先级,这个优先级与上层的优先级之间有一个换算。
    /proc/pid/oom_score_adj:上层优先级,跟ProcessList中的优先级对应



目录
相关文章
|
2月前
|
算法 调度 UED
揭秘操作系统背后的暗战:进程调度与优先级反转的惊心动魄!
【8月更文挑战第21天】操作系统核心管理计算机资源,进程调度为其关键功能,决定CPU使用权,影响系统性能与用户体验。优先级反转是多任务环境下常见挑战:高优先级进程因等待低优先级进程占用的资源而被阻塞,导致系统效率下降。通过优先级继承或提升机制可解决此问题,确保系统资源高效利用与响应时间优化。
34 1
|
6天前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
10天前
|
算法 调度
深入理解操作系统:进程调度与优先级反转
【9月更文挑战第21天】在操作系统的心脏跳动着的,是进程调度器。它决定了哪个进程运行,何时运行,以及如何优雅地共享CPU资源。本文将通过浅显易懂的语言和直观的代码示例,探索进程调度的奥秘,揭示优先级反转问题及其解决方案,带领读者领略操作系统中这一精妙绝伦的设计。
|
20天前
|
算法 人机交互 调度
进程调度算法_轮转调度算法_优先级调度算法_多级反馈队列调度算法
轮转调度算法(RR)是一种常用且简单的调度方法,通过给每个进程分配一小段CPU运行时间来轮流执行。进程切换发生在当前进程完成或时间片用尽时。优先级调度算法则根据进程的紧迫性赋予不同优先级,高优先级进程优先执行,并分为抢占式和非抢占式。多队列调度算法通过设置多个具有不同优先级的就绪队列,采用多级反馈队列优先调度机制,以满足不同类型用户的需求,从而优化整体调度性能。
38 15
|
2月前
|
算法 调度 UED
探索操作系统核心:进程调度与优先级队列
【8月更文挑战第31天】在计算机的心脏——操作系统中,进程调度是维持系统运行的关键机制。本文将深入浅出地介绍进程调度的概念,并通过一个简单的优先级队列算法示例,展示如何在操作系统设计中实现基本的进程管理。我们将从理论到实践,逐步揭示如何通过代码构建一个模拟的进程调度系统,帮助读者理解这一复杂但至关重要的操作系统特性。
|
2月前
|
运维 算法 调度
深入理解操作系统:进程调度与优先级自动化运维:使用Ansible实现服务器集群管理
【8月更文挑战第27天】在操作系统的众多奥秘中,进程调度无疑是一个既简单又复杂的主题。它就像是交响乐团中的指挥,协调着每一个音符,确保乐曲和谐而有序地进行。本文将带领读者走进进程调度的世界,探索其背后的原理和实现,同时通过代码示例揭示其精妙之处。让我们一起揭开进程调度的神秘面纱,理解它在操作系统中的重要性。
|
2月前
|
Linux 调度 数据库
在Linux中,什么时候需要用到进程的优先级?
在Linux中,什么时候需要用到进程的优先级?
|
2月前
|
Linux 调度
Linux源码阅读笔记05-进程优先级与调度策略-实战分析
Linux源码阅读笔记05-进程优先级与调度策略-实战分析
|
2月前
|
数据可视化 JavaScript 前端开发
Python中的数据可视化:从基础到进阶深入理解操作系统:进程调度与优先级
【8月更文挑战第29天】数据可视化是现代数据分析不可或缺的一环。本文将引导读者通过Python这一强大的编程语言,利用其丰富的库和工具,探索数据可视化的奥秘。我们将从最基础的图表开始,逐步深入到更复杂的可视化技术,最终实现高级定制和交互式可视化。无论你是数据科学新手还是希望提升可视化技能的开发者,这篇文章都将为你打开一扇通往数据美学的大门。
|
2月前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级反转
【8月更文挑战第2天】在操作系统的心脏中,进程调度是维持多任务并发执行的关键机制。本文将通过一个简化的Python代码示例,揭示进程调度背后的逻辑,并探讨优先级反转现象及其对系统性能的影响。我们将从基础概念出发,逐步深入到进程调度算法的实现,最终讨论如何优化调度策略以提升系统响应性和效率。

相关实验场景

更多