Hugepages你用了吗?--原理概念篇
Hugepages你用了嗎?----原理概念篇
Hugepages你用了嗎?----測試案例篇
? ?? 引子
???? 系統進程是通過虛擬地址訪問內存,但是CPU必須把它轉換程物理內存地址才能真正訪問內存。為了提高這個轉換效率,CPU會緩存最近的虛擬內存地址和物理內存地址的映射關系,并保存在一個由CPU維護的映射表中。為了盡量提高內存的訪問速度,需要在映射表中保存盡量多的映射關系。
??? 而在Linux中,內存都是以頁的形式劃分的,默認情況下每頁是4K,這就意味著如果物理內存很大,則映射表的條目將會非常多,會影響CPU的檢索效率。因為內存大小是固定的,為了減少映射表的條目,可采取的辦法只有增加頁的尺寸。
一、hugepages及相關概念
??? hugepage是在Linux2.6內核被引入的,主要提供4k的page和比較大的page的選擇。
??? 有一些顯示的概念需要澄清,在我們繼續討論Hugepages之前, 如hugetlb, hugetlbfs
page table(頁表)是操作系統上的虛擬內存系統的數據結構模型,用于存儲虛擬地址與物理地址的對應關系。
當我們訪問內存時,首先訪問”page table“,然后Linux在通過“page table”的mapping來訪問真實物理內存(ram+swap)
TLB: A Translation Lookaside Buffer (TLB)
TLB是在cpu中分配的一個固定大小的buffer(or cache),用于保存“page table”的部分內容,使CPU更快的訪問并進行地址轉換。
hugetlb: hugetlb 是記錄在TLB 中條目并指向到Hugepage。所以HugePages 通過 hugetlb entries來調用的。
hugetlbfs: 這是一個新的基于2.6 kernel之上的內存文件系統,如同tmpfs。
在TLB中通過hugetlb來指向hugepage。這些被分配的hugepage作為內存文件系統hugetlbfs(類似tmpfs)提供給進程使用。
二、“regular page”和“huge page“的請求過程
當一個進程請求內存時,它需要訪問文件系統的“頁表”(Pagetable)去調用一個實際的物理內存地址
當Hugepage部署后,依然是調用普通的頁表。 最大的不同是process pagetable和system pagetable增加了Hugepage屬性。所以任何頁表中的page條目可以是“regular page” 或者是“huge page”
HugePage 的尺寸根據內核版本和硬件架構從 2MB 到 256MB , 如下表
| HW Platform | Source Code Tree | Kernel 2.4 | Kernel 2.6 |
| Linux x86 (IA32) | i386 | 4 MB | 4 MB * |
| Linux x86-64 (AMD64, EM64T) | x86_64 | 2 MB | 2 MB |
| Linux Itanium (IA64) | ia64 | 256 MB | 256 MB |
| IBM Power Based Linux (PPC64) | ppc64/powerpc | N/A ** | 16 MB |
| IBM zSeries Based Linux | s390 | N/A | N/A |
| IBM S/390 Based Linux | s390 | N/A | N/A |
三、 hugepage 優點
1. HugePages 會在系統啟動時,直接分配并保留對應大小的內存區域
2. HugePages 在開機之后,如果沒有管理員的介入,是不會釋放和改變的。
3. Not swappable: HugePages 是不會swap.也就是沒有page-in/page-out。HugePages一直被pin在內存中
4. Relief of TLB pressure:
在purge TLB的時候,減少了事物條目的加載,提高了性能。
使用Hugepages后TLB能覆蓋更大的內存地址空間,加快地址轉換的時間
更少的TLB條目,意味著有更大空間用來記錄其他的地址空間
?
四. 如何配置Hugepages
?? 根據下面的步驟來配置Hugepages,修改Hugepages需要重啟機器,使用請計劃停機時間。
Step 1: 需要在/etc/security/limits.conf 中設置memlock值(單位KB),該值小于內存大小,例如你的內存大小是64G,有可以設置以下的值
*?? soft?? memlock??? 60397977
*?? hard?? memlock??? 60397977
這個值大于SGA需求并沒有什么害處。
如果是Exadata機器,參數要求請參考文檔1284261.1
Step 2: 重新登錄root和oracle用戶,檢查memlock? limit
$ ulimit -l
60397977
Step 3: 如果你使用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就可以了。
-----------------------------------------------------------------
Step 4:
確保你的全部實例都已經啟動(包括ASM) ,然后根據Document 401749.1 的hugepages_settings.sh去評估需要設置的Hugepages的大小。
$ ./hugepages_settings.sh
...
Recommended setting: vm.nr_hugepages = 1496
注:也可以自己計算需要的Hugepages大小,其實就是Hugepages size> all of the SGA size
Step 5: 編輯/etc/sysctl.conf 設置 vm.nr_hugepages參數:
...
vm.nr_hugepages = 1496
...
Step 6: 停止實例并重啟OS系統
Step 7:檢查設置是否生效
系統重啟后,啟動全部的數據庫,通過以下命令檢查
# grep HugePages /proc/meminfo
HugePages_Total:??? 1496
HugePages_Free:????? 485
HugePages_Rsvd:????? 446
HugePages_Surp:??????? 0
HugePages_Free< 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 <oracle group>
它不會去改變/etc/sysctl.conf文件中的hugepages值,當OS重啟后,系統會再恢復到/etc/sysctl.conf中配置的hugepages值。
六、如果Database / SGA 配置改變,會怎么樣?
當你的系統涉及到以下改變的時候,你需要注意了,Hugepages可能需要重新設置
- Linux OS 物理內存大小的改變
- 安裝新的數據庫實例
- SGA 大小在一個或多個數據庫實例上被改變
如果設置不匹配你的系統改變,會需要下面的問題:
- Poor database performance
- 很差的數據庫性能
- 系統內存溢出或者大量的swapping
- 數據庫實例無法啟動
- 核心系統服務失敗
針對以上概念,可以根據“Hugepages你用了嗎?--測試案例篇”來更深入的理解。
?
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)
?
轉載于:https://blog.51cto.com/hsbxxl/1075166
總結
以上是生活随笔為你收集整理的Hugepages你用了吗?--原理概念篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【java】Java异常处理总结
- 下一篇: 多进程与多线程(1)