问题描述: 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:
执行命令也不再报错了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。