Linux下HugePage記憶體功能配置
在Linux環境效能最佳化實踐中,HugePage是一個經常提到的方法。簡單的說,HugePage就是Linux核心上一種是用記憶體塊的方法。作為傳統4K Page的替代,HugePage在大部分場景下可以提升Oracle例項的執行效能效率。
本篇介紹如何進行HugePage配置和Oracle環境使用。
1、HugePage介紹
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的;
ü 減少TLB(Translation Look aside Buffer)負擔:TBL是在CPU裡面的一塊緩衝區域,其中包括了部分Page Table內容。使用HugePage可以減少TLB工作負載;
ü 減少Page Table空間負載:在PageTable管理中,每條Page記錄是要佔據64byte的空間的。也就是說,如果一塊50G的RAM,4k大小的PageTable要有80MB左右;
ü 減少PageTable檢索負載:更小的PageTable意味著更快的檢索定位能力;
ü 記憶體效能提升:Page數量減少、大小的增加,減少了管理過程的複雜性,進一步減少了瓶頸出現的機率;
對於Oracle而言,例項執行環境(Database和ASM)都面對一個HugePage最佳化的問題。
2、基礎環境準備
我們選擇RedHat 5.3版本,也就是Kernel2.6進行實驗。
[oracle@SimpleLinux ~]$ uname -r
2.6.18-128.el5
此時Oracle例項為11gR2(11.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系列引數,實現了ASMM(Automatic Shared Memory Management)。ASMM的本質是實現SGA和PGA內部各個池之間的動態調整。但是在11g中,推出了AMM(Automatic Memory Management),實現了PGA和SGA之間的調節。
AMM其實是複雜的。SGA在Linux中是透過系統共享記憶體實現,而PGA是透過程式私有空間實現。AMM實際上最大的功能是將SGA和PGA空間調節的通道打通,這必然帶來對原有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
3、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作為重點,這部分內容略,留待其他文章進行說明。
修改之後,需要重啟伺服器,因為一些引數屬於靜態引數。
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
5、HugePage啟動檢驗
設定之後,最好重新啟動伺服器,包括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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle在Linux下對記憶體大頁HugePage的實踐OracleLinux記憶體
- Linux 中的“大記憶體頁”(hugepage)是個什麼?Linux記憶體
- 作業系統HugePage配置導致記憶體驟降探究作業系統記憶體
- [20210803]對比transparent hugepage的記憶體消耗.txt記憶體
- Linux 虛擬記憶體引數配置Linux記憶體
- 雲原生背景下如何配置 JVM 記憶體JVM記憶體
- [Linux]共享記憶體Linux記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- Linux下找出吃記憶體的方法總結Linux記憶體
- 如何在 Linux 下檢測記憶體洩漏Linux記憶體
- Tomcat修改記憶體配置Tomcat記憶體
- MySQL InnoDB記憶體配置MySql記憶體
- Linux實體記憶體管理Linux記憶體
- 配置 ZRAM,實現 Linux 下的記憶體壓縮,零成本低開銷獲得成倍記憶體擴增Linux記憶體
- Linux共享記憶體(二)Linux記憶體
- Linux 虛擬記憶體Linux記憶體
- Meta “透明記憶體解除安裝” 功能亮相:可為 Linux 伺服器節省 20%-32% 記憶體記憶體Linux伺服器
- JVM記憶體引數配置JVM記憶體
- Linux記憶體子系統——Locking Pages(記憶體鎖定)Linux記憶體
- Linux記憶體洩露案例分析和記憶體管理分享Linux記憶體洩露
- 如何檢視linux系統中空閒記憶體/實體記憶體使用/剩餘記憶體Linux記憶體
- 【大頁記憶體】Oracle資料庫配置大頁記憶體記憶體Oracle資料庫
- Linux:深入淺出 Linux 共享記憶體Linux記憶體
- Linux共享記憶體的管理Linux記憶體
- Linux 記憶體區管理 slabLinux記憶體
- linux記憶體管理(二)- vmallocLinux記憶體
- Linux記憶體、Swap、Cache、BufferLinux記憶體
- Linux下基於記憶體分析的Rootkit檢測方法Linux記憶體
- (2)Linux效能調優之Linux記憶體體系Linux記憶體
- Linux記憶體不夠了?看看如何開啟虛擬記憶體增加記憶體使用量Linux記憶體
- docker下netcore記憶體dumpDockerNetCore記憶體
- Linux 的記憶體分頁管理Linux記憶體
- Linux 記憶體管理 pt.3Linux記憶體
- Linux 記憶體管理 pt.1Linux記憶體
- Linux 記憶體管理 pt.2Linux記憶體
- linux檔案存在記憶體裡Linux記憶體
- Linux的記憶體分頁管理Linux記憶體
- Linux之記憶體最佳化Linux記憶體
- linux 設定預留記憶體Linux記憶體