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

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

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

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

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

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

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

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

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

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

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

這證明不是緩存占用,那該云主機的13G被誰用了?

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

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

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

圖四 查看HugePages的信息

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

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

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

下面用實際的數(shù)據(jù)來進行說明,示例如圖五所示。

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

圖五 示例HugePages的信息

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

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

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

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

圖六 小伙伴確認截圖

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

三、大頁內(nèi)存擴展學習

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

3.1Huge pages

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

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

3.2Transparent Huge Pages

Transparent Huge Pages縮寫THP,這個是RHEL6開始引入的一個功能,在Linux6上透明大頁是默認啟用的。

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

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

這兩者最大的區(qū)別在于:標準大頁管理是預分配的方式,而透明大頁管理則是動態(tài)分配的方式。

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

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

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

#grep Huge /proc/meminfo

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

#numactl --hradware

掛載大頁,重啟后失效

#mkdir -p /mnt/huge

#mount -t hugetlbfs nodev /mnt/huge

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

#vim /etc/fstab

#nodev /mnt/huge hugetlbfs defaults 0 0 #掛載2M大頁

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

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

#cat /proc/mounts

查找正在使用大頁的進程

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

取消掛載

#umount /dev/hugepages

#umount /mnt/huge

四、參考文檔:

HugePages on Oracle Linux 64-bit

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