Linux内存申请机制
?
在linux上部署項(xiàng)目的時(shí)候可能會(huì)遇到這么一個(gè)錯(cuò)誤,明明有內(nèi)存,但是報(bào)Segment fault的內(nèi)存錯(cuò)誤,是什么原因呢?
錯(cuò)誤原因毫無(wú)疑問(wèn)就是分配內(nèi)存的時(shí)候內(nèi)存不足,但是使用free 命令去查看系統(tǒng)的內(nèi)存占用卻發(fā)現(xiàn)此時(shí)還有很多內(nèi)存可用.
再使用 ulimit -a 發(fā)現(xiàn)內(nèi)存也并沒有被限制.
我們最終還是在RedHat上找到了答案,需要優(yōu)化系統(tǒng)性能或者深入了解RedHat系列的可以去看看:
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/performance_tuning_guide/
這其實(shí)涉及到系統(tǒng)的內(nèi)存的申請(qǐng)策略問(wèn)題,程序在啟動(dòng)的時(shí)候會(huì)先去申請(qǐng)內(nèi)存,盡管不一定都會(huì)用的到那么多.
如果申請(qǐng)時(shí)發(fā)現(xiàn)無(wú)法申請(qǐng)到足夠的內(nèi)存就會(huì)報(bào)此錯(cuò)誤. 而我們看到的那么多的內(nèi)存為什么申請(qǐng)不到呢? 答案就是被別的程序申請(qǐng)占用了,盡管這些內(nèi)存沒有實(shí)際用到,卻也無(wú)法再讓另外的程序進(jìn)行申請(qǐng).
我們可以使用以下命令查看內(nèi)存申請(qǐng)和可用情況
?
#CommitLimit 表示系統(tǒng)可申請(qǐng)的總內(nèi)存 #Committed_AS為當(dāng)前已經(jīng)申請(qǐng)的內(nèi)存 [root@localhost vm]# cat /proc/meminfo | grep Commit CommitLimit: 3112228 kB Committed_AS: 907096 kB如果確定內(nèi)存確實(shí)夠用的話我們就可以改變overcommit_memory這個(gè)參數(shù)的值來(lái)保證我們的程序可以正常啟動(dòng)。
overcommit_memory
? ? 0:默認(rèn)設(shè)置。
? ? ? ? ?進(jìn)程申請(qǐng)內(nèi)存時(shí),系統(tǒng)會(huì)判斷剩余內(nèi)存多少,
? ? ? ? ?如果有足夠的內(nèi)存,則允許申請(qǐng),否則會(huì)把報(bào)錯(cuò)返回給進(jìn)程。
? ? 1:進(jìn)程申請(qǐng)內(nèi)存時(shí),系統(tǒng)允許分配所有物理內(nèi)存(不考慮當(dāng)前內(nèi)存剩余),
? ? ? ? ?當(dāng)使用內(nèi)存超過(guò)可用內(nèi)存時(shí)再報(bào)錯(cuò)。
? ? 2:進(jìn)程申請(qǐng)內(nèi)存時(shí),系統(tǒng)不允許分配大于swap空間大小以及overcommit_ratio比例大小的總和。
? ? ? ? ?overcommit_ratio比例默認(rèn)50。
overcommit_ratio參數(shù):
? ? 當(dāng)overcommit_memory=2時(shí),該參數(shù)才生效。該參數(shù)決定了系統(tǒng)可用內(nèi)存的大小。
? ? 它有一套專門的計(jì)算公式: 可分配大小=物理內(nèi)存大小*overcommit_ratio/100+swap
? ??
修改內(nèi)核參數(shù)的方法:(三種都可以)
? ? 方法一:
? ? ? ? # vim /etc/sysctl.conf
? ? ? ? ? ?vm.overcommit_memory=1 ? ? ? ? ? ?//有則更改,無(wú)則添加
? ? ? ? # sysctl -p ? ? ? ? ? //使配置文件生效
? ? ? ??
? ? 方法二:
? ? ? ? # sysctl vm.overcommit_memory=1
? ? ? ??
? ? 方法三:
? ? ? ? # echo 1 > /proc/sys/vm/overcommit_memory ?
?
?
?
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Linux内存申请机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中国电子协会考评中心_中国电子学会考评中
- 下一篇: mysql 安装1607_mysql服务