在linux上部署项目的时候可能会遇到这么一个错误,明明有内存,但是报Segment fault的内存错误,是什么原因呢?
错误原因毫无疑问就是分配内存的时候内存不足,但是使用free 命令去查看系统的内存占用却发现此时还有很多内存可用.
再使用 ulimit -a 发现内存也并没有被限制.
我们最终还是在RedHat上找到了答案,需要优化系统性能或者深入了解RedHat系列的可以去看看:
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/performance_tuning_guide/
这其实涉及到系统的内存的申请策略问题,程序在启动的时候会先去申请内存,尽管不一定都会用的到那么多.
如果申请时发现无法申请到足够的内存就会报此错误. 而我们看到的那么多的内存为什么申请不到呢? 答案就是被别的程序申请占用了,尽管这些内存没有实际用到,却也无法再让另外的程序进行申请.
我们可以使用以下命令查看内存申请和可用情况
#CommitLimit 表示系统可申请的总内存
#Committed_AS为当前已经申请的内存
[root@localhost vm]# cat /proc/meminfo | grep Commit
CommitLimit: 3112228 kB
Committed_AS: 907096 kB
如果确定内存确实够用的话我们就可以改变overcommit_memory这个参数的值来保证我们的程序可以正常启动。
overcommit_memory
0:默认设置。
进程申请内存时,系统会判断剩余内存多少,
如果有足够的内存,则允许申请,否则会把报错返回给进程。
1:进程申请内存时,系统允许分配所有物理内存(不考虑当前内存剩余),
当使用内存超过可用内存时再报错。
2:进程申请内存时,系统不允许分配大于swap空间大小以及overcommit_ratio比例大小的总和。
overcommit_ratio比例默认50。
overcommit_ratio参数:
当overcommit_memory=2时,该参数才生效。该参数决定了系统可用内存的大小。
它有一套专门的计算公式: 可分配大小=物理内存大小*overcommit_ratio/100+swap
修改内核参数的方法:(三种都可以)
方法一:
# vim /etc/sysctl.conf
vm.overcommit_memory=1 //有则更改,无则添加
# sysctl -p //使配置文件生效
方法二:
# sysctl vm.overcommit_memory=1
方法三:
# echo 1 > /proc/sys/vm/overcommit_memory