我相信各位做linux系統性能優(yōu)化的朋友對于 HugePage并不陌生了,今天我們來為各位分享一篇HugePage用法例子.
在Linux環(huán)境性能優(yōu)化實踐中,HugePage是一個經常提到的方法,簡單的說,HugePage就是Linux內核上一種是用內存塊的方法,作為傳統4K Page的替代,HugePage在大部分場景下可以提升Oracle實例的運行性能效率.
一、HugePage介紹
HugePage廣泛啟用開始于Kernal 2.6,一些版本下2.4內核也可以是用,在操作系統Linux環(huán)境中,內存是以頁Page的方式進行分配,默認大小為4K,如果需要比較大的內存空間,則需要進行頻繁的頁分配和管理尋址動作.
HugePage是傳統4K Page的替代方案,顧名思義,是用HugePage可以讓我們有更大的內存分頁大小,無論是HugePage還是傳統的正常Page,這個過程都涉及到OS內存尋址過程.
當一個進程訪問內存的時候,并不是直接進行內存位置訪問,是需要通過Page Table進行轉移變換,在使用HugePage的情況下,PageTable具有了額外的屬性,就是判斷該頁記錄是HugePage還是Regular Page.
在Oracle運行環(huán)境中開啟HugePage是有很多好處的,具體如下.
非Swap內存:當開啟HugePage的時候,HugePage是不會Swap的.
減少TLB(Translation Look aside Buffer)負擔:TBL是在CPU里面的一塊緩沖區(qū)域,其中包括了部分Page Table內容,使用HugePage可以減少TLB工作負載.
減少Page Table空間負載:在PageTable管理中,每條Page記錄是要占據64byte的空間的。也就是說,如果一塊50G的RAM,4k大小的PageTable要有80MB左右;
減少PageTable檢索負載:更小的PageTable意味著更快的檢索定位能力;
內存性能提升:Page數量減少、大小的增加,減少了管理過程的復雜性,進一步減少了瓶頸出現的概率;
對于Oracle而言,實例運行環(huán)境(Database和ASM)都面對一個HugePage優(yōu)化的問題。
二、基礎環(huán)境準備
我們選擇Kernel2.6下的centos版本進行實驗。
[oracle@361way ~]$ uname -r
2.6.18-128.el5
此時Oracle實例為11gR2(11.2.0.3),運行在AMM內存管理方式下,共享內存段信息如下.
- [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
注意兩個問題:一個是當前我們在meminfo中沒有啟用HugePage,所以沒有對應的記錄,另一個是AMM下,ipcs –m顯示出的共享內存大小只有三個每個大小4096bytes.
這個問題是比較復雜的,本篇就介紹一個開頭,在10g中,Oracle引入了sga_target系列參數,實現了ASMM(Automatic Shared Memory Management),ASMM的本質是實現SGA和PGA內部各個池之間的動態(tài)調整,但是在11g中,推出了AMM(Automatic Memory Management),實現了PGA和SGA之間的調節(jié).
AMM其實是復雜的,SGA在Linux中是通過系統共享內存實現,而PGA是通過進程私有空間實現,AMM實際上最大的功能是將SGA和PGA空間調節(jié)的通道打通,這必然帶來對原有SGA共享內存方式架構的影響,在AMM時,ipcs –m顯示的虛擬空共享段就是實際效果的一部分.
三、用戶內存配置
啟用HugePage的第一步就是進行用戶參數限制打通,當前內存大小如下:
--內存信息
- [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參數文件,添加數據庫實例用戶的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 //Vevb.com
這個過程中使用memlock標記,用于設置每個用戶允許的最大內存使用情況,這個取值可以設置為數據庫服務器物理內存大小,切換到指定用戶(oracle),查看設置.
- [oracle@361way ~]$ ulimit -l
- 918380
四、Oracle設置
如果是使用11g Oracle版本,一定需要進行額外的配置,就是將使用的AMM退化為ASMM,在早期的11.2.0.1版本中,這個步驟很重要,因為AMM是不支持HugePage的,如果強在AMM+HugePage模式下打開數據庫,是會遇到失敗信息.
在最新的11.2.0.2版本以及之后,引入了參數use_large_pages,避免了這樣的問題,但是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的關鍵在于兩個方面,一個是memory_target和memory_max_target設置非空,另一個是sga_target和pga_aggregate_target參數設置為空,如果要關閉AMM,退化開啟ASMM,就需要進行實例啟動參數的設置.
說明:本篇不是以修改AMM到ASMM作為重點,這部分內容略,留待其他文章進行說明,修改之后,需要重啟服務器,因為一些參數屬于靜態(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
注意,此時共享內存機制才真正實現,我們從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
五、經驗腳本計算HugePage最大值
在MOS 401749.1中,Oracle推薦了一個Shell腳本來計算HugePage值,運行這個腳本,將計算出的取值設置在系統參數中.
- [oracle@361way upload]$ ls -l | grep huge
- -rwxr-xr-x 1 oracle oinstall 3037 Oct 22 09:42 hugepages_settings.sh
執(zhí)行腳本,注意這個過程中要求Oracle所有實例,包括數據庫和ASM都啟動、AMM關閉,以及SGA大小超過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 //Vevb.com
- 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啟動檢驗
設置之后,最好重新啟動服務器,包括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的信息,說明啟用成功.
七、概括
普通物理內存的塊大小是4KB,當物理內存擴展到了8GB以后,所需要管理的內存塊的數量大大增加,然而使用內存都需要花費CPU資源,也就是說程序所用到的內存塊數量越多,系統的管理效率就越低,使用的內存總量過大的情況下還可能會導致分配失敗的情況,而且在內存分配的時候就越會導致CPU資源占用率高.
在Linux系統上對于大內存(Very Large Memory)的情況,提供了Hugepages的技術,就是使用比較大的內存頁面來進行管理,這樣的話,對于現今的高端機型,16GB、32GB的內存來說也能夠比較輕易應付,在Redhat Linux系統上,一個內存頁面的尺寸是2MB.
新聞熱點
疑難解答