linux申请内存失败,Linux 内存分配失败(vm.overcommit_memory的内存分配参数详解)

2023-05-16

摘自:linux申请内存失败,Linux 内存分配失败(关于overcommit_memory)_袁廷翠09050082的博客-CSDN博客

1、问题现象和分析:

测试时发现当系统中空闲内存还有很多时,就报内存分配失败了,所有进程都报内存分配失败:

sshd@localhost:/var/log>free

total       used       free     shared    buffers     cached

Mem:      12183700    8627972    3555728          0     289252     584444

-/+ buffers/cache:    7754276    4429424

Swap:            0          0          0

sshd@localhost:/var/log>free

-bash: fork: Cannot allocate memory

sshd@localhost:/var/log>cat /proc/meminfo

-bash: fork: Cannot allocate memory

而messages日志中,也没有OOM相关的记录。最后确认原因为:/proc/sys/vm/overcommit_memory参数导致。

该环境中该参数设置为2,表示“No overcommit”,即系统中所有进程占用的虚拟内存空间不能超过上限:

cat /proc/meminfo

CommitLimit:    12061860 kB  //虚拟地址空间的上限

Committed_AS:    8625360 kB  //当前的使用量

而该参数应该默认是0,这种情况下,只有还有空闲的物理内存,就可以继续分配,不受虚拟地址空间的限制。

echo 0 > /proc/sys/vm/overcommit_memory

如此修正后解决。

摘自:linux的vm.overcommit_memory的内存分配参数详解 - zxiaocheng - 博客园

内核参数overcommit_memory 

它是 内存分配策略

可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

系统在为应用进程分配虚拟地址空间时,会判断当前申请的虚拟地址空间大小是否超过剩余内存大小,如果超过,则虚拟地址空间分配失败。因此,也就是如果进程本身占用的虚拟地址空间比较大或者剩余内存比较小时,fork、malloc等调用可能会失败。


1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

系统在为应用进程分配虚拟地址空间时,完全不进行限制,这种情况下,避免了fork可能产生的失败,但由于malloc是先分配虚拟地址空间,而后通过异常陷入内核分配真正的物理内存,在内存不足的情况下,这相当于完全屏蔽了应用进程对系统内存状态的感知,即malloc总是能成功,一旦内存不足,会引起系统OOM杀进程,应用程序对于这种后果是无法预测的


2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

则是根据系统内存状态确定了虚拟地址空间的上限,由于很多情况下,进程的虚拟地址空间占用远大小其实际占用的物理内存,这样一旦内存使用量上去以后,对于一些动态产生的进程(需要复制父进程地址空间)则很容易创建失败,如果业务过程没有过多的这种动态申请内存或者创建子进程,则影响不大,否则会产生比较大的影响

什么是Overcommit和OOM

        Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做 Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。
        当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该 函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且 oom_score_adj可以被设置(-1000最低,1000最高)。

解决方法:

     很简单,按提示的操作(将vm.overcommit_memory 设为1)即可:

     有三种方式修改内核参数,但要有root权限:

 (1)编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p使配置文件生效

 (2)sysctl vm.overcommit_memory=1

 (3)echo 1 > /proc/sys/vm/overcommit_memory

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux申请内存失败,Linux 内存分配失败(vm.overcommit_memory的内存分配参数详解) 的相关文章

  • Linux 下安装 sonarQube

    sonarQube详细介绍看我这篇文章 xff1a 代码分析工具 SonarQube 单椒煜泽的博客 CSDN博客 代码分析工具 SonarQube下载地址 xff1a Download SonarQube Windows环境从零搭建Son
  • Matlab2017a之前版本的 MATLAB MinGW-w64 C/C++ Compiler4.9.2下载

    对于Matlab R2015b up to R2017a xff0c 使用MinGW 4 9 2 TDM GCC 对于Matlab R2017b MinGW 5 3 Matlab R2015b up to R2017a 下载地址 xff1a
  • Apache CXF框架简介

    Apache CXF框架是一个开源的Web Services框架 xff0c 它来源于两个开源项目 ObjectWeb Celtix ESB产品 和Codehaus XFire SOAP堆栈软件 Apache CXF提供了对JAX WS规范
  • 寻找身高相近的小朋友

    小明今年升学到了小学1年纪 来到新班级后 发现其他小朋友身高参差不齐 然后就想基于各小朋友和自己的身高差 对他们进行排序 请帮他实现排序 输入描述 第一行为正整数 h和n 0 lt h lt 200 为小明的身高 0 lt n lt 50
  • 数字涂色 疫情过后希望小学终于又重新开学了

    注意 答案仅作为参考 实际考试中下列代码通过用例100 但不代表最优解 疫情过后希望小学终于又重新开学了 3年2班开学第一天的任务是 将后面的黑板报重新制作 黑板上已经写上了N个正整数 同学们需要给这每个数分别上一种颜色 为了让黑板报既美观
  • 九宫格按键输入法

    注意 答案仅作为参考 实际考试中下列代码通过用例100 但不代表最优解 九宫格按键输入 输出显示内容 有英文和数字两个模式 默认是数字模式 数字模式直接输出数字 英文模式连续按同一个按键会依次出现这个按键上的字母 如果输入 或者其他字符 则
  • 斗地主之顺子

    注意 答案仅作为参考 实际考试中下列代码通过用例100 但不代表最优解 在斗地主扑克牌游戏中 扑克牌由小到大的顺序为 3 4 5 6 7 8 9 10 J Q K A 2 玩家可以出的扑克牌阵型有 单张 对子 顺子 飞机 炸弹等 其中顺子的
  • 高矮个子排队

    注意 答案仅作为参考 实际考试中下列代码通过用例100 但不代表最优解 现在有一队小朋友 他们高矮不同 我们以正整数数组表示这一队小朋友的身高 如数组 5 3 1 2 3 我们现在希望小朋友排队 以 高 矮 高 矮 顺序排列 每一个 高 位
  • java代码转python代码(需要手动调整)

    xff08 1 xff09 windows 环境安装工具 python版本 7 先下载antlr http www antlr3 org download antlr 3 1 3 tar gz 链接 https pan baidu com
  • 统计每个月兔子的总数

    题目描述 有一只兔子 从出生后第3个月起每个月都生一只兔子 小兔子长到第三个月后每个月又生一只兔子 假如兔子都不死 问每个月的兔子总数为多少 输入描述 输入int型表示month 输出描述 输出兔子总数int型 示例1 输入 9 输出 34
  • 字符串运用-密码截取

    题目描述 Catcher 是MCA国的情报员 他工作时发现敌国会用一些对称的密码进行通信 比如像这些ABBA ABA A 123321 但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解 比如进行下列变化 ABBA gt 12AB
  • 吃火锅 入职后导师

    入职后导师会请你一起吃火锅 有m个菜品 你的手速是n 即吃完一道菜 要经过时间n才能再去夹菜 任一菜品下锅后 都需要经过对应时间才能熟 过时就不可口了 怎样可以吃到最多的可口的菜 输入 第1行 菜品数量m 手速n 第2 m行 每行两个数字
  • A. Serval and Bus

    outputstandard output It is raining heavily But this is the first day for Serval who just became 3 years old to go to th
  • Redis理解

    Redis集群是一个不支持处理多个Keys的命令 因为这需要在不同的节点间移动数据 从而达不到像Redis那样的性能 xff0c 在高负载的情况下会导致错误 Redis配置文件中的一些属性 xff1a IINCLUDES模块 include
  • 甲方安全之仿真钓鱼演练(邮件+网站钓鱼)

    文章目录 一 简介1 1 前言1 2 整体思路1 3 演练所需1 4 各邮件厂商日群发上限 二 钓鱼平台搭建及配置2 1 gophish平台搭建2 2 收件目标配置 xff08 User amp Groups xff09 2 3 发信邮箱配
  • 一篇文章告诉你大数据的重要性

    在这10年中 xff0c 几乎所有行业都或多或少的受到大数据的影响 科技渗透到各个领域 xff0c 并且已经成为每个处理单元的必要元素 谈到IT行业 xff0c 具体来说 xff0c 软件和自动化是较基本的术语 xff0c 并且用于处理循环
  • 运行python代码import cv2时报错的解决方法

    我这枚python小白最近尝试使用python进行图像处理 xff0c 我是win7 43 python3 8运行环境 xff0c 运行网上的代码一直报错 xff1a ImportError No module named cv2 后来查了
  • 2、创建视图(CREATE VIEW)

    创建视图是指在已经存在的 MySQL 数据库表上建立视图 视图可以建立在一张表中 xff0c 也可以建立在多张表中 基本语法 可以使用 CREATE VIEW 语句来创建视图 语法格式如下 xff1a span class token ke
  • python ——批量读取相同格式文件(多个文件夹/单个文件夹)---nc文件为例

    在处理多个相同格式的文件时 xff0c python中的许多模块可以为我们提供很多遍历 比如 xff0c 我们想读取一个文件夹下多个相同格式的文件时 可以使用os模块 xff0c span class token keyword impor
  • python 绘制世界地图,添加海岸线、陆地、投影

    python 绘制世界地图 xff0c 添加海岸线 陆地 投影等 tips xff1a 最近在学习python的模块 xff1a matplotlib 为画全球的要素分布做准备 在此之前 xff0c 先学习一下如何绘制世界地图 xff0c

随机推荐