Hugepages與Transparent HugePages配置對Oracle影響

概述

某幾位朋友查看完Oracle RAC環境構築文章時,他們都問到一件事情。爲什麼我沒有記載HugePages(標準大頁)與Transparent HugePages(透明大頁)相關的配置信息?Oracle官方不是強烈建議我們將相關參數進行修改嗎?它們是什麼東西呢?

操作系統中,內存是以塊即頁的方式進行管理的,當前大部分系統默認的頁大小爲4096 bytes即4K。CPU處理器有內置的內存管理單元,包含這些頁面的列表,每個頁面通過頁表條目引用。當內存越來越大的時候,CPU處理器需要管理這些內存頁的成本也就越高,這樣會對操作系統的性能產生影響。它有兩種不同的方式:

  • HugePages(標準大頁) => Oracle官方推薦使用方法
    Huge pages 是從Linux Kernel 2.6後被引入的,目的是通過使用大頁內存來取代傳統的4kb內存頁面,以適應越來越大的系統內存,讓操作系統可以支持現代硬件架構的大頁面容量功能。
    Huge pages 有兩種格式大小:2MB 和 1GB,2MB頁塊大小適合用於GB大小的內存,1GB頁塊大小適合用於TB級別的內存;2MB是默認的頁大小。

  • Transparent HugePages(透明大頁) => Oracle官方不推薦使用方法
    Transparent Huge Pages 縮寫 THP,這個是RHEL 6開始引入的一個功能,在Linux6上透明大頁是默認啓用的。
    由於Huge pages很難手動管理,而且通常需要對代碼進行重大的更改纔能有效的使用,因此RHEL 6開始引入了Transparent Huge Pages(THP),THP是一個抽象層,能夠自動創建、管理和使用傳統大頁。
    THP爲系統管理員和開發人員減少了很多使用傳統大頁的複雜性, 因爲THP的目標是改進性能, 因此其它開發人員 (來自社區和紅帽) 已在各種系統、配置、應用程序和負載中對 THP 進行了測試和優化。這樣可讓 THP 的默認設置改進大多數系統配置性能。但是, 不建議對數據庫工作負載使用 THP。

這兩者區別在於: 標準大頁管理是預分配的方式,而透明大頁管理則是動態分配的方式。

HugePages相關

HugePages優勢

  • 通過增加TLB(Translation Lookaside Buffer)撞擊率來提高性能
  • 可以提高oracle的性能,減少oracle sga的頁交換

HugePages缺點

  • 開啓該功能需要進行額外設置
  • Huge pages 和Oracle 11g性特性AMM(Automatic Memory Management)是相互衝突,但ASMM(AutomaticShared Memory Management)不受影響

HugePages操作

  • HugePages配置查詢
grep Huge /proc/meminfo
AnonHugePages:    585728 kB
HugePages_Total:       0   => 沒有配置hugepages
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB => 查看標準大頁(Huage Pages)的頁面大小

cat /proc/sys/vm/nr_hugepages
0 => 0 表示沒有配置
  • Oracle實例內存鎖定
# 實例配置
alter system set lock_sga=true scope=spfile;
alter system set pre_page_sga=true scope=spfile;
# 重啓實例應用配置
shutdown immediate
startup
  • Oracle官方推薦腳本計算HugePages大小
#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
# on Oracle Linux
#
# 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 
# http://support.oracle.com

# Welcome text
echo "
This script is provided by Doc ID 401749.1 from My Oracle Support 
(http://support.oracle.com) where it is intended to compute values for 
the recommended HugePages/HugeTLB configuration for the current shared 
memory segments on Oracle Linux. 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..."

read

# Check for the kernel version
KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`

# Find out the HugePage size
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk '{print $2}'`
if [ -z "$HPG_SZ" ];then
    echo "The hugepages may not be supported in the system where the script is being executed."
    exit 1
fi

# Initialize the counter
NUM_PG=0

# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | cut -c44-300 | awk '{print $1}' | 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.2') echo "Kernel version $KERN is not supported. Exiting." ;;
    '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" ;;
    '3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    '3.10') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    '4.1') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
esac

# End
  • sysctl參數配置
{
echo
echo \#\#  Changes done for to support Oracle RAC
echo "oracle        soft    memlock        unlimited"
echo "oracle        hard    memlock        unlimited"
echo \#\# End
echo
} >> /etc/security/limits.conf

{
echo 
echo \#\#  Changes done for to support Oracle RAC
echo "vm.nr_hugepages = HugePages_Total_Value" => 注意修改此值
echo \#\# End
echo
} > /etc/sysctl.d/97-oracle-database-sysctl.conf
/sbin/sysctl --system
/sbin/sysctl -p
  • 重啓系統及數據庫

HugePages注意

  • HugePages配置時,它的容量必須要比Oracle SGA配置大,否則將會導致HugePages無法適用。它稍微比SGA大一點即可,不需要大很多的。
  • limits.conf配置裏memlock也需要注意配置大小,可以將此參數設置爲unlimited。它的檢查方法是ulimit -l

Transparent HugePages相關

Transparent HugePages缺點

  • 在RAC環境下Transparent HugePages(透明大頁)會導致異常節點重啓和性能問題;
  • 在單機環境中,Transparent HugePages(透明大頁)會導致一些異常的性能問題;

Transparent HugePages操作

  • 查詢功能狀態
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

always => 表示啓用透明大頁; never => 表示關閉透明大頁;madvise => 表示只在MADV_HUGEPAGE標誌的VMA中使用THP;

  • CentOS / Redhat 7關閉THP功能
# 編輯啓動參數
vi /etc/sysconfig/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
# 增加參數"transparent_hugepage=never"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos_racnode01/root rd.lvm.lv=centos_racnode01/swap rhgb quiet transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"

# grub2重配置
grub2-mkconfig -o /boot/grub2/grub.cfg (On BIOS-based machines)
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg (On UEFI-based machines)

# 重啓操作系統
init 6
# 檢查參數效果
cat /proc/cmdline

參考MOS

  • HugePage說明詳見:HugePages on Oracle Linux 64-bit (文檔 ID 361468.1)

  • AMM & oracle兼容性詳見:HugePages and Oracle Database 11g Automatic Memory Management (AMM) on Linux (文檔 ID 749851.1)

  • HugePage大小獲取腳本:Oracle Linux: Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (文檔 ID 401749.1)

  • HugePageSize大小:HugePages on Linux: What It Is… and What It Is Not… (文檔 ID 361323.1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章