分类: 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