【Overcommit和OOM】
?????? ?在Unix中蜕企,當(dāng)一個(gè)用戶進(jìn)程使用malloc()函數(shù)申請(qǐng)內(nèi)存時(shí)奋构,假如返回值是NULL,說(shuō)明當(dāng)前系統(tǒng)沒有足夠的可用內(nèi)存桃笙。一般程序都會(huì)判斷malloc返回值是null時(shí)便報(bào)錯(cuò)退出虚循。
? ?????因?yàn)檫M(jìn)程申請(qǐng)內(nèi)存后,可能并不會(huì)馬上使用內(nèi)存泉沾。所以有時(shí)候,為了系統(tǒng)能夠運(yùn)行更多的程序聋伦,它可以對(duì)于超出自身剩余內(nèi)存的malloc請(qǐng)求也返回成功。這種行為叫做Overcommit衙解。
? ? ? ?Linux下overcommit有三種策略:
?????? ??0. 啟發(fā)式策略荐绝。合理的overcommit會(huì)被接受,不合理的overcommit會(huì)被拒絕。?
????? ? ?1. 任何overcommit都會(huì)被接受。?
????? ? ?2. 當(dāng)系統(tǒng)分配的內(nèi)存超過(guò)swap+N%*物理RAM(N%由vm.overcommit_ratio決定)時(shí)愧旦,會(huì)拒絕commit遭庶。?
? ????? Overcommit采用哪種策略可以通過(guò)/proc/sys/vm/overcommit_memory設(shè)置(可將該參數(shù)設(shè)置為0/1/2权埠,對(duì)應(yīng)上面3中策略)叔扼。 ? ? Overcommit的百分比由vm.overcommit_ratio設(shè)置。如:
? ?# echo 2 > /proc/sys/vm/overcommit_memory????
? ?# echo 60 > /proc/sys/vm/overcommit_ratio
【大頁(yè)內(nèi)存與快表TLB】
? ?????進(jìn)程訪問(wèn)內(nèi)存時(shí),傳遞給CPU的是進(jìn)程的虛擬內(nèi)存地址丑念,CPU需要將虛擬內(nèi)存轉(zhuǎn)換為物理內(nèi)存地址,再去物理內(nèi)存獲取數(shù)據(jù)。從虛擬內(nèi)存到物理內(nèi)存的映射就依賴頁(yè)表。
? ? ? ?頁(yè)表是保存在物理內(nèi)存中的一個(gè)頁(yè)表?xiàng)l目集合事富。如果要訪問(wèn)的虛擬內(nèi)存頁(yè)之前已經(jīng)映射到了物理內(nèi)存,則該映射關(guān)系會(huì)被記錄到頁(yè)表中流部。后續(xù)再訪問(wèn)該虛擬內(nèi)存地址時(shí)戚绕,CPU會(huì)通過(guò)頁(yè)表中查找到的映射關(guān)系得到對(duì)應(yīng)的物理地址;如果映射關(guān)系不存在枝冀,那么就會(huì)發(fā)生缺頁(yè)中斷舞丛,中斷處理程序會(huì)完成虛擬內(nèi)存到物理內(nèi)存你的映射耘子,并記錄到頁(yè)表中以供后續(xù)查詢。
? ? ? ?但是內(nèi)存的處理速度相比CPU來(lái)說(shuō)還是慢很多球切。如果CPU每次訪問(wèn)內(nèi)存都要查詢頁(yè)表去獲取映射關(guān)系谷誓,那么必然會(huì)對(duì)性能產(chǎn)生較大的影響。TLB就是為了解決這個(gè)問(wèn)題出現(xiàn)的吨凑。
? ?????TLB(Translation Lookaside Buffer),旁路緩沖器,又稱快表捍歪。TLB的作用是作為內(nèi)存頁(yè)表的緩沖。它是CPU中的一個(gè)內(nèi)存管理單元怀骤,訪問(wèn)速度會(huì)和CPU處于一個(gè)量級(jí)费封,遠(yuǎn)高于內(nèi)存焕妙。CPU需要獲取內(nèi)存映射時(shí)蒋伦,就會(huì)先去訪問(wèn)TLB,如果TLB中已經(jīng)緩存了所需的地址映射焚鹊,那么就稱為TLB命中痕届,這樣CPU就可以很快的得到虛擬地址對(duì)應(yīng)的物理地址,減少了對(duì)實(shí)際內(nèi)存頁(yè)表的訪問(wèn)末患,提高了效率研叫。(實(shí)際上TLB后面還有多級(jí)的高速緩存,最后才是到實(shí)際內(nèi)存)
? ? ? ? ?而由于成本等因素限制璧针,TLB不可能做的很大嚷炉,一般只能緩存512個(gè)頁(yè)表項(xiàng),也就是記錄512個(gè)虛擬內(nèi)存頁(yè)到物理內(nèi)存頁(yè)的映射關(guān)系探橱。一般情況下申屹,操作系統(tǒng)的默認(rèn)內(nèi)存頁(yè)大小為4K。這樣的話隧膏,TLB中能緩存的最多也就只有2M的內(nèi)存映射關(guān)系哗讥。如果訪問(wèn)這2M的內(nèi)存,TLB可以命中胞枕,那么CPU可以很快的獲取映射關(guān)系杆煞;如果訪問(wèn)這2M以外的內(nèi)存,那么TLB的作用就失去了腐泻。為了充分發(fā)揮TLB的作用决乎,就引入了大頁(yè)內(nèi)存。
????? ? 大頁(yè)內(nèi)存(HugePages)的思想就是通過(guò)增大內(nèi)存頁(yè)的大小派桩,來(lái)增加TLB中緩存的內(nèi)存大小瑞驱,從而增加TLB命中的概率,提高性能窄坦。比如將內(nèi)存頁(yè)的大小從4K增大到2M唤反,那么TLB中512個(gè)頁(yè)表項(xiàng)就能緩存1G內(nèi)存地址空間的映射凳寺,這樣相比原來(lái)的2M,TLB命中的概率大大增加彤侍。
? ??????大頁(yè)內(nèi)存可以在/proc/meminfo中查看肠缨。