前言:在Linux中配置hugepage可以提高oracle的性能,減少oracle sga的頁交換,類似于aix中的lagepage。
為什么 使用大頁?
LINUX內(nèi)存的默認塊大小是4K
如果SGA為:128G
select 128* 1024* 1024/4 from dual;33554432個塊(三千多萬),
select 128*1024/2 from dual; 65536個塊
每個內(nèi)存頁,有一個頁表項(大概10個字節(jié)),記錄頁的狀態(tài)、位置
默認塊大小是4K時--頁表大小:320M。
在大頁下2M時,頁表只占.625M
在Linux中,每個進程頁表獨立,有各自的頁表。
如果有1000個進程:1000 * 320M大約是320G。
而1000個進程使用大頁:1000 * 0.625=625M
設置了大頁,但沒被Oracle使用,原因只有兩個
- SGA_MAX_SIZE超過了大頁
- 沒有設置內(nèi)存鎖
內(nèi)存:是進程活動的舞臺,ORACLE數(shù)據(jù)庫在startup時會自動去查找是否設置有大頁。
如有,在大頁中分配SGA。
如沒有,則正常使用默認數(shù)據(jù)塊大小啟動。
設置大頁步驟:
1.查看系統(tǒng)當前的大頁使用情況:
[oracle@qbyldb ~]$ cat /proc/meminfo |grep Huge
AnonHugePages: 131072 kB
HugePages_Total: 7200
HugePages_Free: 7200
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB --大頁頁大小是2M
SQL> show parameter sga_max;
NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
sga_max_size big integer 5G
2. 設置大頁的數(shù)量
--這里是7200個*2M=14400M,SGA最大5G,大頁的內(nèi)存要大于SGA大小,才能被ORACLE使用,因為我一個機器上部署了兩個實例,所以我設置7200個。
vi /etc/sysctl.conf
在里面增加一行:
vm.nr_hugepages=7200
保存之后執(zhí)行:
sysctl -p
查看: --如果HugePages_Free:未到7200,多執(zhí)行幾次sysctl -p
[oracle@qbyldb ~]$ cat /proc/meminfo |grep Huge
AnonHugePages: 131072 kB
HugePages_Total: 7200
HugePages_Free: 7200
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB --大頁頁大小是2M
3.還需要設置內(nèi)存鎖:-- memlock數(shù)量要大于大頁的數(shù)量--設置為-1,不限制。
vi /etc/security/limits.conf
oracle soft memlock -1
oracle hard memlock -1
[oracle@qbyldb ~]$ ulimit -l
unlimited
4.重啟數(shù)據(jù)庫,大頁已經(jīng)被ORACLE用上了。
SQL>shutdown immediate;
SQL>startup
重啟數(shù)據(jù)庫過程中不斷執(zhí)行;cat /proc/meminfo |grep Huge,能看到HugePages_Free:的數(shù)量不斷減少,說明大頁正在被使用。
[oracle@qbyldb ~]$ cat /proc/meminfo |grep Huge
AnonHugePages: 131072 kB
HugePages_Total: 7200
HugePages_Free: 1530
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB --大頁頁大小是2M