一、云主機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)控報警,如圖一所示:
圖一 內(nèi)存使用截圖
接著小伙伴查看了進程相關(guān)信息,如圖二所示,發(fā)現(xiàn)所有進程占用都是零點幾,沒有超過1G的,13G的內(nèi)存去哪里了?
圖二 系統(tǒng)進程截圖
懷疑是系統(tǒng)緩存占用,于是重啟了該云主機;但在重啟云主機后還是一樣的現(xiàn)象,查看內(nèi)存使用的used項還是13G,空閑變?yōu)?7G,如圖三所示,。
圖三 重啟云主機后內(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還有差距,但感覺離答案進了一步!
圖四 查看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ù)來進行說明,示例如圖五所示。
圖五 示例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)存占用了,群里的小伙伴也確認了,如圖六所示。
圖六 小伙伴確認截圖
群里的小伙伴們也都學到“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)鏈接。 )