HugePages on Linux
【Huge pages】
在 Linux 中大頁分為兩種:Huge pages ( 標準大頁 ) 和 Transparent Huge pages( 透明大頁 ) 。
記憶體是以塊即頁的方式進行管理的,當前大部分系統預設的頁大小為 4096 bytes 即 4K 。1MB 記憶體等於 256 頁;1GB 記憶體等於 256000 頁。
系統程式是透過虛擬地址訪問記憶體,但是CPU必須把它轉換程實體記憶體地址才能真正訪問記憶體。
為了提高這個轉換效率,CPU會快取最近的虛擬記憶體地址和實體記憶體地址的對映關係,並儲存在一個由CPU維護的對映表中。
為了儘量提高記憶體的訪問速度,需要在對映表中儲存儘量多的對映關係。
而在Linux中,記憶體都是以頁的形式劃分的,預設情況下每頁是4K,這就意味著如果實體記憶體很大,則對映表的條目將會非常多,會影響CPU的檢索效率。
因為記憶體大小是固定的,為了減少對映表的條目,可採取的辦法只有增加頁的尺寸。
Huge pages 是從 Linux Kernel 2.6 後被引入的,目的是透過使用大頁記憶體來取代傳統的 4kb 記憶體頁面, 以適應越來越大的系統記憶體,讓作業系統可以支援現代硬體架構的大頁面容量功能。
Huge pages 有兩種格式大小:2MB 和 1GB , 2MB 頁塊大小適合用於 GB 大小的記憶體, 1GB 頁塊大小適合用於 TB 級別的記憶體;2MB 是預設的頁大小。
【Transparent Huge Pages】
Transparent Huge Pages 縮寫 THP ,這個是 RHEL 6 開始引入的一個功能,在 Linux6 上透明大頁是預設啟用的。
由於 Huge pages 很難手動管理,而且通常需要對程式碼進行重大的更改才能有效的使用,因此 RHEL 6 開始引入了 Transparent Huge Pages ( THP ), THP 是一個抽象層,能夠自動建立、管理和使用傳統大頁。
THP 為系統管理員和開發人員減少了很多使用傳統大頁的複雜性 , 因為 THP 的目標是改進效能 , 因此其它開發人員 ( 來自社群和紅帽 ) 已在各種系統、配置、應用程式和負載中對 THP 進行了測試和最佳化。這樣可讓 THP 的預設設定改進大多數系統配置效能。 但是 , 不建議對資料庫工作負載使用 THP 。
這兩者最大的區別在於 : 標準大頁管理是預分配的方式,而透明大頁管理則是動態分配的方式。
注:THP 目前只能對映非同步記憶體區域,比如堆和棧空間
【使用 Huge pages的優缺點】
Oracle 官方是推薦我們使用 Huge pages 的,它擁有以下的好處:
- Larger Page Size and Less # ofPages: Default page size is 4K whereas the HugeTLB size is 2048K. That meansthe system would need to handle 512 times less pages.
- Reduced Page Table Walking:Since a HugePage covers greater contiguous virtual address range than a regularsized page, a probability of getting a TLB hit per TLB entry with HugePages arehigher than with regular pages. This reduces the number of times page tablesare walked to obtain physical address from a virtual address.
- Less Overhead for MemoryOperations: On virtual memory systems (any modern OS) each memory operation isactually two abstract memory operations. With HugePages, since there are lessnumber of pages to work on, the possible bottleneck on page table access isclearly avoided.
- Less Memory Usage: From theOracle Database perspective, with HugePages, the Linux kernel will use lessmemory to create pagetables to maintain virtual to physical mappings for SGAaddress range, in comparison to regular size pages. This makes more memory tobe available for process-private computations or PGA usage.
- No Swapping: We must avoidswapping to happen on Linux OS at all Document 1295478.1. HugePages are notswappable (whereas regular pages are). Therefore there is no page replacementmechanism overhead. HugePages are universally regarded as pinned.
- No 'kswapd' Operations: kswapdwill get very busy if there is a very large area to be paged (i.e. 13 millionpage table entries for 50GB memory) and will use an incredible amount of CPUresource. When HugePages are used, kswapd is not involved in managing them. Seealso Document 361670.1
當然使用 Huge pages 也會存在某些缺點:
1、首先開啟該功能需要進行額外設定。
2、Huge pages 和 Oracle 11g新 特性 AMM ( Automatic Memory Management )是相互衝突的,但是 ASMM ( Automatic Shared Memory Management )仍然可以繼續使用。
Oracle 官方雖然推薦我們使用 Huge pages ,但是卻建議我們關閉 Transparent Huge pages ,因為透明大頁存在一些問題:
1)在 RAC 環境下 透明大頁( TransparentHugePages )會導致異常節點重啟,和效能問題;
2)在單機環境中,透明大頁( TransparentHugePages ) 也會導致一些異常的效能問題;
注:Transparent Huge Pages在32位的RHEL 6中是不支援的。
【配置HugePages】
1、配置須知
1)Hugepages是在分配後就會預留出來的,其大小一定要比伺服器上所有例項的SGA總和要大,差一點都不行。
比如說Hugepages設定為8G,oracle SGA為9G,那麼oracle在啟動的時候就不會使用到這8G的Hugepages。這8G就浪費了。所以在設定Hugepages時要計算SGA的大小,後面會給出一個指令碼來計算。
2)其他程式無法使用Hugepages的記憶體,所以不要設定太大,稍稍比SGA大一點保證SGA可以使用到hugepages就好了。
3)在meminfo中和Hugepage相關的有四項:
grep HugePages /proc/meminfo
HugePages_Total: 4611
HugePages_Free: 474
HugePages_Rsvd: 467
Hugepagesize: 2048 kB
HugePages_Total為所分配的頁面數目,和Hugepagesize相乘後得到所分配的記憶體大小。4611*2/1024大約為9GB
HugePages_Free為從來沒有被使用過的Hugepages數目。即使oracle sga已經分配了這部分記憶體,但是如果沒有實際寫入,那麼看到的還是Free的。這是很容易誤解的地方。
HugePages_Rsvd為已經被分配預留但是還沒有使用的page數目。在Oracle剛剛啟動時,大部分記憶體應該都是Reserved並且Free的,隨著oracle SGA的使用,Reserved和Free都會不斷的降低。
HugePages_Free-HugePages_Rsvd 這部分是沒有被使用到的記憶體,如果沒有其他的oracle instance,這部分記憶體也許永遠都不會被使用到,也就是被浪費了。
4)HugePages和oracle AMM(自動記憶體管理)是互斥的,所以使用HugePages必須設定記憶體引數MEMORY_TARGET / MEMORY_MAX_TARGET 為0。
2、資料庫檢查資料庫的SGA引數配置
1)sga_max_size 設定為 (實體記憶體的1/2 - 1G )
2)檢查sga_target 和 memory_max_target 引數都為0 (關閉動態記憶體分配功能)
3)重新啟動資料庫 再檢查1、2設定是否正確
2、系統設定
1)修改核心引數memlock,單位是KB, 實體記憶體的一半。
/etc/security/limits.conf (一般使用是這個檔案,修改這個檔案前 先備份這個檔案)
oracle soft memlock 實體記憶體的一半(單位是KB)
oracle hard memlock 實體記憶體的一半(單位是KB)
這個過程中使用memlock標記,用於設定每個使用者允許的最大記憶體使用情況。
2)使用Oracle帳號驗證大小
[oracle@dtydb5 ~]$ ulimit -a|grep lock
max locked memory (kbytes, -l) (是否是實體記憶體的一半)
3)計算需要使用的hugepage頁面的大小。
hugepage目前只能用於共享記憶體段等少量記憶體型別,例如oracle SGA。 PGA則不適用。
4)檢查目前hugepagesize的大小
[root@dtydb5 ~]# grep Hugepagesize /proc/meminfo
Hugepagesize: 2048 kB
(大頁的頁面大小是2M)
hugepage設定為實體記憶體的一半:這個值就是 (實體記憶體的1/2 (單位M)) /2M
5)修改vm.nr_hugepages引數,值為上步計算的數值
vi /etc/sysctl.conf (修改前備份檔案)
vm.nr_hugepages = 上述的計算值
sysctl -p 命令使配置生效。
6)關閉資料庫,重啟主機和資料庫
驗證是否設定正確:
grep HugePages /proc/meminfo
HugePages_Free小於HugePages_Total的值則表示設定成功。如果HugePages_Rsvd應該保持少量保留記憶體。
注意:HugePages如果配置不恰當會引起系統效能下降等風險,需要慎重
【參考官方文件】
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)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69997824/viewspace-2767436/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- How to disable transparent hugepages (THP) on Red Hat Enterprise Linux 7Linux
- HugePages詳解
- 【TUNE_ORACLE】Oracle資料庫與HugePages(二)HugePages配置和限制Oracle資料庫
- [20191211]hugepages pagetables.txt
- 【TUNE_ORACLE】Oracle資料庫與HugePages(一)HugePages概念和優勢Oracle資料庫
- [201804012]關於hugepages 3.txt
- 【TUNE_ORACLE】Oracle資料庫與HugePages(三)HugePages常見問題和解決辦法Oracle資料庫
- [20191129]關於hugepages的問題.txt
- [20221125]設定hugepages遇到的問題.txt
- [20191202]關於hugepages相關問題.txt
- [20191202]關於oracle例項是否使用hugepages問題.txtOracle
- [20191204]關於oracle例項是否使用hugepages問題2.txtOracle
- 【TUNE_ORACLE】Oracle資料庫與HugePages(四)如何禁用透明大頁Oracle資料庫
- 【Linux】常用linux操作Linux
- 【LINUX】LINUX PHP搭建LinuxPHP
- 【linux】Linux作業系統Linux作業系統
- 【Linux基礎】Linux目錄Linux
- Linux小白如何快速上手Linux?Linux
- 【Linux】Linux安全加固指令碼Linux指令碼
- Linux安裝之Linux mintLinux
- linuxLinux
- Linux啟用 “啟用 Linux” 水印Linux
- Linux 3.11正式命名為Linux For WorkgroupsLinux
- 【Linux】 Linux網路程式設計Linux程式設計
- Linux系統管理——Linux簡介Linux
- Linux發行版 vs Linux核心Linux
- Linux 筆記分享三:Linux 命令Linux筆記
- 【Linux】Linux檔案之/etc/fstabLinux
- Linux學習方法_Linux介紹_Linux發行版組成Linux
- 認識linux核心(linux核心的作用)Linux
- 在Linux中,什麼是Linux shell?Linux
- Linux之父: Rust 將進入 Linux 6.1LinuxRust
- Linux是什麼?Linux有哪些版本?Linux
- 【Linux】萬字總結Linux常用指令Linux
- 【linux專案】lichee nano linux燒寫LinuxNaN
- 【Linux天梯】第一話·初見LinuxLinux
- linux命令大全-linux命令使用和管理Linux
- 【Linux】Linux開啟snmp及查詢Linux