Linux下HugePage記憶體功能配置

bitifi發表於2015-11-07

 

Linux環境效能最佳化實踐中,HugePage是一個經常提到的方法。簡單的說,HugePage就是Linux核心上一種是用記憶體塊的方法。作為傳統4K Page的替代,HugePage在大部分場景下可以提升Oracle例項的執行效能效率。

 

本篇介紹如何進行HugePage配置和Oracle環境使用。

 

1HugePage介紹

 

HugePage廣泛啟用開始於Kernal 2.6,一些版本下2.4核心也可以是用。在作業系統Linux環境中,記憶體是以頁Page的方式進行分配,預設大小為4K。如果需要比較大的記憶體空間,則需要進行頻繁的頁分配和管理定址動作。

 

HugePage是傳統4K Page的替代方案。顧名思義,是用HugePage可以讓我們有更大的記憶體分頁大小。無論是HugePage還是傳統的正常Page,這個過程都涉及到OS記憶體定址過程。

 

當一個程式訪問記憶體的時候,並不是直接進行記憶體位置訪問,是需要透過Page Table進行轉移變換。在使用HugePage的情況下,PageTable具有了額外的屬性,就是判斷該頁記錄是HugePage還是Regular Page

 

Oracle執行環境中開啟HugePage是有很多好處的。具體如下:

 

ü  Swap記憶體:當開啟HugePage的時候,HugePage是不會Swap的;

ü  減少TLBTranslation Look aside Buffer)負擔:TBL是在CPU裡面的一塊緩衝區域,其中包括了部分Page Table內容。使用HugePage可以減少TLB工作負載;

ü  減少Page Table空間負載:在PageTable管理中,每條Page記錄是要佔據64byte的空間的。也就是說,如果一塊50GRAM4k大小的PageTable要有80MB左右;

ü  減少PageTable檢索負載:更小的PageTable意味著更快的檢索定位能力;

ü  記憶體效能提升:Page數量減少、大小的增加,減少了管理過程的複雜性,進一步減少了瓶頸出現的機率;

 

對於Oracle而言,例項執行環境(DatabaseASM)都面對一個HugePage最佳化的問題。

 

2、基礎環境準備

 

我們選擇RedHat 5.3版本,也就是Kernel2.6進行實驗。

 

 

[oracle@SimpleLinux ~]$ uname -r

2.6.18-128.el5

 

 

此時Oracle例項為11gR211.2.0.3),執行在AMM記憶體管理方式下。共享記憶體段資訊如下。

 

 

[oracle@SimpleLinux ~]$ 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@SimpleLinux ~]$ 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系列引數,實現了ASMMAutomatic Shared Memory Management)。ASMM的本質是實現SGAPGA內部各個池之間的動態調整。但是在11g中,推出了AMMAutomatic Memory Management),實現了PGASGA之間的調節。

 

AMM其實是複雜的。SGALinux中是透過系統共享記憶體實現,而PGA是透過程式私有空間實現。AMM實際上最大的功能是將SGAPGA空間調節的通道打通,這必然帶來對原有SGA共享記憶體方式架構的影響。AMM時,ipcs –m顯示的虛擬空共享段就是實際效果的一部分。

 

2、設定使用者記憶體配置

 

啟用HugePage的第一步就是進行使用者引數限制打通,當前記憶體大小如下:

 

 

--記憶體資訊

[root@SimpleLinux ~]# 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@SimpleLinux ~]# 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

 

 

這個過程中使用memlock標記,用於設定每個使用者允許的最大記憶體使用情況。這個取值可以設定為資料庫伺服器實體記憶體大小。

 

切換到指定使用者(oracle),檢視設定。

 

 

[oracle@SimpleLinux ~]$ ulimit -l

918380

 

 

3Oracle設定

 

如果是使用11g Oracle版本,一定需要進行額外的配置,就是將使用的AMM退化為ASMM在早期的11.2.0.1版本中,這個步驟很重要。因為AMM是不支援HugePage的,如果強在AMM+HugePage模式下開啟資料庫,是會遇到失敗資訊。

 

在最新的11.2.0.2版本以及之後,引入了引數use_large_pages,避免了這樣的問題。但是AMMHugePage不相容的情況,還是存在。

 

當前是使用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_targetmemory_max_target設定非空。另一個是sga_targetpga_aggregate_target引數設定為空。如果要關閉AMM,退化開啟ASMM,就需要進行例項啟動引數的設定。

 

說明:本篇不是以修改AMMASMM作為重點,這部分內容略,留待其他文章進行說明。

 

修改之後,需要重啟伺服器,因為一些引數屬於靜態引數。

 

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@SimpleLinux 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

 

 

4、經驗指令碼計算HugePage最大值

 

MOS 401749.1中,Oracle推薦了一個Shell指令碼來計算HugePage值。執行這個指令碼,將計算出的取值設定在系統引數中。具體指令碼請見筆者部落格檔案下載欄目。

 

 

[oracle@SimpleLinux upload]$ ls -l | grep huge

-rwxr-xr-x 1 oracle oinstall   3037 Oct 22 09:42 hugepages_settings.sh

 

 

執行指令碼,注意這個過程中要求Oracle所有例項,包括資料庫和ASM都啟動、AMM關閉,以及SGA大小超過100M

 

 

[oracle@SimpleLinux upload]$ ./hugepages_settings.sh

 

This script. is provided by Doc ID 401749.1 from My Oracle Support

() 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@SimpleLinux ~]# vi /etc/sysctl.conf

 

(新增內容如下……

vm.nr_hugepages = 67

"/etc/sysctl.conf" 49L, 1325C written

 

 

使用sysctl –p生效設定。

 

 

[root@SimpleLinux ~]# sysctl -p

net.ipv4.ip_forward = 0

(篇幅原因,有省略……

net.core.wmem_max = 1048586

vm.nr_hugepages = 67

 

 

5HugePage啟動檢驗

 

設定之後,最好重新啟動伺服器,包括Oracle

 

 

[oracle@SimpleLinux ~]$ 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@SimpleLinux ~]$ grep Huge /proc/meminfo

HugePages_Total:    67

HugePages_Free:      3

HugePages_Rsvd:      0

Hugepagesize:     4096 kB

 

 

meminfo檔案中,可以查到HugePages的資訊,說明啟用成功。

 

6、總結

 

隨著Linux+PC的伺服器模式普及,我們會在實際工作中見到越來越多的Linux伺服器和遇到越來越多的Linux系統。HugePage作為一種常用的效能最佳化手段,需要關注學習。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30496894/viewspace-1825213/,如需轉載,請註明出處,否則將追究法律責任。

相關文章