一、云主機(jī)13G內(nèi)存被無故占用
今天群里的小伙伴在巡檢云主機(jī)時發(fā)現(xiàn)一臺云主機(jī)的內(nèi)存監(jiān)控報警了,登陸該云主機(jī)系統(tǒng)后發(fā)現(xiàn)系統(tǒng)內(nèi)存被莫名占用了13G,空閑內(nèi)存為“0”,所以導(dǎo)致監(jiān)控報警,如圖一所示:
圖一 內(nèi)存使用截圖
接著小伙伴查看了進(jìn)程相關(guān)信息,如圖二所示,發(fā)現(xiàn)所有進(jìn)程占用都是零點(diǎn)幾,沒有超過1G的,13G的內(nèi)存去哪里了?
圖二 系統(tǒng)進(jìn)程截圖
懷疑是系統(tǒng)緩存占用,于是重啟了該云主機(jī);但在重啟云主機(jī)后還是一樣的現(xiàn)象,查看內(nèi)存使用的used項(xiàng)還是13G,空閑變?yōu)?7G,如圖三所示,。
圖三 重啟云主機(jī)后內(nèi)存使用截圖
這證明不是緩存占用,那該云主機(jī)的13G被誰用了?
二、揭秘云主機(jī)的13G內(nèi)存
從上面的進(jìn)程信息中我們可以看出,這臺云主機(jī)主要運(yùn)行的是oracle數(shù)據(jù)庫,稍后有oracle經(jīng)驗(yàn)的人都有所了解,在oracle部署和使用時往往需要配置HugePages,HugePages對于Linux上提升Oracle數(shù)據(jù)庫性能是至關(guān)重要的。在系統(tǒng)中執(zhí)行:grep HugePages /proc/meminfo命令,結(jié)果如圖四所示,看到了HugePages _Total是6708,這個數(shù)字同13G還有差距,但感覺離答案進(jìn)了一步!
圖四 查看HugePages的信息
繼續(xù)學(xué)習(xí)一下相關(guān)參數(shù)
HugePages_Total是指系統(tǒng)總共預(yù)留了多少HugePages,HugePages_Free指當(dāng)前還有多少HugePages未分配(allocate),HugePages_Rsvd是指有多少HugePages是系統(tǒng)承諾了會分配給程序(commitment to allocate),但實(shí)際并未分配,HugePages_Surp指超分的頁。
2.1大頁內(nèi)存示例數(shù)據(jù)解析
下面用實(shí)際的數(shù)據(jù)來進(jìn)行說明,示例如圖五所示。
圖五 示例HugePages的信息
從上面的信息可以得出以下結(jié)論:當(dāng)前hugepages一共實(shí)際使用了13007-11813=1194個pages(不包括預(yù)留的),預(yù)留了3372個pages。永遠(yuǎn)不會使用達(dá)到了11813-3372=8841個pages。每個page大小為2M,也就是說有接近16.5G的hugepages內(nèi)存被浪費(fèi)了(因?yàn)閔ugepages無法swap,所以不能被其它程序所使用)。換句話說:當(dāng)前系統(tǒng)使用中或者即將被使用的hugepages的總和為HugePages_Total-HugePages_Free+HugePages_Rsvd=13007-11813+3372=4566個pages。
2.2終于找到13G內(nèi)存
回到先前的云主機(jī),Total是6708,每個page大小為2M,那6708*2M/1024≈13G,哇!終于找到13G內(nèi)存了!原來是被系統(tǒng)的大頁內(nèi)存占用了,群里的小伙伴也確認(rèn)了,如圖六所示。
圖六 小伙伴確認(rèn)截圖
群里的小伙伴們也都學(xué)到“HugePages”這一招,群主覺得有必須同大家分享一下,也歡迎大家加入華云的技術(shù)群,請關(guān)注華云官方公眾號,來一起交流學(xué)習(xí)吧!
三、大頁內(nèi)存擴(kuò)展學(xué)習(xí)
在Linux中大頁分為兩種:Huge pages(標(biāo)準(zhǔn)大頁)和Transparent Huge pages(透明大頁)。內(nèi)存是以塊即頁的方式進(jìn)行管理的,當(dāng)前大部分系統(tǒng)默認(rèn)的頁大小為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是默認(rèn)的頁大小。
3.2Transparent Huge Pages
Transparent Huge Pages縮寫THP,這個是RHEL6開始引入的一個功能,在Linux6上透明大頁是默認(rèn)啟用的。
由于Huge pages很難手動管理,而且通常需要對代碼進(jìn)行重大的更改才能有效的使用,因此RHEL6開始引入了Transparent Huge Pages(THP),THP是一個抽象層,能夠自動創(chuàng)建、管理和使用傳統(tǒng)大頁。
THP為系統(tǒng)管理員和開發(fā)人員減少了很多使用傳統(tǒng)大頁的復(fù)雜性,因?yàn)門HP的目標(biāo)是改進(jìn)性能,因此其它開發(fā)人員(來自社區(qū)和紅帽)已在各種系統(tǒng)、配置、應(yīng)用程序和負(fù)載中對THP進(jìn)行了測試和優(yōu)化。這樣可讓THP的默認(rèn)設(shè)置改進(jìn)大多數(shù)系統(tǒng)配置性能。但是,不建議對數(shù)據(jù)庫工作負(fù)載使用THP。
這兩者最大的區(qū)別在于:標(biāo)準(zhǔn)大頁管理是預(yù)分配的方式,而透明大頁管理則是動態(tài)分配的方式。
如果云主機(jī)跑的是oracle數(shù)據(jù),建議大家還是系統(tǒng)去學(xué)習(xí)一下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
查找正在使用大頁的進(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)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請進(jìn)一步核實(shí),并對任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對有關(guān)資料所引致的錯誤、不確或遺漏,概不負(fù)任何法律責(zé)任。
任何單位或個人認(rèn)為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權(quán)或存在不實(shí)內(nèi)容時,應(yīng)及時向本網(wǎng)站提出書面權(quán)利通知或不實(shí)情況說明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。 )