Linux Hugepages的使用(引用)
Hugepages是從Linux kernal 2.6後被引入的,其目的是使用更大的memory page size以適應越來越大的系統記憶體。[@more@]
1. 首先計算SGA大小已決定你要使用多少HugePages記憶體頁。
你可以手工計算,如果使用了ASMM可以用SGA_Target/Hugepagesize,否則可以將db_cache_size,large_pool_size, shared_pool_size,jave_pool_size, streams_pool_size五個部分加起來除以Hugepagesize。
或者可以先將oracle instance都起起來,然後ipcs -m檢視共享記憶體段大小來計算。oracle在401749.1中也提供了一個指令碼來幫助計算,指令碼如下:
#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
#
# Note: This script does calculation for all shared memory
# segments available when the script is run, no matter it
# is an Oracle RDBMS shared memory segment or not.
#
# This script is provided by Doc ID 401749.1 from My Oracle Support
# />
# Welcome text
echo "
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 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..."
read
# Check for the kernel version
KERN=`uname -r | awk -F. '{ printf("%d.%dn",$1,$2); }'`
# Find out the HugePage size
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk '{print $2}'`
# Initialize the counter
NUM_PG=0
# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | awk '{print $5}' | grep "[0-9][0-9]*"`
do
MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
if [ $MIN_PG -gt 0 ]; then
NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
fi
done
RES_BYTES=`echo "$NUM_PG * $HPG_SZ * 1024" | bc -q`
# An SGA less than 100MB does not make sense
# Bail out if that is the case
if [ $RES_BYTES -lt 100000000 ]; then
echo "***********"
echo "** ERROR **"
echo "***********"
echo "Sorry! There are not enough total of shared memory segments allocated for
HugePages configuration. HugePages can only be used for shared memory segments
that you can list by command:
# ipcs -m
of a size that can match an Oracle Database SGA. Please make sure that:
* Oracle Database instance is up and running
* Oracle Database 11g Automatic Memory Management (AMM) is not configured"
exit 1
fi
# Finish with results
case $KERN in
'2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
'2.6') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
*) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End
2. 關閉所有oracle例項
3. 用root設定oracle memlock limit,設定一個較大的數值或者unlimited
在/etc/security/limits.conf最後新增
oracle hard memlock unlimited
oracle soft memlock unlimited
4. 分配hugepages記憶體
在/etc/sysctl.conf中新增
vm.nr_hugepages =
執行sysctl -p使其生效。這時候記憶體就已經被分配了,可以檢視meminfo
grep Huge /proc/meminfo
HugePages_Total為設定的值大小,HugePages_Free應該和HugePages_Total一樣大,HugePages_Rsvd為0.
5. 啟動Oracle instance
這時候再次檢視meminfo
HugePages_Total為設定的值大小不變,HugePages_Free有所降低,HugePages_Rsvd為一個較大的數值(因為剛剛啟動時,大部分SGA被分配但是沒有被使用到)。
如果Hugepages沒有被使用,可能一些memory page被分配為4k大小了,那麼需要重啟server來設定。
從我們的測試結果看,Hugepages可以提高OLTP系統10%的吞吐量,當然不同的資料庫應用結果可能不同,但是總體來說這是一個nice to have的設定。
推薦一些Hugepages相關的文章:
Metalink Note: 361323.1,744769.1, 748637.1
Yong’s blog:
Hugepages是從Linux kernal 2.6後被引入的,其目的是使用更大的memory page size以適應越來越大的系統記憶體。
計算機硬體的發展速度太快了,所以作業系統的一些配置也要相應的隨之改變。
在Linux下,預設的page size大小為4k。顯然對於現在的SGA比較大的資料庫系統來說,4k的page size有點太小了。
我們來看看兩者之間有什麼區別
1. Page Table大小
Page Table是用來存放虛擬記憶體也和實體記憶體頁對應關係的記憶體結構。因為page size較小,所以相應的改記憶體結構也會比較大。
而Hugepages的常見page size為2M,是4k size的500倍,所以可以大大減小page table的size。
我們來看兩個例子:
這是一個沒有配置Hugepage的系統,系統記憶體128G,pagetable大小大約為4G。
cat /proc/meminfo
MemTotal: 132086880 kB
PageTables: 4059612 kB
這是配置了Hugepage的系統,系統記憶體96G, PageTable大小僅為78M
MemTotal: 98999880 kB
PageTables: 79916 kB
2. 大大提高了CPU cache中存放的page table所覆蓋的記憶體大小,從而提高了TLB命中率
程式的虛擬記憶體地址段先連線到page tables然後再連線到實體記憶體。所以在訪問記憶體時需要先訪問page tables得到虛擬記憶體和實體記憶體的對映關係,然後再訪問實體記憶體。
CPU cache中有一部分TLB(Translation Lookaside Buffer)用來存放部分page table以提高這種裝換的速度。因為page size變大了,所以同樣大小的TLB,所覆蓋的記憶體大小也變大了。提高了TBL命中率,也就是提高了地址轉換的速度。
3. 使用Hugepages的記憶體頁是不會被交換出去的,永遠常駐在記憶體中,所以也減少了記憶體也替換的額外開銷
下面再說說在資料庫伺服器上使用Hugepages要注意的幾點
1. Hugepages是在分配後就會預留出來的,其大小一定要比伺服器上所有例項的SGA總和要大,差一點都不行。
比如說Hugepages設定為90G,oracle SGA為91G,那麼oracle在啟動的時候就不會使用到這90G的Hugepages。這90G就浪費了。所以在設定Hugepages時要計算SGA的大小,後面會給出一個指令碼來計算。
2. 其他程式無法使用Hugepages的記憶體,所以不要設定太大,稍稍比SGA大一點保證SGA可以使用到hugepages就好了。
3. PGA不會使用Hugepages的記憶體。所以11g的AMM (Automatic Memory Management,memory_target引數)是不被支援的。而ASMM(Automatic Shared Memory Management, SGA_target引數)是被支援的,這兩個不要搞混淆了。
4. 在meminfo中和Hugepage相關的有四項(RHEL5)
HugePages_Total: 43000
HugePages_Free: 29493
HugePages_Rsvd: 23550
Hugepagesize: 2048 kB
HugePages_Total為所分配的頁面數目,和Hugepagesize相乘後得到所分配的內
計算機硬體的發展速度太快了,所以作業系統的一些配置也要相應的隨之改變。
在Linux下,預設的page size大小為4k。顯然對於現在的SGA比較大的資料庫系統來說,4k的page size有點太小了。
我們來看看兩者之間有什麼區別
1. Page Table大小
Page Table是用來存放虛擬記憶體也和實體記憶體頁對應關係的記憶體結構。因為page size較小,所以相應的改記憶體結構也會比較大。
而Hugepages的常見page size為2M,是4k size的500倍,所以可以大大減小page table的size。
我們來看兩個例子:
這是一個沒有配置Hugepage的系統,系統記憶體128G,pagetable大小大約為4G。
cat /proc/meminfo
MemTotal: 132086880 kB
PageTables: 4059612 kB
這是配置了Hugepage的系統,系統記憶體96G, PageTable大小僅為78M
MemTotal: 98999880 kB
PageTables: 79916 kB
2. 大大提高了CPU cache中存放的page table所覆蓋的記憶體大小,從而提高了TLB命中率
程式的虛擬記憶體地址段先連線到page tables然後再連線到實體記憶體。所以在訪問記憶體時需要先訪問page tables得到虛擬記憶體和實體記憶體的對映關係,然後再訪問實體記憶體。
CPU cache中有一部分TLB(Translation Lookaside Buffer)用來存放部分page table以提高這種裝換的速度。因為page size變大了,所以同樣大小的TLB,所覆蓋的記憶體大小也變大了。提高了TBL命中率,也就是提高了地址轉換的速度。
3. 使用Hugepages的記憶體頁是不會被交換出去的,永遠常駐在記憶體中,所以也減少了記憶體也替換的額外開銷
下面再說說在資料庫伺服器上使用Hugepages要注意的幾點
1. Hugepages是在分配後就會預留出來的,其大小一定要比伺服器上所有例項的SGA總和要大,差一點都不行。
比如說Hugepages設定為90G,oracle SGA為91G,那麼oracle在啟動的時候就不會使用到這90G的Hugepages。這90G就浪費了。所以在設定Hugepages時要計算SGA的大小,後面會給出一個指令碼來計算。
2. 其他程式無法使用Hugepages的記憶體,所以不要設定太大,稍稍比SGA大一點保證SGA可以使用到hugepages就好了。
3. PGA不會使用Hugepages的記憶體。所以11g的AMM (Automatic Memory Management,memory_target引數)是不被支援的。而ASMM(Automatic Shared Memory Management, SGA_target引數)是被支援的,這兩個不要搞混淆了。
4. 在meminfo中和Hugepage相關的有四項(RHEL5)
HugePages_Total: 43000
HugePages_Free: 29493
HugePages_Rsvd: 23550
Hugepagesize: 2048 kB
HugePages_Total為所分配的頁面數目,和Hugepagesize相乘後得到所分配的內
存大小。43000*2/1024大約為84GB
HugePages_Free為從來沒有被使用過的Hugepages數目。即使oracle sga已經分配了這部分記憶體,但是如果沒有實際寫入,那麼看到的還是Free的。這是很容易誤解的地方
HugePages_Rsvd為已經被分配預留但是還沒有使用的page數目。在Oracle剛剛啟動時,大部分記憶體應該都是Reserved並且Free的,隨著oracle SGA的使用,Reserved和Free都會不斷的降低
HugePages_Free – HugePages_Rsvd 這部分是沒有被使用到的記憶體,如果沒有其他的oracle instance,這部分記憶體也許永遠都不會被使用到,也就是被浪費了。在該系統上有11.5GB的記憶體被浪費了。
Note: RHEL4上的meminfo有所區別,沒有HugePages_Rsvd這一項,並且當oracle instance啟動時,所分配的記憶體就從free list上被移除掉了。也就是啟動後HugePages_Free就是沒有被SGA用到被浪費的記憶體。
最後說說如何設定HugePages:
HugePages_Free為從來沒有被使用過的Hugepages數目。即使oracle sga已經分配了這部分記憶體,但是如果沒有實際寫入,那麼看到的還是Free的。這是很容易誤解的地方
HugePages_Rsvd為已經被分配預留但是還沒有使用的page數目。在Oracle剛剛啟動時,大部分記憶體應該都是Reserved並且Free的,隨著oracle SGA的使用,Reserved和Free都會不斷的降低
HugePages_Free – HugePages_Rsvd 這部分是沒有被使用到的記憶體,如果沒有其他的oracle instance,這部分記憶體也許永遠都不會被使用到,也就是被浪費了。在該系統上有11.5GB的記憶體被浪費了。
Note: RHEL4上的meminfo有所區別,沒有HugePages_Rsvd這一項,並且當oracle instance啟動時,所分配的記憶體就從free list上被移除掉了。也就是啟動後HugePages_Free就是沒有被SGA用到被浪費的記憶體。
最後說說如何設定HugePages:
1. 首先計算SGA大小已決定你要使用多少HugePages記憶體頁。
你可以手工計算,如果使用了ASMM可以用SGA_Target/Hugepagesize,否則可以將db_cache_size,large_pool_size, shared_pool_size,jave_pool_size, streams_pool_size五個部分加起來除以Hugepagesize。
或者可以先將oracle instance都起起來,然後ipcs -m檢視共享記憶體段大小來計算。oracle在401749.1中也提供了一個指令碼來幫助計算,指令碼如下:
#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
#
# Note: This script does calculation for all shared memory
# segments available when the script is run, no matter it
# is an Oracle RDBMS shared memory segment or not.
#
# This script is provided by Doc ID 401749.1 from My Oracle Support
# />
# Welcome text
echo "
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 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..."
read
# Check for the kernel version
KERN=`uname -r | awk -F. '{ printf("%d.%dn",$1,$2); }'`
# Find out the HugePage size
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk '{print $2}'`
# Initialize the counter
NUM_PG=0
# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | awk '{print $5}' | grep "[0-9][0-9]*"`
do
MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
if [ $MIN_PG -gt 0 ]; then
NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
fi
done
RES_BYTES=`echo "$NUM_PG * $HPG_SZ * 1024" | bc -q`
# An SGA less than 100MB does not make sense
# Bail out if that is the case
if [ $RES_BYTES -lt 100000000 ]; then
echo "***********"
echo "** ERROR **"
echo "***********"
echo "Sorry! There are not enough total of shared memory segments allocated for
HugePages configuration. HugePages can only be used for shared memory segments
that you can list by command:
# ipcs -m
of a size that can match an Oracle Database SGA. Please make sure that:
* Oracle Database instance is up and running
* Oracle Database 11g Automatic Memory Management (AMM) is not configured"
exit 1
fi
# Finish with results
case $KERN in
'2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
'2.6') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
*) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End
2. 關閉所有oracle例項
3. 用root設定oracle memlock limit,設定一個較大的數值或者unlimited
在/etc/security/limits.conf最後新增
oracle hard memlock unlimited
oracle soft memlock unlimited
4. 分配hugepages記憶體
在/etc/sysctl.conf中新增
vm.nr_hugepages =
執行sysctl -p使其生效。這時候記憶體就已經被分配了,可以檢視meminfo
grep Huge /proc/meminfo
HugePages_Total為設定的值大小,HugePages_Free應該和HugePages_Total一樣大,HugePages_Rsvd為0.
5. 啟動Oracle instance
這時候再次檢視meminfo
HugePages_Total為設定的值大小不變,HugePages_Free有所降低,HugePages_Rsvd為一個較大的數值(因為剛剛啟動時,大部分SGA被分配但是沒有被使用到)。
如果Hugepages沒有被使用,可能一些memory page被分配為4k大小了,那麼需要重啟server來設定。
從我們的測試結果看,Hugepages可以提高OLTP系統10%的吞吐量,當然不同的資料庫應用結果可能不同,但是總體來說這是一個nice to have的設定。
推薦一些Hugepages相關的文章:
Metalink Note: 361323.1,744769.1, 748637.1
Yong’s blog:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24237320/viewspace-1059702/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HugePages on LinuxLinux
- Linux HugepagesLinux
- Linux Hugepages[轉]Linux
- Linux 下配置 HugePagesLinux
- linux配置大頁HugePagesLinux
- Oracle Linux 7禁用Transparent HugePagesOracleLinux
- Linux HugePages /proc/meminfo輸出行的含義Linux
- linux上Oracle的sga(HugePages)分配問題LinuxOracle
- Shell Script to Calculate Values Recommended Linux HugePagesLinux
- 配置 HugePages for Oracle on Linux (x86-64)OracleLinux
- linux大記憶體Hugepages最佳化Linux記憶體
- ID 361468.1 HugePages on Oracle Linux 64-bitOracleLinux
- Linux 11G RAC啟用HugePages與AMM的禁用Linux
- 0927hugepages與nr_overcommit_hugepagesMIT
- HugePages詳解
- HugePages on Oracle Linux 64-bit (Doc ID 361468.1)OracleLinux
- LINUX HUGEPAGES在大記憶體資料庫中的應用Linux記憶體資料庫
- How to disable transparent hugepages (THP) on Red Hat Enterprise Linux 7Linux
- Linux中設定hugepages 在記憶體中 lock SGALinux記憶體
- 【TUNE_ORACLE】Oracle資料庫與HugePages(二)HugePages配置和限制Oracle資料庫
- #### 使用方法引用的使用場景--通過物件名引用成員方法物件
- hugepages_setting(linux大記憶體設定指令碼)Linux記憶體指令碼
- 【TUNE_ORACLE】Oracle資料庫與HugePages(一)HugePages概念和優勢Oracle資料庫
- Swift中的迴圈強引用 【使用無主引用解決】Swift
- 變數和引用 Linux變數Linux
- Java的強引用、軟引用、弱引用、虛引用Java
- 虛引用的使用場景有哪些?
- Linux下變數的定義及引用Linux變數
- java的強引用、軟引用、弱引用、幻象引用,引用佇列總結Java佇列
- Java中的四種引用方式(強引用、軟引用、弱引用、虛引用)Java
- 理解Java的強引用、軟引用、弱引用和虛引用Java
- 有效避免OOM--合理使用軟引用和弱引用OOM
- Java/Android中的強引用、軟引用、弱引用、虛引用JavaAndroid
- Oracle 之 配置HugePages記憶體Oracle記憶體
- Java引用型別解析:掌握強引用、軟引用、弱引用和幻象引用的妙用Java型別
- HTML中CSS引用:選擇器的使用HTMLCSS
- Android效能優化篇:使用軟引用和弱引用Android優化
- 【TUNE_ORACLE】Oracle資料庫與HugePages(三)HugePages常見問題和解決辦法Oracle資料庫