天天看點

Hugepages你用了嗎?--原理概念篇

<a href="http://blog.51cto.com/181620/1075166">Hugepages你用了嗎?----原理概念篇</a>

     引子

     系統程序是通過虛拟位址通路記憶體,但是CPU必須把它轉換程實體記憶體位址才能真正通路記憶體。為了提高這個轉換效率,CPU會緩存最近的虛拟記憶體位址和實體記憶體位址的映射關系,并儲存在一個由CPU維護的映射表中。為了盡量提高記憶體的通路速度,需要在映射表中儲存盡量多的映射關系。 

    而在Linux中,記憶體都是以頁的形式劃分的,預設情況下每頁是4K,這就意味着如果實體記憶體很大,則映射表的條目将會非常多,會影響CPU的檢索效率。因為記憶體大小是固定的,為了減少映射表的條目,可采取的辦法隻有增加頁的尺寸。

<b>一、</b><b>hugepages</b><b>及相關概念</b>

    hugepage是在Linux2.6核心被引入的,主要提供4k的page和比較大的page的選擇。 <b></b>

    有一些顯示的概念需要澄清,在我們繼續讨論Hugepages之前, 如hugetlb, hugetlbfs

page table(頁表)是作業系統上的虛拟記憶體系統的資料結構模型,用于存儲虛拟位址與實體位址的對應關系。

當我們通路記憶體時,首先通路”page table“,然後Linux在通過“page table”的mapping來通路真實實體記憶體(ram+swap)

<b>TLB</b>: A Translation Lookaside Buffer (TLB)

TLB是在cpu中配置設定的一個固定大小的buffer(or cache),用于儲存“page table”的部分内容,使CPU更快的通路并進行位址轉換。

<b>hugetlb</b>: hugetlb 是記錄在TLB 中條目并指向到Hugepage。是以HugePages 通過 hugetlb entries來調用的。

<b>hugetlbfs</b>: 這是一個新的基于2.6 kernel之上的記憶體檔案系統,如同tmpfs。

在TLB中通過hugetlb來指向hugepage。這些被配置設定的hugepage作為記憶體檔案系統hugetlbfs(類似tmpfs)提供給程序使用。

二、“regular page”和“huge page“的請求過程

當一個程序請求記憶體時,它需要通路檔案系統的“頁表”(Pagetable)去調用一個實際的實體記憶體位址

<a href="http://hsbxxl.blog.51cto.com/attachment/201211/30/181620_1354264561qgyd.gif"></a>

<b>HugePage </b>的尺寸根據核心版本和硬體架構從 2MB 到 256MB , 如下表

<b>HW Platform</b>

<b>Source Code Tree</b>

<b>Kernel 2.4</b>

<b>Kernel 2.6</b>

Linux x86 (IA32)

i386

4 MB

4 MB *

Linux x86-64 (AMD64, EM64T)

x86_64

2 MB

Linux Itanium (IA64)

ia64

256 MB

IBM Power Based Linux (PPC64)

ppc64/powerpc

N/A **

16 MB

IBM zSeries Based Linux

s390

N/A

IBM S/390 Based Linux

三、 hugepage 優點

<b>1. </b>HugePages 會在系統啟動時,直接配置設定并保留對應大小的記憶體區域

2. HugePages 在開機之後,如果沒有管理者的介入,是不會釋放和改變的。

<b>3. </b><b>Not swappable: </b>HugePages 是不會swap.也就是沒有page-in/page-out。HugePages一直被pin在記憶體中

<b>4. </b><b>Relief of TLB pressure</b>:

在purge TLB的時候,減少了事物條目的加載,提高了性能。

使用Hugepages後TLB能覆寫更大的記憶體位址空間,加快位址轉換的時間

更少的TLB條目,意味着有更大空間用來記錄其他的位址空間

<b>Eliminated page table lookup overhead: </b>因為hugepage是不swappable的,所有就沒有page table lookups。

<b>Faster overall memory performance:  </b>由于虛拟記憶體需要兩步操作才能實際對應到實體記憶體位址,是以更少的pages,減輕了page table通路熱度,避免了page table熱點瓶頸問題。

<b>四. 如何配置Hugepages</b>

   根據下面的步驟來配置Hugepages,修改Hugepages需要重新開機機器,使用請計劃停機時間。

<b>Step 1: </b>需要在/etc/security/limits.conf 中設定memlock值(機關KB),該值小于記憶體大小,例如你的記憶體大小是64G,有可以設定以下的值

*   soft   memlock    60397977 

*   hard   memlock    60397977

這個值大于SGA需求并沒有什麼害處。

<b>Step 2:</b> 重新登入root和oracle使用者,檢查memlock  limit

$ ulimit -l 

60397977

<b>Step 3:</b> 如果你使用11G及以後的版本,AMM已經預設開啟,但是AMM與Hugepages是不相容的,必須先disable AMM。 

-----------------------------------------------------------------

禁用memory_max_target和memory_target參數方法

這裡注意,官方文檔說的是“unset” ,直接alter system set memory_target=0 scope=spfile;是更改不成功的。直接設定為‘0’,就抱如下的錯誤

ORA-00843: Parameter not taking MEMORY_MAX_TARGET into account 

ORA-00849: SGA_TARGET 35433480192 cannot be set to more than MEMORY_MAX_TARGET 0. 

ORA-01078: failure in processing system parameters

通過建立pfile.ora檔案,然後在檔案裡删除兩個參數"MEMORY_TARGET/MEMORY_MAX_TARGET"。然後再建立spfile就可以了。

<b>Step 4:</b>

$ ./hugepages_settings.sh 

... 

Recommended setting: vm.nr_hugepages = 1496

注:也可以自己計算需要的Hugepages大小,其實就是Hugepages size&gt; all of the SGA size 

<b>Step 5:</b> 編輯/etc/sysctl.conf 設定 vm.nr_hugepages參數:

vm.nr_hugepages = 1496 

...

<b>Step 6:</b> 停止執行個體并重新開機OS系統

<b>Step 7:</b><b>檢查設定是否生效</b>

系統重新開機後,啟動全部的資料庫,通過以下指令檢查

# grep HugePages /proc/meminfo 

HugePages_Total:    1496 

HugePages_Free:      485 

HugePages_Rsvd:      446 

HugePages_Surp:        0

HugePages_Free&lt; HugePages_Total 既說明Hugepages已經生效,同時HugePages_Rsvd不為“0”.

五、如何控制資料庫SGA是否使用Hugepages?

  11.2.0.2之前的版本,database的SGA隻能選擇全部使用hugepages或者完全不使用hugepages。

  11.2.0.2 及以後的版本, oracle增加了一個新的參數“USE_LARGE_PAGES”來管理資料庫如何使用 hugepages.

USE_LARGE_PAGES參數有三個值: "true" (default), "only", "false" and "auto"(since 11.2.0.3 patchset).

1. 現在預設值是"true",如果系統設定Hugepages的話,SGA會優先使用hugepages,有多少用多少。 

11.2.0.2 如果沒有足夠的 hugepages, SGA是不會使用hugepages的. 這會導緻ORA-4030錯誤,因為hugepages已經從實體記憶體配置設定,但是SGA沒有使用它,卻使用其他部分記憶體,導緻記憶體資源不足 

但是在11.2.0.3版本這個使用政策被改變了,SGA可以一部分使用hugepages,剩餘部分使用small pages。這樣,SGA會有限使用hugepages,在hugepages用完之後,再使用regular sized pages。

2. 如果設定為"false" , SGA就不會使用hugepages

3. 如果設定為 "only" 如果hugepages大小不夠的話,資料庫執行個體是無法啟動的 (防止記憶體溢出的情況發生).

4. 11.2.0.3版本之後,可以設定為 "auto".這個選項會觸發oradism程序重新配置linux核心,以增加hugepages的數量。Oradism需要被賦予相應的權限,如下

-rwsr-x--- 1 root &lt;oracle group&gt;

它不會去改變/etc/sysctl.conf檔案中的hugepages值,當OS重新開機後,系統會再恢複到/etc/sysctl.conf中配置的hugepages值。

<b>六、如果Database / SGA 配置改變,會怎麼樣?</b>

當你的系統涉及到以下改變的時候,你需要注意了,Hugepages可能需要重新設定

Linux OS 實體記憶體大小的改變

安裝新的資料庫執行個體

SGA 大小在一個或多個資料庫執行個體上被改變

如果設定不比對你的系統改變,會需要下面的問題:

Poor database performance

很差的資料庫性能

系統記憶體溢出或者大量的swapping

資料庫執行個體無法啟動

核心系統服務失敗

Oracle官方文檔

HugePages on Linux: What It Is... and What It Is Not... (Doc ID 361323.1)

HugePages on Oracle Linux 64-bit (Doc ID 361468.1)

HugePages and Oracle Database 11g Automatic Memory Management (AMM) on Linux (Doc ID 749851.1)

Linux IA64 example of allocating 48GB SGA using hugepages (Doc ID 397568.1)

Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (Doc ID 401749.1)

USE_LARGE_PAGES To Enable HugePages In 11.2 (Doc ID 1392497.1)

本文轉自 hsbxxl 51CTO部落格,原文連結:http://blog.51cto.com/hsbxxl/1075166,如需轉載請自行聯系原作者