开发者社区 问答 正文

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 7417 分享
分享
版权
举报
阿里云 AI 助理回答

根据您描述的问题和解决过程,遇到Linux系统提示无法递交内存的情况,主要是由于内核参数overcommit_memory的设置影响了内存分配策略。当该参数设置为2时,系统会限制虚拟地址空间的分配以避免过度承诺内存,这可能导致某些需要大量虚拟地址空间的操作(如执行命令或运行大型程序)因内存分配失败而报错。

您采取的解决办法是将overcommit_memory参数改回0或者注释掉之前修改的配置,并通过sysctl -p命令使更改生效,或者直接写入/proc/sys/vm/overcommit_memory来即时改变这个值。设置为0后,系统在分配虚拟内存时会更加灵活,会根据剩余内存情况来决定是否分配,从而解决了无法递交足够内存的问题。

这里有几个额外的建议,可以帮助更好地管理ECS实例上的内存使用:

  1. 监控内存使用:利用阿里云ECS监控服务或第三方工具持续监控实例的内存使用情况,及时发现潜在的内存瓶颈。

  2. 优化应用程序:如果应用频繁遇到内存分配问题,考虑优化代码逻辑,减少不必要的内存占用,或者采用更高效的内存管理方式。

  3. 调整Swap空间:适当增加Swap空间可以在物理内存不足时,作为临时缓冲区使用,但需注意过度依赖Swap会影响性能。

  4. 使用弹性伸缩服务:对于资源需求波动较大的应用,可以考虑结合阿里云的弹性伸缩服务,根据业务负载自动调整ECS实例的规格,包括内存大小,以应对高峰流量。

  5. 合理规划实例规格:在创建ECS实例时,根据应用的实际需求选择合适的内存配置,避免因内存不足导致的服务不稳定。

通过上述方法,您可以更有效地管理和利用ECS实例的内存资源,确保应用稳定运行。您也可以通过ECS一键诊断全面排查并修复ECS问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等