一、HugePage 介紹
在操作系統Linux環境中,內存是以頁Page的方式進行分配,默認大小爲4K。如果需要比較大的內存空間,則需要進行頻繁的頁分配和管理尋址動作。
HugePage是傳統4K Page的替代方案。顧名思義,是用HugePage可以讓我們有更大的內存分頁大小。無論是HugePage還是傳統的正常Page,這個過程都涉及到OS內存尋址過程。
當一個進程訪問內存的時候,並不是直接進行內存位置訪問,是需要通過Page Table進行轉移變換。在使用HugePage的情況下,PageTable具有了額外的屬性,就是判斷該頁記錄是HugePage還是Regular Page。
二、信息查看
- 系統
uname -r - 查看共享段
ipcs -m - 查看大頁信息
grep Huge /proc/meminfo
三、配製大頁
- 確定內存大小
free -g - 計算HugePages_Total:腳本見401749.1
執行腳本,注意這個過程中要求Oracle所有實例,包括數據庫和ASM都啓動、AMM關閉,以及SGA大小超過100M。 - 修改/etc/security/limits.conf參數文件,添加數據庫實例用戶的memlock限制。
這個過程中使用memlock標記,用於設置每個用戶允許的最大內存使用情況。這個取值可以設置爲數據庫服務器物理內存大小。
注意:可用內存>value(鎖定內存)>=HugePages_Total*Hugepagesize
HugePagesize:
vi /etc/security/limits.conf# 添加 oracle soft memlock value oracle hard memlock value
- 驗證limit
ulimit -l - 更改參數/etc/sysctl.conf
vm.nr_hugepages = HugePages_Total值(見第2步) - 重啓系統及數據庫
- 驗證
grep Huge /proc/meminfo
四、關閉大頁
- 方法一:優先方法是修改/boot/grub/grub.conf文件,在kernel行的後面加上"transparent_hugepage=never":
title Red Hat Enterprise Linux (2.6.32-358.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_xty64-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_xty64/lv_root rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg_xty64/lv_swap transparent_hugepage=never initrd /initramfs-2.6.32-358.el6.x86_64.img
- 在/etc/rc.local中加入下面的代碼行:
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi
- 重啓後校驗:
- cat /sys/kernel/mm/transparent_hugepage/defrag
always [never] - cat /sys/kernel/mm/transparent_hugepage/enabled
always [never]
- cat /sys/kernel/mm/transparent_hugepage/defrag
- 如果結果非預期,可能是由於Linux的ktune和tuned服務所導致。在此種情況下,建議關閉這兩項服務:
service tuned stop
chkconfig tuned off
service ktune stop
chkconfig ktune off或者:
tuned-adm off
五、和 Oracle 的關係
- AMM簡介:SGA 在 Linux中是通過系統共享內存實現,而PGA是通過進程私有空間實現。AMM實際上最大的功能是將SGA和PGA空間調節的通道打通,這必然帶來對原有SGA共享內存方式架構的影響。在AMM時,ipcs –m顯示的虛擬空共享段就是實際效果的一部分。
- AMM & HugePage
AMM是不支持HugePage的,如果強在AMM+HugePage模式下打開數據庫,是會遇到失敗信息。所有使用HugePages必須設置內存參數MEMORY_TARGET / MEMORY_MAX_TARGET 爲 0
如果使用了大內存和SGA,那麼HugePage對提高數據庫性能就非常重要。如果數據庫SGA腳本,比如超過8G(個人經驗:建議SGA>32GB),就需要配置HugePages。配置HugePages 有如下好處:- 大頁和普通頁:傳統頁大小是4K而hugeLTB大小 2048k。這意味着系統需要處理512倍傳統頁面。
- 減少PageTable檢索負載:更小的PageTable意味着更快的檢索定位能力;
- 內存性能提升:Page數量減少、大小的增加,減少了管理過程的複雜性,進一步減少了瓶頸出現的概率;
- 非Swap內存:當開啓HugePage的時候,HugePage是不會Swap的;
- 減少Page Table空間負載:在PageTable管理中,每條Page記錄是要佔據64byte的空間的。也就是說,如果一塊50G的RAM,4k大小的PageTable要有80MB左右;
六、參考資料
- HugePage說明詳見:HugePages on Oracle Linux 64-bit (文檔 ID 361468.1)
- AMM & oracle兼容性詳見:HugePages and Oracle Database 11g Automatic Memory Management (AMM) on Linux (文檔 ID 749851.1)
- HugePage大小獲取腳本:Oracle Linux: Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (文檔 ID 401749.1)
- HugePageSize大小:HugePages on Linux: What It Is... and What It Is Not... (文檔 ID 361323.1)