内存碎片和LowMem

摘自:http://dbanotes.net/database/linux_outofmemory_oom_killer.html

检查当前LowFree的空闲值:

cat /proc/buddyinfo

Node 0, zone      DMA      4      3      3      2      1      1      0      0      1      1      3

Node 0, zone    DMA32     87     21     23     25     16      8     22     16      3      5     40

实际上,并没有理解,如何解读。

LowMem 区 (也叫 NORMAL ZONE ) 一共 880 MB,而且不能改变(除非用 hugemem 内核)。对于高负载的系统,就可能因为 LowMem 利用不好而引发 OOM Killer 。一个可能原因是 LowFree 太少了,另外一个原因是 LowMem 里都是碎片,请求不到连续的内存区域【根据我遇到的一个案例,一个猜想是 有些应用一次性请求比较大的内存,恰恰又是 880M 之内的,空闲的(LowFree)不够大,就会触发 OOM Killer 出来干活】

实际上,对于高负载的服务器而言,由于大量的数据堆积在内存中,导致整个系统重启,而且在重启之后,出现多次的异常,导致系统宕机。

时间: 2024-10-14 02:14:33

内存碎片和LowMem的相关文章

内存碎片概念及主要避免方式

内存碎片用来描述一个系统中不可用的空闲内存.减少内存碎片的产生可以有效增强嵌入式系统稳定性. 内存分配浪费内存主要分额外开销,内部碎片,外部碎片.  内部碎片是在动态开辟内存时大小四舍五入而产生的多余空间:外部碎片指已经分配内存块之间出现未被使用的差额.在嵌入式系统中外部碎片是编程过程中不可小瞧的敌人. 避免内部碎片的部分解决方式: (1)少用动态内存分配的函数(尽量使用栈空间). (2)分配内存和释放内存尽量在同一个函数. (3)尽量一次性申请较大的内存,而避免反复申请小内存(减少内存分割).

Delphi 的TStringBuilder防止服务器内存碎片化

Delphi 2009+ 的 System.SysUtils提供了一个类似.Net的StringBuilder,用于存储字符数组. 很多人不明白为什么要用TStringBuilder, Delphi中有string,有几乎所有TStringBuilder的功能函数, System.SysUtils中还有TStringHelper方便扩展String,更方便String的使用. 从Delphi提供的源码看,TStringBuilder与string最大的区别是,TStringBuilder是可以预

内存分配方式及内存碎片

什么是内存碎片? 内部碎片的产生:因为所有的内存分配必须起始于可被 4.8 或 16 整除(视 处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户.假设当某个客户请求一个 43 字节的内存块时,因为没有适合大小的内存,所以它可能会获得 44字节.48字节等稍大一点的字节,因此由所需大小四舍五入而产生的多余空间就叫内部碎片.外部碎片的产生: 频繁的分配与回收物理页面会导致大量的.连续且小的页面块夹杂在已分配的页面中间,就会产生外部碎片.假 设

如何减小内存碎片

内存碎片 : 内部碎片(占了不用) 内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间: 内部碎片是处于区域内部或页面内部的存储块.占有这些区域或页面的进程并不使用这个存储块.而在进程占有这块存储块时,系统无法利用它.直到进程释放它,或进程结束时,系统才有可能利用这个存储块. 单道连续分配只有内部碎片.多道固定连续分配既有内部碎片,又有外部碎片. 外部碎片(太小&不连续 ->没法用) 外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间

C++内存泄漏和内存碎片的产生及避免策略

1.内存泄漏的定义   一般我们常说的内存泄漏是指堆内存的泄漏.堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存.应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该 内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了. 2.内存泄漏的后果 程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后

malloc原理和内存碎片

转自:http://www.cnblogs.com/zhaoyl/p/3820852.html malloc原理和内存碎片 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1.检查要访问的虚拟地址是否合法 2.查找/分配一个物理页 3.填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 4.建立映射关系(虚拟地址到物理地址) 重新执行发生缺页中断的那条指令 如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt.  内存分配的原理 从操作系统角度来看

高级语言怎么解决内存碎片呢?

c/c++可以自己管理内存,像nginx可以根据自己的业务特点,为每一个请求分配一个内存池,请求结束,内存池也就可以释放了 python,node.js这样的高级语言怎么解决内存碎片问题呢? 鼓吹node.js的人都会提到node.js有谷歌的v8引擎,他是有多先进,但他没想过v8是为浏览器设计的,他是不会遇到像服务端程序会遇到的内存碎片问题,一个页面不可能一直打开着吧,关掉页面,这些内存就全部释放掉了.服务端程序会遇到内存碎片问题,类似于文件系统,一个4kb的块,只用1kb,另外3kb就浪费掉

linux内存碎片的概念

一般在内核术语中的“碎片”都是基于物理内存而言的,我没有太看懂你得出碎片是针对地址空间这个结论的逻辑.但我认为,既然你知道了malloc是用户空间调用的,那么你所谓的碎片也是从用户空间的视角而言的,但对于用户空间,看到的只有地址空间,其访问的所有地址都是要经过页表的转换后才访问的物理页面,而且malloc分配的地址空间一定的连续的,那么这个所谓的碎片对于用户空间也就没有任何意义了.不知道你纠结的这个“碎片”在你心目中到底是什么意义,另外,你说的“如果地址空间都不连续就更谈不上物理空间连续”,这个

【转载】内存碎片

内存碎片编辑 内存碎片分为:内部碎片和外部碎片 内部碎片 内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间: 内部碎片是处于区域内部或页面内部的存储块.占有这些区域或页面的进程并不使用这个存储块.而在进程占有这块存储块时,系统无法利用它.直到进程释放它,或进程结束时,系统才有可能利用这个存储块. 单道连续分配只有内部碎片.多道固定连续分配既有内部碎片,又有外部碎片. 外部碎片 外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的