內(nèi)核參數(shù)overcommit_memory
內(nèi)存分配策略
0:表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用枫甲;如果有足夠的可用內(nèi)存源武,內(nèi)存申請(qǐng)?jiān)试S;否則想幻,內(nèi)存申請(qǐng)失敗粱栖,并把錯(cuò)誤返回給應(yīng)用進(jìn)程。
1: 表示內(nèi)核允許分配所有的物理內(nèi)存脏毯,而不管當(dāng)前的內(nèi)存狀態(tài)如何闹究。
2: 表示內(nèi)核允許分配超過(guò)所有物理內(nèi)存和交換空間總和的內(nèi)存
什么是Overcommit和OOM
Linux對(duì)大部分申請(qǐng)內(nèi)存的請(qǐng)求都回復(fù)"yes",以便能跑更多更大的程序食店。因?yàn)樯暾?qǐng)內(nèi)存后跋核,并不會(huì)馬上使用內(nèi)存。這種技術(shù)叫做Overcommit叛买。當(dāng)linux發(fā)現(xiàn)內(nèi)存不足時(shí)砂代,會(huì)發(fā)生OOM killer(OOM=out-of-memory)。它會(huì)選擇殺死一些進(jìn)程(用戶態(tài)進(jìn)程率挣,不是內(nèi)核線程)刻伊,以便釋放內(nèi)存。
當(dāng)oom-killer發(fā)生時(shí)椒功,linux會(huì)選擇殺死哪些進(jìn)程捶箱?選擇進(jìn)程的函數(shù)是oom_badness函數(shù)(在mm/oom_kill.c中),該函數(shù)會(huì)計(jì)算每個(gè)進(jìn)程的點(diǎn)數(shù)(0~1000)动漾。點(diǎn)數(shù)越高丁屎,這個(gè)進(jìn)程越有可能被殺死。每個(gè)進(jìn)程的點(diǎn)數(shù)跟oom_score_adj有關(guān)旱眯,而且oom_score_adj可以被設(shè)置(-1000最低晨川,1000最高)。
redis BGsave失敗后删豺,可以采取這樣的策略
很簡(jiǎn)單共虑,按提示的操作(將vm.overcommit_memory 設(shè)為1)
- 編輯/etc/sysctl.conf ,改vm.overcommit_memory=1呀页,然后sysctl -p 使配置文件生效
- sysctl vm.overcommit_memory=1
- echo 1 > /proc/sys/vm/overcommit_memory