仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 513|回复: 8
打印 上一主题 下一主题

[CentOS(社区)] 带来一篇当CentOS办事器用尽内存

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 20:27:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!
大概你很少面对这一情形,可是一旦云云,你必定晓得出甚么错了:可用内存不敷大概说内存用尽(OOM)。了局十分典范:你不克不及再分派内存,内核会杀失落一个义务(通常为正在运转谁人)。一样平常半跟着大批的互换读写,你能够从屏幕和磁盘意向看出来。

这个成绩上面隐含着其余成绩:你必要分派几内存?操纵体系给你分派了几?OOM的基础缘故原由很复杂,你请求的内存多于体系可用量。我得说是假造内存,由于互换分区也包含在内。


懂得OOM

入手下手懂得OOM,起首尝尝这段会分派大批内存的代码:

#include<stdio.h>

#include<stdlib.h>


#defineMEGABYTE1024*1024


intmain(intargc,char*argv[])

{

void*myblock=NULL;

intcount=0;


while(1)

{

myblock=(void*)malloc(MEGABYTE);

if(!myblock)break;

printf(”Currentlyallocating%dMBn”,++count);

}


exit(0);

}


编译一下,运转它以后等一会。体系日夕会OOM。然后尝尝上面这段,分派大批内存并用1写进:


#include<stdio.h>

#include<stdlib.h>


#defineMEGABYTE1024*1024


intmain(intargc,char*argv[])

{

void*myblock=NULL;

intcount=0;


while(1)

{

myblock=(void*)malloc(MEGABYTE);

if(!myblock)break;

memset(myblock,1,MEGABYTE);

printf(”Currentlyallocating%dMBn”,++count);

}

exit(0);


}

发明不同了么?A比B分派了更多内存。并且B被杀失落的更早一些。两个步伐都由于没有可用内存而加入。更正确的说,A由于失利的malloc()而文雅的加入了,B是被OOM杀手干失落了。

起首察看分派的内存块数。假定你利用256M内存,888M互换分区(我的情形),B停止时:

Currentlyallocating1081MB

而A停止时:

Currentlyallocating3056MB

A怎样弄来的别的1975M?我哄人?没有!假如你细心看,你会发明B用1填满失掉的内存,而A几近不拿他们干甚么。Linux同意推延的页分派,换句话说,只当你真的要用的时分才入手下手分派举措,好比写进数据时。以是,除非写进数据,不然你能够一向要更多内存。术语称之为悲观的内存分派。

检察/proc/<pid>/status来确认信息。

$
cat/proc/<pidofprogramA>/status
VmPeak:3141876kB

VmSize:3141876kB

VmLck:0kB

VmHWM:12556kB

VmRSS:12556kB

VmData:3140564kB

VmStk:88kB

VmExe:4kB

VmLib:1204kB

VmPTE:3072kB

这是在B被杀之前的纪录:

$cat/proc/<pidofprogramB>/status

VmPeak:1072512kB

VmSize:1072512kB

VmLck:0kB

VmHWM:234636kB

VmRSS:204692kB

VmData:1071200kB

VmStk:88kB

VmExe:4kB

VmLib:1204kB

VmPTE:1064kB
VmRSS必要再具体点注释。RSS是ResidentSetSize,也就是以后历程在内存平分配的块。也注重,在B到OOM之前已用失落了几近全体互换分区,而A基本没用。很分明malloc()除保存内存以外甚么也没做。

别的一个成绩是:既然没有写页,为何有3056M这个下限?这表露出别的一个限定。在32位体系上,内存地点有4GB。个中0-3GB是用户利用,3-4GB为内核空间。

注重:有内核补钉能够完成全体分派4GB给用户空间,必要一些高低文切换的开支。

OOM的结论:


  • VM中没有可用页。
  • 没有充足的用户地点空间。
  • 以上二者。
以是制止这些情形的战略是:


  • 晓得用户空间有几。
  • 晓得可用页有几。
当利用malloc()请求内存块时,你实践是要runtime的C库检察是不是有事后分派的块可用。这个块尺寸最少应该和用户哀求一样年夜。假如有,malloc()会指派这个块给用户并标志为利用。不然malloc()必需经由过程扩大仓库heap失掉更多内存。一切请求的块都放在仓库里。不要和stack搅浑,stack是用来存储当地变量和函数前往地点的。

Heap究竟在那里?能够看看历程地点映照:

$
cat/proc/self/maps
0039d000-003b2000r-xp0000000016:411080084/lib/ld-2.3.3.so

003b2000-003b3000r-xp0001400016:411080084/lib/ld-2.3.3.so

003b3000-003b4000rwxp0001500016:411080084/lib/ld-2.3.3.so

003b6000-004cb000r-xp0000000016:411080085/lib/tls/libc-2.3.3.so

004cb000-004cd000r-xp0011500016:411080085/lib/tls/libc-2.3.3.so

004cd000-004cf000rwxp0011700016:411080085/lib/tls/libc-2.3.3.so

004cf000-004d1000rwxp004cf00000:000

08048000-0804c000r-xp0000000016:41130592/bin/cat

0804c000-0804d000rwxp0000300016:41130592/bin/cat

0804d000-0806e000rwxp0804d00000:000[heap]

b7d95000-b7f95000r-xp0000000016:412239455/usr/lib/locale/locale-archive

b7f95000-b7f96000rwxpb7f9500000:000

b7fa9000-b7faa000r-xpb7fa900000:000[vdso]

bfe96000-bfeab000rw-pbfe9600000:000[stack]
这是cat实践的映照散布。你的了局大概纷歧样,取决于内核和调剂的C库。比来的内核(2.6.x)都有标志,可是不克不及完整依附这些标志。

Heap基础上是没有分派给步伐映照和stack的自在空间,以是会减少可用的地点空间,也就是3GB减往一切映照失落的局部。

HowdoesthemapforprogramAlookwhenitcan’tallocatemorememoryblocks?Withatrivialchangetopausetheprogram(seeloop.candloop-calloc.c)justbeforeitexits,thefinalmapis:

当A不克不及分派内存块时看起来甚么模样?对步伐小小调剂一下,停息上去看看:

0009a000-0039d000rwxp0009a00000:000--------->(allocatedblock)

0039d000-003b2000r-xp0000000016:411080084/lib/ld-2.3.3.so

003b2000-003b3000r-xp0001400016:411080084/lib/ld-2.3.3.so

003b3000-003b4000rwxp0001500016:411080084/lib/ld-2.3.3.so

003b6000-004cb000r-xp0000000016:411080085/lib/tls/libc-2.3.3.so

004cb000-004cd000r-xp0011500016:411080085/lib/tls/libc-2.3.3.so

004cd000-004cf000rwxp0011700016:411080085/lib/tls/libc-2.3.3.so

004cf000-004d1000rwxp004cf00000:000

005ce000-08048000rwxp005ce00000:000―――>(allocatedblock)

08048000-08049000r-xp0000000016:061267/test-program/loop

08049000-0804a000rwxp0000000016:061267/test-program/loop

0806d000-b7f62000rwxp0806d00000:000―――>(allocatedblock)

b7f73000-b7f75000rwxpb7f7300000:000―――>(allocatedblock)

b7f75000-b7f76000r-xpb7f7500000:000[vdso]

b7f76000-bf7ee000rwxpb7f7600000:000―――>(allocatedblock)

bf80d000-bf822000rw-pbf80d00000:000[stack]

bf822000-bff29000rwxpbf82200000:000―――>(allocatedblock)
六个假造内存地区VMA,反应出了内存哀求。VMA是一组有不异会见权限的内存页,能够存在于用户空间的恣意地位。

你如今会想,为何是六个,而不是一个年夜地区?有两个缘故原由。第一,一样平常很难在内存中找到这么年夜的“洞”。第二,步伐不会一次请求一切的内存。以是glibc分派器能够在可用的页依据必要自在计划。

为何我说是在可用的页?内存分派是以页的尺寸为单元的。这不是OS的限定,而是内存办理单位MMU的特征。页的尺寸纷歧定,一样平常x86平台是4K。你能够经由过程getpagesize()大概sysconf()(_SC_PAGESIZE参数)取得。libc分派器办理一切页:分红较小的块,指派给历程,开释,等等。好比说,步伐利用4097字节,你必要两个页,只管实践上分派器给你的在4105-4109字节之间。

利用256M内存,无互换分区的情形下,你有65536个可用页。对吗?不完整是。要晓得一些内存地区被内核代码和数据占用,另有一些保存给告急情形大概高优先的需求。dmesg能够显现这些信息:

$
dmesg|grep-nkernel
36:Memory:255716k/262080kavailable(2083kkernelcode,5772kreserved,

637kdata,172kinit,0khighmem)

171:Freeingunusedkernelmemory:172kfreed
<pstyle="font:14px/1.5arial;margin:0px;padding:5px0px0px;text-align:left;color:#333333;text-transform:none;text-indent:0px;letter-spacing:normal;word-spacing:0px;font-size-adjust:none;font-stretch:normal;background-color:#FFFFFF;-webkit-text-stroke-width:0px;">内核代码和数据在初始化时使如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!
简单生活 该用户已被删除
沙发
发表于 2015-1-16 18:06:46 | 只看该作者

带来一篇当CentOS办事器用尽内存

熟悉系统的基本操作,Linux的图形界面直观,操作简便,多加上机练习就可熟悉操作,在Linux下学习办公软件等常用软件。
小魔女 该用户已被删除
板凳
发表于 2015-1-25 22:29:40 | 只看该作者
Windows?是图形界面的,Linux类似以前的?DOS,是文本界面的,如果你运行了图形界面程序X-WINDOWS后,Linux?也能显示图形界面,也有开始菜单、桌面、图标等。
灵魂腐蚀 该用户已被删除
地板
 楼主| 发表于 2015-2-4 15:59:12 | 只看该作者
其实老师让写心得我也没怎么找资料应付,自己想到什么就写些什么,所以不免有些凌乱;很少提到编程,因为那些在实验报告里已经说了,这里再写就多余了。
不帅 该用户已被删除
5#
发表于 2015-2-10 04:25:05 | 只看该作者
这也正是有别的OS得以存在的原因,每个系统都有其自身的优点。?
乐观 该用户已被删除
6#
发表于 2015-2-28 21:44:46 | 只看该作者
对于英语不是很好的读者红旗 Linux、中标Linux这些中文版本比较适合。现在一些Linux网站有一些Linux版本的免费下载,这里要说的是并不适合Linux初学者。
山那边是海 该用户已被删除
7#
发表于 2015-3-10 13:04:32 | 只看该作者
把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。
admin 该用户已被删除
8#
发表于 2015-3-17 12:09:44 | 只看该作者
一定要学好命令,shell是命令语言,命令解释程序及程序设计语言的统称,shell也负责用户和操作系统之间的沟通。
活着的死人 该用户已被删除
9#
发表于 2015-3-24 13:44:53 | 只看该作者
再次,Linux是用C语言编写的,我们有学习C语言的基础,读程序和编写代码方面存在的困难小一点,也是我们能较快掌握的原因之一。?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-1 15:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表