我的筆記:ORACLE大頁內存hugepage和SGA、PGA的經驗,SGA並非越大越好

背景:ORACLE 11.2,SGA 64G,PGA 8G,壓測出現操做系統內存耗盡
WARNING: Heavy swapping observed on system in last 5 mins.
pct of memory swapped in [1.94%] pct of memory swapped out [1.32%].linux

分析:
一、鏈接到數據庫的每一個系統鏈接進程大概會佔用10M左右,1000個鏈接那麼也就接近10G了;
二、在32位系統下,一個進程訪問1GB的內存,會產生1M(110241024/44/1024/1024)的頁表,若是是在64位系統,將會增大到2M。
SGA設置爲64G,有1000個ORACLE用戶進程(在linux中每一個進程頁表獨立,都有本身的頁表),64位LINUX的系統上,最大的頁表佔用內存爲:64
2*1000/1024=125G;數據庫

解決方法:
一、控制SGA大小, sga+pga最好控制在50%物理內存之內,pga內存不要操做sga內存的20%;
二、當主機的物理內存爲64G,設SGA>=32G時,建議開啓大頁;
內存都是以頁的形式劃分的,默認狀況下每頁是4K,這就意味着若是物理內存很大,則映射表的條目將會很是多,會影響CPU的檢索效率。由於內存大小是固定的,爲了減小映射表的條目,可採起的辦法只有增長頁的尺寸。
在Linux中配置hugepage能夠提升oracle的性能,減小oracle sga的頁交換,相似於aix中的lagepage。服務器

設置方法(參考第三方材料):
一、關閉Oracle Database 11g中的AMM(Automatic Memory Management),即把兩個參數MEMORY_TARGET / MEMORY_MAX_TARGET設爲0
若是alter system set MEMORY_MAX_TARGET=0 scope=spfile;重啓後發現沒有改成0,能夠alter system reset memory_max_target; 來設置oracle

二、參考metalink(文檔 ID 401749.1)提供的腳本,計算hugepages的大小app

三、對hugepages_settings.sh這個腳本授可執行的權限
chmod +x hugepages_settings.shide

四、執行執行hugepages_settings.sh獲得建議值
得出大頁的大小爲1028頁(注:一頁爲2M,這個值不可改,1028*2M=2056M),實際上hugepages與參數sga_max_size有關,比sga_max_size的值稍微大一點點(比SGA_MAX_SIZE最少要多加一頁,2M的頁不要分配超過sga_max_size太多,會形成內存的浪費)
注意:使用Hugepage內存是共享內存,它會一直keep在內存中的,不會被交換出去,也就是說使用hurgepage的內存不能被其餘的進程使用,因此,必定要合理設置這個值,避免形成浪費。對於只使用Oracle的服務器來講,把Hugepage_pool設置成大於SGA大小才能被Oracle使用。
SQL>show parameter sga_max_size
NAME TYPE VALUE性能


sga_max_size big integer 2G操作系統

五、設置hugepages,在內核參數中添加一行,vi /etc/sysctl.conf
vm.nr_hugepages = 1028進程

六、修改內核參數當即生效
[root@el5 ~]# sysctl -p內存

七、別忘記設定內存鎖memlock,以K爲單位,memlock數量要大於大頁的數量,固然也要大於sga_max_size,這裏設定爲2056000,設置爲-1,表示不限制。
[root@el5 ~]# vi /etc/security/limits.conf
oracle soft memlock 2056000
oracle hard memlock 2056000

八、檢查limits是否正確
[root@el5 ~]# su - oracle
[oracle@el5 ~] ulimit -l
2056000

九、重啓數據庫

十、查看大頁,已被使用
[oracle@el5 ~]$ watch -n1 'cat /proc/meminfo |grep -i HugePage'
HugePages_Total: 總共頁
HugePages_Free: 空閒頁
HugePages_Rsvd: 操做系統承諾給Oracle預留頁
Hugepagesize: 2048 kB 每頁是2M,不可修改

如:
HugePages_Total: 1028 ---總共1028頁
HugePages_Free: 869 ---空閒869 頁,即當前大頁被使用了1028-869=159頁,即被用了1592M=118M,小於sga_target。
HugePages_Rsvd: 842 ---操做系統承諾給Oracle預留842頁,即842
2M=1684M(1684+118==SGA_MAX_SIZE)

使用了hugepage以後,SGA就默認pin在內存裏了,那麼就不用lock sga了。接下來咱們研究一下參數:pre_page_sga,這個參數默認是false,我把它打開。
sys@OCM> alter system set pre_page_sga=true scope=spfile;
sys@OCM> show parameter sga
NAME TYPE VALUE


lock_sga boolean FALSE
pre_page_sga boolean TRUE
sga_max_size big integer 2G
sga_target big integer 1G
HugePages_Total: 1028 ---總共1028頁
HugePages_Free: 548 ---空閒548頁,即當前大頁被使用了1028-548=480頁,即被用了4802M=960M,約等於sga_target,參數pre_page_sga起做用了。
HugePages_Rsvd: 521 ---操做系統承諾給Oracle預留521頁,即521
2M=1042M(理解爲sga_max_size-sga_target)
Hugepagesize: 2048 kB --每頁是2M,不可修改

參考metalink:USE_LARGE_PAGES To Enable HugePages (文檔 ID 1392497.1)

補充關於內存申請的OverCommitLinux下的OverCommit機制,主要是爲了應對可能的異常的大量內存申請對OS自己形成衝擊。Linux有三種OverCommit機制,能夠經過:/proc/sys/vm/overcommit_memory來配置,三種配置的具體含義:0:啓發式策略,後果比較嚴重的Overcommit將不能成功,而輕微的Overcommit將被容許。1:永遠容許Overcommit,這種策略適合那些不能承受內存分配失敗的應用,好比某些科學計算應用。2:永遠禁止Overcommit,在這個狀況下,系統所能分配的內存不會超過swap+RAM*係數(/proc/sys/vm /overcmmit_ratio,默認50%,你能夠調整),若是這麼多資源已經用光,那麼後面任未嘗試申請內存的行爲都會返回錯誤,這一般意味着此時 無法運行任何新程序。

相關文章
相關標籤/搜索