在Linux環(huán)境性能優(yōu)化實(shí)踐中,HugePage是一個(gè)經(jīng)常提到的方法。簡(jiǎn)單的說(shuō),HugePage就是Linux內核上一種是用內存塊的方法。作爲傳統4K Page的替代,HugePage在大部分場(chǎng)景下可以提升Oracle實(shí)例的運行性能效率。
一、HugePage介紹
HugePage廣泛?jiǎn)櫽瞄_(kāi)始于Kernal 2.6,一些版本下2.4內核也可以是用。在操作系統Linux環(huán)境中,內存是以頁(yè)Page的方式進(jìn)行分配,默認大小爲4K。如果需要比較大的內存空間,則需要進(jìn)行頻繁的頁(yè)分配和管理尋址動(dòng)作。
HugePage是傳統4K Page的替代方案。顧名思義,是用HugePage可以讓我們有更大的內存分頁(yè)大小。無(wú)論是HugePage還是傳統的正常Page,這個(gè)過(guò)程都涉及到OS內存尋址過(guò)程。
當一個(gè)進(jìn)程訪(fǎng)問(wèn)內存的時(shí)候,並不是直接進(jìn)行內存位置訪(fǎng)問(wèn),是需要通過(guò)Page Table進(jìn)行轉移變換。在使用HugePage的情況下,PageTable具有了額外的屬性,就是判斷該頁(yè)記錄是HugePage還是Regular Page。
在Oracle運行環(huán)境中開(kāi)啓HugePage是有很多好處的。具體如下:
非Swap內存:當開(kāi)啓HugePage的時(shí)候,HugePage是不會(huì )Swap的;
減少TLB(Translation Look aside Buffer)負擔:TBL是在CPU裏面的一塊緩沖區域,其中包括了部分Page Table內容。使用HugePage可以減少TLB工作負載;
減少Page Table空間負載:在PageTable管理中,每條Page記錄是要占據64byte的空間的。也就是說(shuō),如果一塊50G的RAM,4k大小的PageTable要有80MB左右;
減少PageTable檢索負載:更小的PageTable意味著(zhù)更快的檢索定位能力;
內存性能提升:Page數量減少、大小的增加,減少了管理過(guò)程的複雜性,進(jìn)一步減少了瓶頸出現的概率;
對于Oracle而言,實(shí)例運行環(huán)境(Database和ASM)都面對一個(gè)HugePage優(yōu)化的問(wèn)題。
二、基礎環(huán)境準備
我們選擇Kernel2.6下的centos版本進(jìn)行實(shí)驗。
[oracle@361way ~]$ uname -r
2.6.18-128.el5
此時(shí)Oracle實(shí)例爲11gR2(11.2.0.3),運行在A(yíng)MM內存管理方式下。共享內存段信息如下。
[oracle@361way ~]$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 32768 oracle 640 4096 0
0x00000000 65537 oracle 640 4096 0
0x01606d30 98306 oracle 640 4096 0
[oracle@361way ~]$ grep Huge /proc/meminfo
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 4096 kB
注意兩個(gè)問(wèn)題:一個(gè)是當前我們在meminfo中沒(méi)有啓用HugePage,所以沒(méi)有對應的記錄。另一個(gè)是AMM下,ipcs –m顯示出的共享內存大小只有三個(gè)每個(gè)大小4096bytes。
這個(gè)問(wèn)題是比較複雜的,本篇就介紹一個(gè)開(kāi)頭。在10g中,Oracle引入了sga_target系列參數,實(shí)現了ASMM(Automatic Shared Memory Management)。ASMM的本質(zhì)是實(shí)現SGA和PGA內部各個(gè)池之間的動(dòng)態(tài)調整。但是在11g中,推出了AMM(Automatic Memory Management),實(shí)現了PGA和SGA之間的調節。
AMM其實(shí)是複雜的。SGA在Linux中是通過(guò)系統共享內存實(shí)現,而PGA是通過(guò)進(jìn)程私有空間實(shí)現。AMM實(shí)際上最大的功能是將SGA和PGA空間調節的通道打通,這必然帶來(lái)對原有SGA共享內存方式架構的影響。在A(yíng)MM時(shí),ipcs –m顯示的虛擬空共享段就是實(shí)際效果的一部分。
三、用戶(hù)內存配置
啓用HugePage的第一步就是進(jìn)行用戶(hù)參數限制打通,當前內存大小如下:
--內存信息
[root@361way ~]# free -t
total used free shared buffers cached
Mem: 918380 205044 713336 0 14744 152996
-/+ buffers/cache: 37304 881076
Swap: 2455788 0 2455788
Total: 3374168 205044 3169124
修改/etc/security/limits.conf參數文件,添加數據庫實(shí)例用戶(hù)的memlock限制。
[root@361way ~]# cat /etc/security/limits.conf
# /etc/security/limits.conf
#
(篇幅原因,有省略……)
# - fsize - maximum filesize (KB)
# - memlock - max locked-in-memory address space (KB)
# - nofile - max number of open files
#ftp hard nproc 0
#@student - maxlogins 4
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft memlock 918380
oracle hard memlock 918380
# End of file
這個(gè)過(guò)程中使用memlock標記,用于設置每個(gè)用戶(hù)允許的最大內存使用情況。這個(gè)取值可以設置爲數據庫服務(wù)器物理內存大小。切換到指定用戶(hù)(oracle),查看設置。
[oracle@361way ~]$ ulimit -l
918380
四、Oracle設置
如果是使用11g Oracle版本,一定需要進(jìn)行額外的配置,就是將使用的AMM退化爲ASMM。在早期的11.2.0.1版本中,這個(gè)步驟很重要。因爲AMM是不支持HugePage的,如果強在A(yíng)MM+HugePage模式下打開(kāi)數據庫,是會(huì )遇到失敗信息。
在最新的11.2.0.2版本以及之後,引入了參數use_large_pages,避免了這樣的問(wèn)題。但是AMM與HugePage不兼容的情況,還是存在。
當前是使用AMM的數據庫。
SQL> show parameter target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
db_flashback_retention_target integer 1440
fast_start_io_target integer 0
fast_start_mttr_target integer 0
memory_max_target big integer 360M
memory_target big integer 360M
parallel_servers_target integer 16
pga_aggregate_target big integer 0
sga_target big integer 0
AMM的關(guān)鍵在于兩個(gè)方面,一個(gè)是memory_target和memory_max_target設置非空。另一個(gè)是sga_target和pga_aggregate_target參數設置爲空。如果要關(guān)閉AMM,退化開(kāi)啓ASMM,就需要進(jìn)行實(shí)例啓動(dòng)參數的設置。
說(shuō)明:本篇不是以修改AMM到ASMM作爲重點(diǎn),這部分內容略,留待其他文章進(jìn)行說(shuō)明。修改之後,需要重啓服務(wù)器,因爲一些參數屬于靜態(tài)參數。
SQL> conn / as sysdba
Connected.
SQL> show parameter target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
db_flashback_retention_target integer 1440
fast_start_io_target integer 0
fast_start_mttr_target integer 0
memory_max_target big integer 0
memory_target big integer 0
parallel_servers_target integer 16
pga_aggregate_target big integer 108M
sga_target big integer 252M
注意,此時(shí)共享內存機制才真正實(shí)現,我們從ipcs –m中,可以看到真正的共享段。
[oracle@361way dbs]$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 327680 oracle 640 4194304 27
0x00000000 360449 oracle 640 260046848 27
0x01606d30 393218 oracle 640 4194304 27
五、經(jīng)驗腳本計算HugePage最大值
在MOS 401749.1中,Oracle推薦了一個(gè)Shell腳本來(lái)計算HugePage值。運行這個(gè)腳本,將計算出的取值設置在系統參數中。
[oracle@361way upload]$ ls -l | grep huge
-rwxr-xr-x 1 oracle oinstall 3037 Oct 22 09:42 hugepages_settings.sh
執行腳本,注意這個(gè)過(guò)程中要求Oracle所有實(shí)例,包括數據庫和ASM都啓動(dòng)、AMM關(guān)閉,以及SGA大小超過(guò)100M。
[oracle@361way upload]$ ./hugepages_settings.sh
This script. is provided by Doc ID 401749.1 from My Oracle Support
(http://support.oracle.com) where it is intended to compute values for
the recommended HugePages/HugeTLB configuration for the current shared
memory segments. Before proceeding with the execution please note following:
* For ASM instance, it needs to configure ASMM instead of AMM.
* The 'pga_aggregate_target' is outside the SGA and
you should accommodate this while calculating SGA size.
* In case you changes the DB SGA size,
as the new SGA will not fit in the previous HugePages configuration,
it had better disable the whole HugePages,
start the DB with new SGA size and run the script. again.
And make sure that:
* Oracle Database instance(s) are up and running
* Oracle Database 11g Automatic Memory Management (AMM) is not setup
(See Doc ID 749851.1)
* The shared memory segments can be listed by command:
# ipcs -m
Press Enter to proceed...
Recommended setting: vm.nr_hugepages = 67
將計算出的67更改參數/etc/sysctl.conf
--設置參數
[root@361way ~]# vi /etc/sysctl.conf
(添加內容如下……)
vm.nr_hugepages = 67
"/etc/sysctl.conf" 49L, 1325C written
使用sysctl –p生效設置。
[root@361way ~]# sysctl -p
net.ipv4.ip_forward = 0
(篇幅原因,有省略……)
net.core.wmem_max = 1048586
vm.nr_hugepages = 67
六、HugePage啓動(dòng)檢驗
設置之後,最好重新啓動(dòng)服務(wù)器,包括Oracle。
[oracle@361way ~]$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 32768 oracle 640 4194304 26
0x00000000 65537 oracle 640 260046848 26
0x01606d30 98306 oracle 640 4194304 26
[oracle@361way ~]$ grep Huge /proc/meminfo
HugePages_Total: 67
HugePages_Free: 3
HugePages_Rsvd: 0
Hugepagesize: 4096 kB
在meminfo文件中,可以查到HugePages的信息,說(shuō)明啓用成功。
七、概括
普通物理內存的塊大小是4KB,當物理內存擴展到了8GB以後。所需要管理的內存塊的數量大大增加,然而使用內存都需要花費CPU資源,也就是說(shuō)程序所用到的內存塊數量越多,系統的管理效率就越低,使用的內存總量過(guò)大的情況下還可能會(huì )導致分配失敗的情況,而且在內存分配的時(shí)候就越會(huì )導致CPU資源占用率高。
在Linux系統上對于大內存(Very Large Memory)的情況,提供了Hugepages的技術(shù)。就是使用比較大的內存頁(yè)面來(lái)進(jìn)行管理,這樣的話(huà),對于現今的高端機型,16GB、32GB的內存來(lái)說(shuō)也能夠比較輕易應付。在Redhat Linux系統上,一個(gè)內存頁(yè)面的尺寸是2MB。
聯(lián)系客服