Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69954
  • 博文数量: 7
  • 博客积分: 650
  • 博客等级: 上士
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-03 13:35
文章分类

全部博文(7)

文章存档

2013年(6)

2010年(1)

我的朋友

分类: LINUX

2013-02-28 17:19:34

环境

Red Hat Enterprise Linux (RHEL) 5.x (X86)

在 X86 高内存设备中,当用户进程使用 mlock() 在常规区域分配大量内存时,可重新使用的 lowmem 内存可能会不足,而一些系统呼叫将失败并显示“EAGAIN” 等错误。

在 RHEL 5.x (X86) 中,最终用户可以使用 lowmem_reserve_ratio 控制保留的 lowmem。

详细信息

# cat /proc/sys/vm/lowmem_reserve_ratio

256 256 32

DMA Normal 

在常规区域中,将保留 256 页(默认)。

要在常规区域中保留 512 页:

# echo "256 512 32" > /proc/sys/vm/lowmem_reserve_ratio

# cat /proc/sys/vm/lowmem_reserve_ratio

256 512 32

要设置永久值,请编辑 /etc/sysctl.conf 并添加以下内容:

vm.lowmem_reserve_ratio = 256 512 32

# sysctl -p

# cat /proc/sys/vm/lowmem_reserve_ratio

256 512 32

【关于free】

在Linux下查看内存我们一般用free命令:

[root@scs-2 tmp]# free

total used free shared buffers cached

Mem: 3266180 3250004 16176 0 110652 2668236

-/+ buffers/cache: 471116 2795064

Swap: 2048276 80160 1968116

区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是16176KB,已用内存是3250004KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.

第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。如上例:2795064=16176+110652+2668236

我们通过free命令查看机器空闲内存时,会发现free的值很小。这主要是因为,在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。所以,空闲内存=free+buffers+cached=total-used

【关于/proc/ pid/status】

我们可以通过ps –aux或者top查看某个进程占用的虚拟内存VSZ和物理内存RSS,也可以直接查看/proc/pid/status文件得到这些信息。

(KB) 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页

(KB) 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm)

(KB) 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)

(KB) 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm)

(KB) 任务在用户态的栈的大小 (stack_vm)

(KB) 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code)

(KB) 被映像到任务的虚拟内存空间的库的大小 (exec_lib)

 该进程的所有页表的大小,单位:kb

【关于oom killer】

Out-of-Memory (OOM) Killer,就是一层保护机制,用于避免 Linux 在内存不足的时候不至于出太严重的问题,把无关紧要的进程杀掉。

在 32 位CPU 架构下寻址是有限制的。Linux 内核定义了三个区域:

# DMA: 0x00000000 - 0x00999999 (0 - 16 MB)

: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB

: 0x038000000 - <硬件特定>

什么时候会触发oom killer?根据我的搜查,大概就两种情况:

1 当 low memory 被耗尽的时候,即使high memory还有很大的空闲内存

2 low memory里都是碎片,请求不到连续的内存区域

通常的问题是high memory很大仍然会触发oom killer,或者由于碎片触发oom killer,解决办法:

1、升级至64位的 Linux 版本,这是最好的解决方案。

2、如果是32位的 Linux 版本,最好的解决办法就是应用 hugemem kernel,还有一个解决方法设置 /proc/sys/vm/lower_zone_protection 值为250或更高。

# echo "250" > /proc/sys/vm/lower_zone_protection

设置成启动加载,在 /etc/sysctl.conf 中加入

vm.lower_zone_protection = 250

3、最无力的解决办法,就是禁用 oom-killer ,这可能会导致系统挂起,所以要慎重使用。

使 oom-killer 关闭/开启:

# echo "0" > /proc/sys/vm/oom-kill

# echo "1" > /proc/sys/vm/oom-kill

使设置启动时生效,需要在 /etc/sysctl.conf 中加入

vm.oom-kill = 0

阅读(3964) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~