开发者社区> 问答> 正文

Linux 执行命令或者程序总是提示无法递交内存


问题描述: Linux 执行命令或者程序总是提示无法递交内存
Linux执行命令或程序总是提示无法递交内存


解决过程:


ECS Linux使用memtester等测试软件压测内存始终无法将内存完整递交,测试3G,实际只能递交1.6G。



实际压测前空闲内存还有很多





当执行压测的时候,执行任何命令都会报错,提示无法分配内存





查看内核参数配置,发现参数overcommit_memory被修改为2





该参数的含义如下:


overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。    
                          
取值为0,系统在为应用进程分配虚拟地址空间时,会判断当前申请的虚拟地址空间大小是否超过剩余内存大小,如果超过,则虚拟地址空间分配失败。因此,也就是如果进程本身占用的虚拟地址空间比较大或者剩余内存比较小时,fork、malloc等调用可能会失败。


取值为1,系统在为应用进程分配虚拟地址空间时,完全不进行限制,这种情况下,避免了fork可能产生的失败,但由于malloc是先分配虚拟地址空间,而后通过异常陷入内核分配真正的物理内存,在内存不足的情况下,这相当于完全屏蔽了应用进程对系统内存状态的感知,即malloc总是能成功,一旦内存不足,会引起系统OOM杀进程,应用程序对于这种后果是无法预测的.


取值为2,则是根据系统内存状态确定了虚拟地址空间的上限,由于很多情况下,进程的虚拟地址空间占用远大小其实际占用的物理内存,这样一旦内存使用量上去以后,对于一些动态产生的进程(需要复制父进程地址空间)则很容易创建失败,如果业务过程没有过多的这种动态申请内存或者创建子进程,则影响不大,否则会产生比较大的影响.


解决办法:


将/etc/sysctl.conf中修改的参数改成0或者注释,然后执行sysctl -p生效配置;如果注释的话需要额外执行如下命令
echo 0 >/proc/sys/vm/overcommit_memory 使新参数生效:





我们再执行memtester压测会发现递交没有问题了,压测3G递交了3G:





执行命令也不再报错了。

展开
收起
云栖徒骇 2016-03-21 10:42:02 7406 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载