云主機(jī)的13G內(nèi)存去哪里了?聊聊Hugepages大頁(yè)內(nèi)存管理

一、云主機(jī)13G內(nèi)存被無(wú)故占用

今天群里的小伙伴在巡檢云主機(jī)時(shí)發(fā)現(xiàn)一臺(tái)云主機(jī)的內(nèi)存監(jiān)控報(bào)警了,登陸該云主機(jī)系統(tǒng)后發(fā)現(xiàn)系統(tǒng)內(nèi)存被莫名占用了13G,空閑內(nèi)存為“0”,所以導(dǎo)致監(jiān)控報(bào)警,如圖一所示:

云主機(jī)的13G內(nèi)存去哪里了?聊聊Hugepages大頁(yè)內(nèi)存管理

圖一 內(nèi)存使用截圖

接著小伙伴查看了進(jìn)程相關(guān)信息,如圖二所示,發(fā)現(xiàn)所有進(jìn)程占用都是零點(diǎn)幾,沒(méi)有超過(guò)1G的,13G的內(nèi)存去哪里了?

云主機(jī)的13G內(nèi)存去哪里了?聊聊Hugepages大頁(yè)內(nèi)存管理

圖二 系統(tǒng)進(jìn)程截圖

懷疑是系統(tǒng)緩存占用,于是重啟了該云主機(jī);但在重啟云主機(jī)后還是一樣的現(xiàn)象,查看內(nèi)存使用的used項(xiàng)還是13G,空閑變?yōu)?7G,如圖三所示,。

云主機(jī)的13G內(nèi)存去哪里了?聊聊Hugepages大頁(yè)內(nèi)存管理

圖三 重啟云主機(jī)后內(nèi)存使用截圖

這證明不是緩存占用,那該云主機(jī)的13G被誰(shuí)用了?

二、揭秘云主機(jī)的13G內(nèi)存

從上面的進(jìn)程信息中我們可以看出,這臺(tái)云主機(jī)主要運(yùn)行的是oracle數(shù)據(jù)庫(kù),稍后有oracle經(jīng)驗(yàn)的人都有所了解,在oracle部署和使用時(shí)往往需要配置HugePages,HugePages對(duì)于Linux上提升Oracle數(shù)據(jù)庫(kù)性能是至關(guān)重要的。在系統(tǒng)中執(zhí)行:grep HugePages /proc/meminfo命令,結(jié)果如圖四所示,看到了HugePages _Total是6708,這個(gè)數(shù)字同13G還有差距,但感覺(jué)離答案進(jìn)了一步!

云主機(jī)的13G內(nèi)存去哪里了?聊聊Hugepages大頁(yè)內(nèi)存管理

圖四 查看HugePages的信息

繼續(xù)學(xué)習(xí)一下相關(guān)參數(shù)

HugePages_Total是指系統(tǒng)總共預(yù)留了多少HugePages,HugePages_Free指當(dāng)前還有多少HugePages未分配(allocate),HugePages_Rsvd是指有多少HugePages是系統(tǒng)承諾了會(huì)分配給程序(commitment to allocate),但實(shí)際并未分配,HugePages_Surp指超分的頁(yè)。

2.1大頁(yè)內(nèi)存示例數(shù)據(jù)解析

下面用實(shí)際的數(shù)據(jù)來(lái)進(jìn)行說(shuō)明,示例如圖五所示。

云主機(jī)的13G內(nèi)存去哪里了?聊聊Hugepages大頁(yè)內(nèi)存管理

圖五 示例HugePages的信息

從上面的信息可以得出以下結(jié)論:當(dāng)前hugepages一共實(shí)際使用了13007-11813=1194個(gè)pages(不包括預(yù)留的),預(yù)留了3372個(gè)pages。永遠(yuǎn)不會(huì)使用達(dá)到了11813-3372=8841個(gè)pages。每個(gè)page大小為2M,也就是說(shuō)有接近16.5G的hugepages內(nèi)存被浪費(fèi)了(因?yàn)閔ugepages無(wú)法swap,所以不能被其它程序所使用)。換句話(huà)說(shuō):當(dāng)前系統(tǒng)使用中或者即將被使用的hugepages的總和為HugePages_Total-HugePages_Free+HugePages_Rsvd=13007-11813+3372=4566個(gè)pages。

2.2終于找到13G內(nèi)存

回到先前的云主機(jī),Total是6708,每個(gè)page大小為2M,那6708*2M/1024≈13G,哇!終于找到13G內(nèi)存了!原來(lái)是被系統(tǒng)的大頁(yè)內(nèi)存占用了,群里的小伙伴也確認(rèn)了,如圖六所示。

云主機(jī)的13G內(nèi)存去哪里了?聊聊Hugepages大頁(yè)內(nèi)存管理

圖六 小伙伴確認(rèn)截圖

群里的小伙伴們也都學(xué)到“HugePages”這一招,群主覺(jué)得有必須同大家分享一下,也歡迎大家加入華云的技術(shù)群,請(qǐng)關(guān)注華云官方公眾號(hào),來(lái)一起交流學(xué)習(xí)吧!

三、大頁(yè)內(nèi)存擴(kuò)展學(xué)習(xí)

在Linux中大頁(yè)分為兩種:Huge pages(標(biāo)準(zhǔn)大頁(yè))和Transparent Huge pages(透明大頁(yè))。內(nèi)存是以塊即頁(yè)的方式進(jìn)行管理的,當(dāng)前大部分系統(tǒng)默認(rèn)的頁(yè)大小為4096bytes即4K。1MB內(nèi)存等于256頁(yè);1GB內(nèi)存等于256000頁(yè)。

3.1Huge pages

Huge pages是從Linux Kernel2.6后被引入的,目的是通過(guò)使用大頁(yè)內(nèi)存來(lái)取代傳統(tǒng)的4kb內(nèi)存頁(yè)面,以適應(yīng)越來(lái)越大的系統(tǒng)內(nèi)存,讓操作系統(tǒng)可以支持現(xiàn)代硬件架構(gòu)的大頁(yè)面容量功能。

Huge pages有兩種格式大?。?MB和1GB,2MB頁(yè)塊大小適合用于GB大小的內(nèi)存,1GB頁(yè)塊大小適合用于TB級(jí)別的內(nèi)存;2MB是默認(rèn)的頁(yè)大小。

3.2Transparent Huge Pages

Transparent Huge Pages縮寫(xiě)THP,這個(gè)是RHEL6開(kāi)始引入的一個(gè)功能,在Linux6上透明大頁(yè)是默認(rèn)啟用的。

由于Huge pages很難手動(dòng)管理,而且通常需要對(duì)代碼進(jìn)行重大的更改才能有效的使用,因此RHEL6開(kāi)始引入了Transparent Huge Pages(THP),THP是一個(gè)抽象層,能夠自動(dòng)創(chuàng)建、管理和使用傳統(tǒng)大頁(yè)。

THP為系統(tǒng)管理員和開(kāi)發(fā)人員減少了很多使用傳統(tǒng)大頁(yè)的復(fù)雜性,因?yàn)門(mén)HP的目標(biāo)是改進(jìn)性能,因此其它開(kāi)發(fā)人員(來(lái)自社區(qū)和紅帽)已在各種系統(tǒng)、配置、應(yīng)用程序和負(fù)載中對(duì)THP進(jìn)行了測(cè)試和優(yōu)化。這樣可讓THP的默認(rèn)設(shè)置改進(jìn)大多數(shù)系統(tǒng)配置性能。但是,不建議對(duì)數(shù)據(jù)庫(kù)工作負(fù)載使用THP。

這兩者最大的區(qū)別在于:標(biāo)準(zhǔn)大頁(yè)管理是預(yù)分配的方式,而透明大頁(yè)管理則是動(dòng)態(tài)分配的方式。

如果云主機(jī)跑的是oracle數(shù)據(jù),建議大家還是系統(tǒng)去學(xué)習(xí)一下oracle的文檔,會(huì)有相關(guān)的說(shuō)明。

3.3大頁(yè)內(nèi)存常用相關(guān)指令

查看大頁(yè)內(nèi)存使用情況

#grep Huge /proc/meminfo

查看系統(tǒng)numa架構(gòu),cpu分配情況

#numactl --hradware

掛載大頁(yè),重啟后失效

#mkdir -p /mnt/huge

#mount -t hugetlbfs nodev /mnt/huge

永久掛在大頁(yè)內(nèi)存

#vim /etc/fstab

#nodev /mnt/huge hugetlbfs defaults 0 0 #掛載2M大頁(yè)

#nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0 #掛載1G的大頁(yè)

查看大頁(yè)內(nèi)存掛載情況

#cat /proc/mounts

查找正在使用大頁(yè)的進(jìn)程

#find /proc/*/smaps | xargs grep -ril "anon_hugepage"

取消掛載

#umount /dev/hugepages

#umount /mnt/huge

四、參考文檔:

HugePages on Oracle Linux 64-bit

(免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。
任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書(shū)面權(quán)利通知或不實(shí)情況說(shuō)明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開(kāi)相關(guān)鏈接。 )