诡异场景:

当你发现程序在申请大段内存的时候,发生申请失败。

这时候你通过查看free -g发现free下的内存还有大量可以使用的内存。

然后你再继续查看ulimit -a的时候,却发现max memroy size为不受限。

这时候你或许会很疑惑,为什么在足够内存的情况下,当申请内存达到一定量的时候,却还是失败呢。

这时候你查看sysctl -a | grep "vm.overcommit_memory",如果你发现值为2,那么问题便是发生在这里了

在我们进行内存申请的时候,如malloc 200m,这时候仅仅是进行内存申请,但实际使用的时候可能仅仅是100m, 意味着有100m并没有真是被分配。

这时候我们通过free 看到使用的也只有100m的内存。但是vm.overcommit_memory其关注的是申请的内存,即200m的内存,这点需要注意。

而vm.overcommit_memory的意思:

  • 0 — 默认设置。内核执行启发式内存过量使用处理,方法是估算可用内存量,并拒绝明显无效的请求。遗憾的是因为内存是使用启发式而非准确算法计算进行部署,这个设置有时可能会造成系统中的可用内存超载。
  • 1 — 内核执行无内存过量使用处理。使用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务的性能。
  • 2 — 内存拒绝等于或者大于总可用 swap 大小以及 overcommit_ratio 指定的物理 RAM 比例的内存请求。如果您希望减小内存过度使用的风险,这个设置就是最好的

值为2下的场景:

公式:CommitLimit = (Physical RAM * vm.overcommit_ratio / 100) + Swap

Physical RAM为当前系统的总物理内存

vm.overcommit_ratio为物理内存的比例,默认为50

Swap为当前系统的总Swap

可以通过查看

grep -i commit /proc/meminfo
CommitLimit:    73955212 kB
Committed_AS:    kB

这里的CommitLimit为当前系统可以申请的总内存,Committed_AS为当前已经申请的内存,记住是申请。

因此当你的free查看有很多大量可用的内存的时候,实际Committed_AS可能已经申请了大量的内存了,在vm.overcommit_memory 2模式下,后续的程序可以申请的剩余内存

为CommitLimit - Commited_AS了。

而vm.overcommit_memory设置为2一般是建议当Swap大于物理内存的时候才进行设置。

而vm.overcommit_memory一般是设置为0模式的。

因此现在你知道该如何查理这种场景了吧。

参考文章:

https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-memory-captun.html

http://linuxperf.com/?p=102

http://engineering.pivotal.io/post/Virtual_memory_settings_in_Linux_-_The_problem_with_Overcommit/

linux 内存分配限制,overcommit_memory 2相关推荐

  1. mysql数据库内存分配_MySQL OOM 系列一 Linux内存分配

    RDS(网易云关系数据库服务)上线已经有一段时间,陆续不断有产品迁入到了RDS中,在线上运维的过程中,也遇到了一些曾经没有考虑到,或者考虑的不全的东西.后续有时间可以分享给大家. 今天想提到的是线上一 ...

  2. linux为系统分配内存,Linux操作系统知识讲解:走进Linux 内存分配算法

    Linux 内存分配算法 内存管理算法--对讨厌自己管理内存的人来说是天赐的礼物 1.内存碎片 1) 基本原理 产生原因:内存分配较小,并且分配的这些小的内存生存周期又较长,反复申请后将产生内存碎片的 ...

  3. 一文读懂 Linux 内存分配全过程

    在<你真的理解内存分配>一文中,我们介绍了 malloc 申请内存的原理,但其在内核怎么实现的呢?所以,本文主要分析在 Linux 内核中对堆内存分配的实现过程. 本文使用 Linux 2 ...

  4. oracle linux内存推荐分配,[20191114]linux内存分配的讨论.txt

    [20191114]linux内存分配的讨论.txt --//链接http://www.itpub.net/thread-2121531-1-1.html上的讨论. # sysctl -p net.i ...

  5. linux内存分配机制,Linux内存分配机制:SLAB / SLUB / SLOB

    Linux内存分配机制:SLAB / SLUB / SLOB [日期:2011-07-15] 来源:Linux社区 作者:do2jiang [字体:大 中 小] slob: introduce the ...

  6. linux内存分配与回收

    大神博客传送门:http://luodw.cc/2016/08/13/linux-cache/ 之前在实习时,听了OOM的分享之后,就对linux内核内存管理充满兴趣:但是这块知识非常庞大,没有一定积 ...

  7. linux内存分配 连续 足够,linux内存池能分配连续物理内存吗

    中. size参数: 内核是基于页技术分配内存,以最佳的利用系统的RAM. linux处理内存分配的方法是:创建一系列的内存对象池,每个池的内存大小事固定的,处理分配请求时,就直接在包含足够大的内存块 ...

  8. linux c语言 glibc 错误 munmap,Linux内存分配小结--malloc、brk、mmap

    Linux的虚拟内存管理有几个关键概念: 1.每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址: 2.虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟空间地址)与物理地址进行 ...

  9. linux内存分配堆栈数据段代码段,linux – LD_PRELOAD堆栈和数据段内存分配

    你好, 我正在编写一个Linux模块(基于名为"Ccontrol"的GitHub项目)来创建缓存分区(a.k.a页面着色),以减轻定时侧通道攻击(用于防止Prime Probe等攻 ...

最新文章

  1. 详解PyTorch编译并调用自定义CUDA算子的三种方式
  2. android 使用浏览器打开指定页面
  3. 转:HTTP协议简介与在python中的使用详解
  4. Linux 普通用户和超级用户的切换
  5. java学习笔记之数组
  6. STM32----摸石头过河系列(三)
  7. Vue3 插槽使用详解
  8. Mac 启动时屏幕上的特殊图像标识都是什么意思
  9. hdu1505 dp:01矩形中最大面积全0矩阵
  10. VISIO各种图标超全(IT行业专用网络及硬件)_工业控制网络的现状
  11. EMC抗扰度性能的EN和IEC标准有哪些?
  12. 简述redis集群的实现原理
  13. 零基础如何用平面设计排版软件PS进行布局构图
  14. gridview的sort_GridView中排序问题
  15. 【转】图像视觉开源代码
  16. 山东理工ACM 1152 C语言实验——求两个整数之和
  17. 卡塔尔世界杯除了没有中国队以外,都是中国元素!
  18. 剑走偏锋——老女人教你另类情人节攻略
  19. 用户体验为什么重要?如何提升产品的用户体验?(写给产品小白)
  20. OSChina 周二乱弹 —— 同在一室不相亲,早晚相见不相识

热门文章

  1. python读docx文件_Python读写docx文件的方法
  2. 我漂!“五险一金”跨省转移攻略!!!
  3. 资产定价Model——随机变量因子
  4. 线上直播丨国际人工智能会议AAAI 2021论文北京预讲会,33场报告+31个Poster等你来...
  5. 介绍一个优质的学习分类网站-学吧导航
  6. 记者讲述iPhone被盗46天后成功找回的经历
  7. 提升python运行效率_斗式提升机(TD、TH、NE型)
  8. C# 将所有的DLL文件 打包到 exe里面,就是说整个项目只有一个exe
  9. 【计算机组成与设计 硬件/软件接口-2】MIPS指令集架构
  10. 怎样将MathType中的公式加入到iBooks Author