HugePage,就是指的大頁內存管理方式。與傳統的4kb的普通頁管理方式相比,HugePage爲管理大內存(8GB以上)更爲高效。對於8GB以上的內存以及較大的Oracle SGA size,建議配值並使用HugePage特性。
linux的內存管理採取的是分頁存取機制,爲了保證物理內存能得到充分的利用,內核會按照LRU算法在適當的時候將物理內存中不經常使用的內存頁自動交換到虛擬內存中,而將經常使用的信息保留到物理內存。通常情況下,Linux默認情況下每頁是4K,這就意味着如果物理內存很大,則映射表的條目將會非常多,會影響CPU的檢索效率。因爲內存大小是固定的,爲了減少映射表的條目,可採取的辦法只有增加頁的尺寸。因此Hugepage便因此而來。也就是打破傳統的小頁面的內存管理方式,使用大頁面2m,4m,16m等等。如此一來映射條目則明顯減少。如果系統有大量的物理內存(大於8G),不管物理32位的操作系統還是64位的,都應該使用Hugepage。
對於較大的系統內存以及sga,使用hugepage可以極大程度的提高Oracle數據庫性能。
怎麼樣設置hugepages?設置hugepages有什麼注意事項同?
a、HugePage使用的是共享內存,在操作系統啓動期間被動態分配並被保留,因爲他們不會被置換。
b、由於不會被置換的特點,在使用hugepage的內存不能被其他的進程使用。所以要合理設置該值,避免造成內存浪費。
c、對於只使用Oracle的服務器來說,把Hugepage設置成SGA(所有instance SGA之和)大小即可。
d、如果增加HugePage或添加物理內存或者是當前服務器增加了新的instance以及SGA發生變化,應該重新設置所需的HugePage。
e、reference: HugePages on Linux: What It Is... and What It Is Not... [ID 361323.1] To Bottom
配置hugepages步驟:
1.查看當前系統是否配值HugePages
Hugepagesize爲2MB,HugePages_Total爲0說明沒有配置hugepages
[oracle@qht115 ~]$ grep Huge /proc/meminfo
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
2.通過修改/etc/security/limits.conf 配值文件來實現
該參數的值通常配值位略小於當前的已安裝系統內存,我的系統是8G內存,不過只顯示7G內存,可能是用的集成顯卡被吃掉1G
[root@qht115 ~]# free -m
total used free shared buffers cached
Mem: 6975 4910 2065 0 291 4279
-/+ buffers/cache: 339 6635
Swap: 8189 516 7672
--hugepagesize設爲6G
[root@qht115 ~]# cat /etc/security/limits.conf
# for oracle 10g
oracle soft nofile 65536
oracle hard nofile 65536
* soft memlock 6291456
* hard memlock 6291456
[root@qht115 ~]# ulimit -l
6291456
[root@qht115 ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144
kernel.shmall = 2097152
kernel.shmmax = 8589934591
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
3.禁用AMM,AMM是oracle 11G的新功能,oracle10g 可忽略些步驟
如果當前的Oracle 版本爲11g,由於AMM(Automatic Memory Management)特性與Hugepages不兼容,需要禁用AMM。
ALTER SYSTEM RESET memory_target SCOPE=SPFILE;
ALTER SYSTEM RESET memory_max_target SCOPE=SPFILE;
ALTER SYSTEM SET sga_target=<n>g SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target=<n>g SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
4.計算vm.nr_hugepages 的值
使用Oracle 提供的腳本hugepages_settings.sh的腳本來計算vm.nr_hugepages的值
在執行腳本之前確保所有的Oracle 實例已啓動以及ASM也啓動(存在的情形下)
[oracle@qht115 ~]$ ./hugepages_setting.sh
。。。
Recommended setting: vm.nr_hugepages = 434
5.編輯/etc/sysctl.conf 來設置vm.nr_hugepages參數
[root@qht115 ~]# cat /etc/sysctl.conf
增加
vm.nr_hugepages = 434
[root@qht115 ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144
kernel.shmall = 2097152
kernel.shmmax = 8589934591
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
vm.nr_hugepages = 434
6.重啓Instance,看是否用了hugepagesize
重啓數據庫後,查看使用情況:
[oracle@qht115 ~]$ grep Huge /proc/meminfo
HugePages_Total: 434
HugePages_Free: 321
HugePages_Rsvd: 320
Hugepagesize: 2048 kB
的確hugepage的確被用上了。
參考: