一、云主機13G內存被無故占用
今天群里的小伙伴在巡檢云主機時發現一臺云主機的內存監控報警了,登陸該云主機系統后發現系統內存被莫名占用了13G,空閑內存為“0”,所以導致監控報警,如圖一所示:
圖一 內存使用截圖
接著小伙伴查看了進程相關信息,如圖二所示,發現所有進程占用都是零點幾,沒有超過1G的,13G的內存去哪里了?
圖二 系統進程截圖
懷疑是系統緩存占用,于是重啟了該云主機;但在重啟云主機后還是一樣的現象,查看內存使用的used項還是13G,空閑變為17G,如圖三所示,。
圖三 重啟云主機后內存使用截圖
這證明不是緩存占用,那該云主機的13G被誰用了?
二、揭秘云主機的13G內存
從上面的進程信息中我們可以看出,這臺云主機主要運行的是oracle數據庫,稍后有oracle經驗的人都有所了解,在oracle部署和使用時往往需要配置HugePages,HugePages對于Linux上提升Oracle數據庫性能是至關重要的。在系統中執行:grep HugePages /proc/meminfo命令,結果如圖四所示,看到了HugePages _Total是6708,這個數字同13G還有差距,但感覺離答案進了一步!
圖四 查看HugePages的信息
繼續學習一下相關參數
HugePages_Total是指系統總共預留了多少HugePages,HugePages_Free指當前還有多少HugePages未分配(allocate),HugePages_Rsvd是指有多少HugePages是系統承諾了會分配給程序(commitment to allocate),但實際并未分配,HugePages_Surp指超分的頁。
2.1大頁內存示例數據解析
下面用實際的數據來進行說明,示例如圖五所示。
圖五 示例HugePages的信息
從上面的信息可以得出以下結論:當前hugepages一共實際使用了13007-11813=1194個pages(不包括預留的),預留了3372個pages。永遠不會使用達到了11813-3372=8841個pages。每個page大小為2M,也就是說有接近16.5G的hugepages內存被浪費了(因為hugepages無法swap,所以不能被其它程序所使用)。換句話說:當前系統使用中或者即將被使用的hugepages的總和為HugePages_Total-HugePages_Free+HugePages_Rsvd=13007-11813+3372=4566個pages。
2.2終于找到13G內存
回到先前的云主機,Total是6708,每個page大小為2M,那6708*2M/1024≈13G,哇!終于找到13G內存了!原來是被系統的大頁內存占用了,群里的小伙伴也確認了,如圖六所示。
圖六 小伙伴確認截圖
群里的小伙伴們也都學到“HugePages”這一招,群主覺得有必須同大家分享一下,也歡迎大家加入華云的技術群,請關注華云官方公眾號,來一起交流學習吧!
三、大頁內存擴展學習
在Linux中大頁分為兩種:Huge pages(標準大頁)和Transparent Huge pages(透明大頁)。內存是以塊即頁的方式進行管理的,當前大部分系統默認的頁大小為4096bytes即4K。1MB內存等于256頁;1GB內存等于256000頁。
3.1Huge pages
Huge pages是從Linux Kernel2.6后被引入的,目的是通過使用大頁內存來取代傳統的4kb內存頁面,以適應越來越大的系統內存,讓操作系統可以支持現代硬件架構的大頁面容量功能。
Huge pages有兩種格式大小:2MB和1GB,2MB頁塊大小適合用于GB大小的內存,1GB頁塊大小適合用于TB級別的內存;2MB是默認的頁大小。
3.2Transparent Huge Pages
Transparent Huge Pages縮寫THP,這個是RHEL6開始引入的一個功能,在Linux6上透明大頁是默認啟用的。
由于Huge pages很難手動管理,而且通常需要對代碼進行重大的更改才能有效的使用,因此RHEL6開始引入了Transparent Huge Pages(THP),THP是一個抽象層,能夠自動創建、管理和使用傳統大頁。
THP為系統管理員和開發人員減少了很多使用傳統大頁的復雜性,因為THP的目標是改進性能,因此其它開發人員(來自社區和紅帽)已在各種系統、配置、應用程序和負載中對THP進行了測試和優化。這樣可讓THP的默認設置改進大多數系統配置性能。但是,不建議對數據庫工作負載使用THP。
這兩者最大的區別在于:標準大頁管理是預分配的方式,而透明大頁管理則是動態分配的方式。
如果云主機跑的是oracle數據,建議大家還是系統去學習一下oracle的文檔,會有相關的說明。
3.3大頁內存常用相關指令
查看大頁內存使用情況
#grep Huge /proc/meminfo
查看系統numa架構,cpu分配情況
#numactl --hradware
掛載大頁,重啟后失效
#mkdir -p /mnt/huge
#mount -t hugetlbfs nodev /mnt/huge
永久掛在大頁內存
#vim /etc/fstab
#nodev /mnt/huge hugetlbfs defaults 0 0 #掛載2M大頁
#nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0 #掛載1G的大頁
查看大頁內存掛載情況
#cat /proc/mounts
查找正在使用大頁的進程
#find /proc/*/smaps | xargs grep -ril "anon_hugepage"
取消掛載
#umount /dev/hugepages
#umount /mnt/huge
四、參考文檔:
HugePages on Oracle Linux 64-bit