• linux下的oom调试笔记【原创】


    平台信息:
    内核:linux3.0.68 
    系统:android/android5.1
    平台:s5p4418

    作者:庄泽彬(欢迎转载,请注明作者)

    邮箱:2760715357@qq.com

    摘要:调整android系统的init.rc文件中开启服务的oom的值,使之可以被杀死。

    首先:我们来做一下实验,在android系统的init.rc文件中添加一个服务。这个服务只做一件事情不断的申请内存。

     

     

    oom.c的源码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 
     5 #include <sys/stat.h>
     6 #include <sys/types.h>
     7 
     8 #include <fcntl.h>           /* Definition of AT_* constants */
     9 #include <sys/stat.h>
    10 
    11 
    12 
    13 #define LOG_TAG "MyLed_jni"
    14 #include <utils/Log.h>
    15 #include <android/log.h>  /* liblog */
    16 
    17 
    18 int main(void)
    19 {
    20     int i = 0;
    21     char *buf;
    2223     fprintf(stderr,"--------------------------- success -------------------------------->
    ");           30     sleep(40);
    31 #if 1
    32     for(i = 0;i < 200;i ++){
    33         fprintf(stderr,"%d: oom test
    ",i);
    34         buf = malloc(0xffffff);
    35         bzero(buf,0xffffff);
    36         if(buf == NULL){
    37             printf("--------------------------- fail ------------------------------->
    ");49         }else{
    50             printf("--------------------------- success -------------------------------->
    ");
    51         }
    52     }
    53     while(1);
    54 #endif
    61     return 0;
    62 }

    在android系统启动之后开启服务:start oom,

    系统会打印出这样的调试信息:] Kernel panic - not syncing: Out of memory and no killable processes...。由于找不到可杀死的进程,导致系统重启,为了不让系统重启,我们需要修改进程的oom_adj的值。

    1、 start oom 开启服务
    2、ps 查看服务的pid号为1783
    root 1783 1 9244 396 c0062998 b6eb1324 S /system/bin/oom
    3、root@u4209:/ # cat /proc/1783/oom_adj
    -17
    -17表示服务不可被杀死。因此我们需要改变他的值为普通的进程的等级为0.这样oom服务即可被杀死不会发出kernel panic。导致系统重启.

    改变oom服务的oom_adj的方法:
    1、使用命令的方式:
    echo 0 > /proc/$PID/oom_adj //$PID改成服务的pid号
    echo f > /proc/sysrq-trigger //调用oom_kill杀死内存的hog进程

    这样设置之后oom服务在申请内存过多的时候就不会导致系统重启,而是将进程杀死。

  • 相关阅读:
    Linux服务器管理: 系统的定时任务crond
    Nmon的安装使用及获取报表
    笔记:LoadRunner性能测试巧匠训练营
    python-解决安装MySQL-python出现的: Python version 2.7 required,which was not found in the registry
    JMeter监控内存及CPU——plugin插件监控被测系统资源方法
    Linux监控
    SSL与TLS的区别以及介绍
    [存]Jmeter 如何实现跨线程组传递参数
    Robot Framework简介
    [转]Appium搭建六:安装Android模拟器
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7462940.html
Copyright © 2020-2023  润新知