linux 内核参数 rss,Linux控制内存的内核参数

环境

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值