Linux开发一般会遇到“/proc/sys/vm/overcommit_memory”,即文件/etc/sysctl.conf中的vm.overcommit_memory,Overcommit的意思如同其字面意思,即进程可申请超出可用内存大小的内存(对进程而言实为虚拟内存,一个进程占用的虚拟内存空间通常比物理空间要大,甚至可能大许多)。overcommit_memory有三种取值(注:overcommit_memory并不控制OOM,是否开启OOM由panic_on_oom控制):

overcommit_memory取值

含义

0

系统默认值。在程序请求分配内存,比如C++程序调用malloc或new时,先检查是否有足够的内存。如果没有足够满足请求的内存,则分配请求失败。

1

启用Overcommit,即进程可申请超出CommitLimit大小的内存。

2

关闭Overcommit,即申请的内存大小不能超过CommitLimit。行为和/proc/sys/vm/overcommit_ratio的值相关,/proc/sys/vm/overcommit_ratio的默认值为50

权威参考:

https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

官方原文:

overcommit_memory取值

含义

0

Heuristic overcommit handling. Obvious overcommits of

address space are refused. Used for a typical system. It

ensures a seriously wild allocation fails while allowing

overcommit to reduce swap usage.  root is allowed to

allocate slightly more memory in this mode. This is the

default.

1

Always overcommit. Appropriate for some scientific

applications. Classic example is code using sparse arrays

and just relying on the virtual memory consisting almost

entirely of zero pages.

2

Don't overcommit. The total address space commit

for the system is not permitted to exceed swap + a

configurable amount (default is 50%) of physical RAM.

Depending on the amount you use, in most situations

this means a process will not be killed while accessing

pages but will receive errors on memory allocation as

appropriate.

Useful for applications that want to guarantee their

memory allocations will be available in the future

without having to initialize every page.

系统是否行使OOM,由/proc/sys/vm/panic_on_oom的值决定,当/proc/sys/vm/panic_on_oom取值为1时表示关闭OOM,取值0时表示启用OOM。

如果将/proc/sys/vm/oom_kill_allocating_task的值设置为1,则OOM时直接KILL当前正在申请内存的进程,否则OOM根据进程的oom_adj和oom_score来决定。

oom_adj表示进程被OOM KILLER杀死的权重,取值“17~15”,值越大被KILL的概率越高,当进程的oom_adj值为-17时,表示永远不会被OOM KILLER选中。

什么是Overcommit?当已申请的内存(Committed_AS)大小超出CommitLimit值时即为Overcommit,执行命令“cat /proc/meminfo |grep CommitLimit”可查看CommitLimit的当前大小。

CommitLimit为系统当前可以申请的内存总大小,即内存分配上限,当overcommit_memory值为2时,其值等于:SwapTotal + MemTotal * overcommit_ratio。

而Committed_AS,表示所有进程已申请的内存总和。命令“sar -r”输出中的kbcommit对应/proc/meminfo中的Committed_AS,而“%commit”值等于Committed_AS/(MemTotal+SwapTotal)。

如果是大内存机器,可以考虑适当调大/proc/sys/vm/min_free_kbytes的值,但不能太大了,不然容易频繁触发内存回收,min_free_kbytes是内核保留空闲内存最小值,作用是保障必要时有足够内存使用。

Linux OOM一二三的更多相关文章

  1. Linux OOM 自动杀死进程

    问题描述: 今天上班后,登录一台内网测试服务器,发现部分进程失踪 (Nginx/PHP-FPM/MySQL/Crond). 解决方法: 1.首先启动这些进程,保证正常提供服务. 2.查看服务器日志信息 ...

  2. Linux OOM killer 与相关参数详解

    一.前言 本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的.为了理解OOM参数,第二章简单的描述什么是OOM.如果这个名词对你毫无压力,你可以直接进入第三 ...

  3. Linux OOM Killer造成数据库访问异常排查

    服务器上的服务器访问异常,查看/va/log/messages发现如下: Sep 22 16:08:21 safeserver kernel: java invoked oom-killer: gfp ...

  4. 基于zookeeper-3.5.5安装hadoop-3.1.2

    目录 目录 1 1. 前言 3 2. 缩略语 3 3. 安装步骤 4 4. 下载安装包 4 5. 机器规划 4 6. 设置批量操作参数 5 7. 环境准备 5 7.1. 修改最大可打开文件数 5 7. ...

  5. Linux内核OOM机制的详细分析(转)

    Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典 ...

  6. Linux内核OOM机制的详细分析

    Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉.典型的 ...

  7. Linux内存管理 (21)OOM

    专题:Linux内存管理专题 关键词:OOM.oom_adj.oom_score.badness. Linux内核为了提高内存的使用效率采用过度分配内存(over-commit memory)的办法, ...

  8. Linux内核OOM机制的理解【转】

    本文转载自:http://blog.csdn.net/zhoutimo/article/details/52024487 What(什么是OOM): Linux下面有个特性叫OOM killer(Ou ...

  9. Linux内核OOM机制的详细分析【转】

    本文转载自:http://blog.csdn.net/liukuan73/article/details/43238623 Linux内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没 ...

随机推荐

  1. 在 Docker 中运行 SpringBoot 应用

    创建 SpringBoot 项目 用 Idea 创建一个 SpringBoot 项目,编写一个接口: package cloud.dockerdemo import org.springframewo ...

  2. hystrix完成对redis访问的资源隔离

    相对来说,考虑的比较完善的一套方案,分为事前,事中,事后三个层次去思考怎么来应对缓存雪崩的场景 1.事前解决方案 发生缓存雪崩之前,事情之前,怎么去避免redis彻底挂掉 redis本身的高可用性,复 ...

  3. Matlab桥接模式

    桥接模式(Bridge)是一种结构型设计模式.它是用组合关系代替继承关系来实现,可以处理多维度变化的场景(https://blog.csdn.net/qq_31156277/article/detai ...

  4. Node.js 中 exports 和 module.exports 的区别

    每一个模块中都有一个 module 对象, module 对象中有一个 exports 对象 我们可以把需要导出的成员都放到 module.exports 这个接口对象中,也就是 module.exp ...

  5. elementUi vue el-radio 监听选中变化

    //change是radio-group标签的事件 <div> <el-radio-group v-model="radioSex" @change=" ...

  6. javascript中的vavigator对象

    appCodeName javaScript 1.0 介绍:与浏览器相关的内部代码名 appMinorVersion IE4及其后续的版本 介绍:辅版本号(通常应用于浏览器的补丁或服务包) appNa ...

  7. 剑指前端(前端入门笔记系列)——BOM

    BOM ECMAScript是JavaScript的核心,但如果要在Web中使用JavaScript,那么BOM(浏览器对象模型)则无疑才是真正的核心,BOM提供了很多对象,用于访问浏览器的功能,这些 ...

  8. Linux系统MySQL的常用操作命令

    安装好MySQL服务后添加环境变量: #vi /etc/profile export MYSQL_HOME=/usr/local/mysql export PATH=$PATH:$MYSQL_HOME ...

  9. java版ftp简易客户端(可以获取文件的名称及文件大小)

    java版ftp简易客户端(可以获取文件的名称及文件大小) package com.ccb.ftp; import java.io.IOException; import java.net.Socke ...

  10. springBoot 发布war/jar包到tomcat(idea)

    参考链接:https://blog.csdn.net/qq1076472549/article/details/81318729 1.启动类目录新增打包类:  2.pom.xml新增依赖:<pa ...