1. 程式人生 > >轉:// LINUX下為ORACLE數據庫設置大頁--hugepage

轉:// LINUX下為ORACLE數據庫設置大頁--hugepage

參數設置 let target == 頁交換 rom 使用 sysctl onf

在Linux中配置hugepage可以提高oracle的性能,減少oracle sga的頁交換,類似於aix中的lagepage。

為什麽 使用大頁?

LINUX內存的默認塊大小是4K
如果SGA為:128G
select 128*1024*1024/4 from dual;33554432個(三千多萬),
select 128*1024/2 from dual; 65536個
每個內存頁,有一個頁表項(大概10個字節),記錄頁的狀態、位置
默認塊大小是4K時--頁表大小:320M。
在大頁下2M時,頁表只占.625M

在Linux中,每個進程頁表獨立,有各自的頁表。
如果有1000個進程:1000*320M大約是320G。
而1000個進程使用大頁:1000*0.625=625M

設置了大頁,但沒被Oracle使用,原因只有兩個:

(1)、SGA_MAX_SIZE超過了大頁
(2)、沒有設置內存鎖
內存:是進程活動的舞臺,ORACLE數據庫在startup時會自動去查找是否設置有大頁。
如有,在大頁中分配SGA。
如沒有,則正常使用默認數據塊大小啟動。
#############

設置大頁步驟:

1.查看系統當前的大頁使用情況:
[oracle@bys3 ~]$ cat /proc/meminfo |grep Huge
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB

--大頁大小是2M
BYS@ bys3>show parameter sga_max --查看數據庫SGA大小--我的實驗機
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 216M

2. 設置大頁的數量
--這裏是200個*2M=400M,SGA最大216M,大頁的內存要大於SGA大小,才能被ORACLE使用,所以我設置200個。

vi /etc/sysctl.conf
在裏面增加一行:
vm.nr_hugepages=200
保存之後執行:
sysctl -p
查看: --如果HugePages_Free:未到200,多執行幾次sysctl -p
[root@bys3 ~]# cat /proc/meminfo |grep Huge
HugePages_Total: 200
HugePages_Free: 200
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB

3.還需要設置內存鎖:
-- memlock數量要大於大頁的數量--設置為-1,不限制。
vi /etc/security/limits.conf
oracle soft memlock -1
oracle hard memlock -1
[root@bys3 ~]# ulimit -l
3500000 -----這個數字就是針對大頁數量的限制的,足夠用。

4.重啟數據庫,大頁已經被ORACLE用上了。
SYS@ bys3>shutdown immediate;
SYS@ bys3>startup

重啟數據庫過程中不斷執行;cat /proc/meminfo |grep Huge,能看到HugePages_Free:的數量不斷減少,說明大頁正在被使用。
[root@bys3 ~]# cat /proc/meminfo |grep Huge
HugePages_Total: 200
HugePages_Free: 101
HugePages_Rsvd: 10
HugePages_Surp: 0
Hugepagesize: 2048 kB

========================================

  • MOS中明確的參數設置要求
alter system reset memory_target scope=spfile;                              
alter system reset memory_max_target scope=spfile;

如果dbca以非AMM方式建庫會遇到ORA-32010: cannot find entry to delete in SPFILE,也就是說spfile本來就沒有這兩個參數,錯誤忽略即可。
  • MOS中原文
If you want to use HugePages make sure that both memory_target / memory_max_target initialization parameters are unset

unset代表spfile中不允許出現memory_target和memory_max_target(關於這一點,Oracle官方文檔中的描述是錯誤的,而MOS中的一些描述才是正確的)。目前我們實施文檔中的標準是設置memory_target,這樣其實是沒問題的。但是只要再設置memory_max_target就不行了,不管該參數設置為0還是非0,大頁都不會生效。所以,正確的配置是memory_target和memory_max_target兩個參數都不要出現在spfile中,即都reset掉。

  • 額外設置的參數
alter system set use_large_pages=only scope=spfile;

強制大頁生效,如果大頁小於sga或者參數配置不符合大頁配置規範,實例將無法啟動,從根本上杜絕大頁不生效的情況,以前確保sga 100%放到hugepage中只能通過vi去alert日誌中搜索,這樣也可以免除大家檢查的復雜性。

轉:// LINUX下為ORACLE數據庫設置大頁--hugepage