ubuntu 解决cache逐渐变大导致oom-killer将某些进程杀死的情况

最近遇到了一个程序运行时间长后,操作系统由于out of memory 导致系统的oom-killer将程序直接杀死的问题:

错误提示大概为:

Out of memory: Kill process 20011 (main) score 58 or sacrifice child

Killed process 20011 (main) total-vm:21688384kB, anon-rss:715844kB, file-rss:816256kB

这些错误可以在linux系统的/var/log/syslog文件中找到

这涉及到oom-killer的问题,具体详见:http://blog.csdn.net/gugemichael/article/details/24017515

解决方法1:

修改/proc/sys/vm/lowmem_reserve_ratio文件,即:echo 512 > /proc/sys/vm/lowmem_reserve_ratio

1、malloc是分配虚拟地址空间,如果不memset或者bzero,那么就不会触发physical allocate,不会映射物理地址,所以这里用bzero填充

2、每次申请的block大小比较有讲究,Linux内核分为LowMemroy和HighMemroy,LowMemory为内存紧张资源,LowMemroy有个阀值,通过free -lm和

/proc/sys/vm/lowmem_reserve_ratio来查看当前low大小和阀值low大小。低于阀值时候才会触发oom killer,所以这里block的分配小雨默认的256M,否则如果每次申请512M(大于128M),malloc可能会被底层的brk这个syscall阻塞住,内核触发page cache回写或slab回收。

解决方法2:(来自http://orax.blog.sohu.com/144138537.html)

调整3个虚拟内存参数:

l vm.min_free_kbytes=409600

l vm.vfs_cache_pressure=200

l vm.swappiness =40

调整MIN_FREE_KBYTES的目的是保持物理内存有足够的空闲空间,防止突发性的换页。Swapiness缺省为60,减少swapiness会使系统尽快通过swapout不使用的进程资源来释放更多的物理内存。Vfs_cache_pressure的缺省值是100,加大这个参数设置了虚拟内存回收directory和i-node缓冲的倾向,这个值越大,回收的倾向越严重。调整这三个参数的目的就是让操作系统在平时就尽快的回收缓冲,释放物理内存,这样就可以避免突发性的大规模换页。

sysctl命令调整了三个参数:

#sysctl -w vm.min_free_kbytes=409600//我这里改的是3000000单位是k字节(因为我的内存为8GB),也就是cache页最少要为3GB,小了就让系统内核释放物理内存

#sysctl -w vm.vfs_cache_pressure=200

#sysctl -w vm.swappiness=40

参数修改完毕后,进入/proc/sys/vm目录,检查这三个参数是否修改正确:

#cd /proc/sys/vm

#cat min_free_kbytes

#cat vfs_cache_pressure

#cat swappiness

参数修改完毕后,过了几分钟,1号节点上的空闲物理内存明显回升。说明参数确实起作用了。上面的操作完成了对目前系统的调整,永久性的设置需要修改/etc/sysctl.conf参数文件。

cd /etc

#cp sysctl.conf sysctl.conf.save20080304

#vi sysctl.conf

添加如下内容:

#modify vm parameter

vm.min_free_kbytes=409600

vm.vfs_cache_pressure=200

vm.swappiness =40

解决方法3:

直接修改/proc/PID/oom_adj文件,将其置位-17,此时oom-killer选择kill程序时,要保护的进程的score 值为0,score值越高,oom-killer就越会选择该程序,将其杀死

echo -17 /proc/8163/oom_adj

解决方法4:(来自http://blog.csdn.net/tenfyguo/article/details/9409743)

直接关闭oom-killer

OOM Killer的关闭与激活方式:
# echo "0" > /proc/sys/vm/oom-kill
# echo "1″ > /proc/sys/vm/oom-kill

其他精彩文章文章

Android KSOAP2调用.net webservice

jQuery教程(8)-DOM树操作之使用反向插入方法

android学习笔记(34)使用AlertDialog创建简单对话框

android学习笔记(33)画廊视图(Gallery)的功能和用法

android navidgation drawer 在导航抽屉中如何改变List选中项的...

更多关于android开发文章

时间: 2024-08-02 00:57:03

ubuntu 解决cache逐渐变大导致oom-killer将某些进程杀死的情况的相关文章

图片过大导致OOM

原文:http://www.codeceo.com/article/android-load-image-oom.html 一.分析 在加载图片过程中出现的OOM的几种情况: 1. 加载的图片过大 2. 一次加载的图片过多 3. 以上两种情况兼有 出现OMM的主要原因有两点: 1.移动设备会限制每个app所能够使用的内存,最小为16M,有的设备分配的会更多,如24.32M.64M等等不一,总之会有限制,不会让你无限制的使用. 2.在andorid中图片加载到内存中是以位图的方式存储的,在andr

【tf.keras】在 cifar 上训练 AlexNet,数据集过大导致 OOM

cifar-10 每张图片的大小为 32×32,而 AlexNet 要求图片的输入是 224×224(也有说 227×227 的,这是 224×224 的图片进行大小为 2 的 zero padding 的结果),所以一种做法是将 cifar-10 数据集的图片 resize 到 224×224. 此时遇到的问题是,cifar-10 resize 到 224×224 时,32G 内存都将无法完全加载所有数据,在归一化那一步(即每个像素点除以 255)就将发生 OOM(out of memory)

Linux OOM killer 机制

Linux中的Out Of Memory(OOM) Killer功能是一种确保系统内存足够的最终手段,可以在耗尽系统内存或交换区后,按某种算法判断占用系统最多资源的进程,向进程发送信号,强制终止该进程. 简单来说该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉. 这个功能即使在无法释放内存的情况下,也能够重复进行确保内存的处理过程,防止系统停滞,还可以找出过度消耗内存的进程. 典型的情况是:某天一台机器突然ssh远程登录不了,但能ping通,说

理解和配置 Linux 下的 OOM Killer

最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有位客户抱怨 VPS 经常死机,登陆到终端看了一下,都是常见的 Out of memory 问题.这通常是因为某时刻应用程序大量请求内存导致系统内存不足造成的,这通常会触发 Linux 内核里的 Out of Memory (OOM) killer,OOM killer 会杀掉某个进程以腾出内存留给系统用,不致于让系统立刻崩溃.如果检查相关的日志文件(/var/log/messages)就会看到下面类似的 Out of memory: Ki

[Android Memory] Linux下malloc函数和OOM Killer

http://www.linuxidc.com/Linux/2010-09/28364.htm Linux下malloc函数主要用来在用户空间从heap申请内存,申请成功返回指向所分配内存的指针,申请失败返回NULL.默认情况下,Linux内核使用“乐观的”分配内存策略,首先粗略估计系统可使用的内存数,然后分配内存,但是在使用的时候才真正把这块分配的内存给你.这样一来,即使用malloc申请内存没有返回NULL,你也不一定能完全使用这块内存,特别是在一次或连续多次申请很多内存的时候. 如果一直连

Android加载大图片OOM异常解决

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source, decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsse

IPhone在横屏字体变大解决办法-webkit-text-size-adjust

在web app开发过程中经常会遇到IPhone在横屏的时候,字体突然放大.而在Android上到是没有这样的问题. 解决的方法,可以通过-webkit-text-size-adjust来设置.很多网站包括京东,搜狐的手机版都是这样设置的:-webkit-text-size-adjust:none.这样设置在手机横屏时不会导致字体突然变大,尤其是在iPhone上.不过这样设置有隐患,所以建议大家 -webkit-text-size-adjust:none   改成  -webkit-text-s

一键解决pdf文件太大如何变小的难题

PDF文件是适用于文件下发,阅读等便捷的电子文件格式,在传输发送的过程中,我们PDF文件较大的情况下,就需要将PDF文件压缩,那么PDF文件太大如何变小呢?对于PDF文件压缩不是太了解的用户可能就想不到好的办法解决,本文将教大家一键解决pdf文件太大如何变小的难题. 1.首先,我们需要了解的是PDF文件进行压缩,我们这里是需要借助到一款叫作迅捷PDF转换器的软件,所以,现在需要做的就是打开浏览器,在电脑上下载安装.软件下载:pdf压缩器http://www.newasp.net/soft/213

关于windows系统DPI增大导致字体变大的原因分析

最近再学习WPF开发,其中提到一个特性“分辨率无关性”,主要功能就是实现开发的桌面程序在不同分辨率的电脑上显示时,会根据系统的DPI自动进行UI的缩放,从而不会导致应用程序的失真. 这个里面就提到了个系统DPI,这个其实在我们windows系统中(不论XP,还是vista之后的win7.win8.win10等),我们都可以设置.DPI就是指每英寸像素点数,及一英寸的长度上存在的像素数,它其实反映的是一个密度问题.windows系统默认情况下,系统DPI都是96DPI,这里还是得注意和显示器实际的