Oracle HugePages

翻譯自https://docs.oracle.com/database/121/UNXAR/appi_vlm.htm#UNXAR391

G.1HugePages概述

HugePages是集成到Linux內核2.6中的功能。啓用HugePages使操作系統可以支持大於默認值(通常爲4 KB)的內存頁。使用非常大的頁面大小可以通過減少訪問頁面表條目所需的系統資源量來提高系統性能。HugePages對於32位和64位配置都是有用的。HugePage的大小從2 MB到256 MB不等,具體取決於內核版本和硬件體系結構。對於Oracle數據庫,使用HugePages可以減少頁面狀態的操作系統維護,並提高轉換後備緩衝區(TLB)的命中率。

注意:Transparent Hugepages當前不是手動配置HugePages的替代方法。

G.1.1使用Hugepages調整SGA

沒有HugePages,操作系統將每個4kb的內存作爲一個頁面。當它向數據庫系統全局區域(SGA)分配頁時,操作系統內核必須爲分配給SGA的每一個4KB的頁使用頁生命週期(髒頁、空閒頁、映射到進程等)不斷更新其頁表。

使用HugePages,操作系統頁表(虛擬內存到物理內存的映射)更小,因爲每個頁表條目指向的頁從2MB到256MB。

而且,內核的生命週期必須被監視的頁面更少。例如,如果在64位硬件上使用HugePages,並且要映射256 MB內存,則可能需要一個頁表條目(PTE)。如果不使用HugePages,並且要映射256MB的內存,則必須有256MB*1024KB/4KB=65536PTE。

HugePages具有以下優點:

  • 通過提高TLB命中率來提高性能
  • 頁面被鎖定在內存中並且永不交換,這爲共享內存結構(例如SGA)提供了RAM
  • 連續的頁面已預先分配,不能用於System V共享內存(例如SGA)
  • 由於較大的頁面大小,因此對於虛擬內存的那部分內核的簿記工作較少

G.1.2在Linux上配置HugePages

完成以下步驟以在計算機上配置HugePages:

  1. 運行以下命令以確定內核是否支持HugePages:
$ grep Huge /proc/meminfo
  1. 某些Linux系統默認不支持HugePages。對於此類系統,請使用CONFIG_HUGETLBFS和CONFIG_HUGETLB_PAGE配置選項構建Linux內核。CONFIG_HUGETLBFS位於“文件系統”下,CONFIG_HUGETLB_PAGE選擇時處於選中狀態CONFIG_HUGETLBFS。
  2. 在/etc/security中編輯memlock設置/極限.conf文件。memlock設置以KB爲單位指定,當啓用HugePages內存時,最大鎖定內存限制應至少設置爲當前RAM的90%,禁用HugePages內存時,最大鎖定內存限制應設置爲至少3145728 KB(3 GB)。例如,如果安裝了64 GB RAM,則添加以下條目以增加最大鎖定內存地址空間:
*   soft   memlock    60397977
*   hard   memlock    60397977

您還可以將memlock值設置爲高於SGA要求。

  1. oracle再次以用戶身份登錄並運行ulimit -l命令以驗證新memlock設置:
$ ulimit -l
60397977
  1. 運行以下命令以顯示Hugepagesize變量的值:
$ grep Hugepagesize /proc/meminfo
  1. 完成以下過程,創建一個腳本,該腳本計算hugepages當前共享內存段的配置建議值:
    創建一個名爲的文本文件hugepages_settings.sh。
    在文件中添加以下內容:
#!/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.
# 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'}`
# Start from 1 pages to be on the safe side and guarantee 1 free HugePage
NUM_PG=1
# 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
# 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'|'3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    *) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End

運行以下命令來更改文件的權限:

$ chmod +x hugepages_settings.sh
  1. 運行hugepages_settings.sh腳本以計算hugepages配置值:
$ ./hugepages_settings.sh

注意:在運行此腳本之前,請確保所有使用的應用程序都在hugepages運行。

  1. 設置以下內核參數,其中value是您在步驟7中確定的HugePages值:
# sysctl -w vm.nr_hugepages=value
  1. 爲了確保在系統重啓後分配了HugePages,請將以下條目添加到/etc/sysctl.conf文件中,其中value是您在步驟7中確定的HugePages值:
vm.nr_hugepages=value
  1. 運行以下命令以檢查可用的hugepages:
$ grep Huge /proc/meminfo
  1. 重新啓動實例。
  2. 運行以下命令以檢查可用的hugepages頁面(可用1或2頁):
    以下是一個示例輸出,顯示由於[always]啓用了標記,正在使用Transparent HugePages 。
$ grep Huge /proc/meminfo

注意:如果您無法使用來設置HugePages分配nr_hugepages,那麼您的可用內存可能會碎片化。重新啓動服務器以使“HugePages”分配生效。

G.1.3 HugePages配置的限制

HugePages具有以下限制:

  • 您必須同時取消設置MEMORY_TARGET和MEMORY_MAX_TARGET初始化參數。例如,要取消設置數據庫實例的參數,請使用命令ALTER SYSTEM RESET。
  • 自動內存管理(AMM)和HugePages不兼容。使用AMM時,通過在下創建文件來分配整個SGA內存/dev/shm。當Oracle數據庫通過AMM分配SGA時,不會保留HugePages。要在Oracle數據庫12使用大頁面Ç,您必須禁用AMM。
  • 如果在32位環境中使用VLM,則不能將HugePages用於數據庫緩衝區高速緩存。您可以使用的SGA的其他部分,如大頁面shared_pool,large_pool等。VLM(緩衝區高速緩存)的內存分配是使用共享內存文件系統(ramfs/tmpfs/shmfs)完成的。內存文件系統不保留或使用HugePages。
  • 除非系統管理員通過修改可用頁面數或通過修改池大小來更改HugePages配置,否則HugePages不會在系統啓動後進行分配或釋放。如果在系統啓動期間未在內存中保留所需的空間,則HugePages分配將失敗。
  • 確保正確配置了HugePages,因爲如果應用程序未使用過多的HugePages,則系統可能會耗盡內存。
  • 如果在實例啓動且初始化參數use_large_pages設置only爲時沒有足夠的HugePages ,則數據庫將無法啓動,並且警報日誌消息會提供有關Hugepages的必要信息。

G.1.4禁用透明大頁面

缺省情況下,Red Hat Enterprise Linux 6,SUSE 11和Oracle Linux 6以及Oracle Linux Unbreakable Enterprise Kernel 2(UEK2)內核的較早版本默認啓用透明HugePages內存。在更高版本的UEK2內核中,默認情況下禁用透明HugePages內存。

透明的HugePages可能會在運行時導致內存分配延遲。爲避免性能問題,Oracle建議您在所有Oracle數據庫服務器上禁用“透明HugePages”。Oracle建議您改用標準HugePages來增強性能。

透明HugePages內存與標準HugePages內存不同,因爲內核khugepaged線程在運行時動態分配內存。標準HugePages內存在啓動時已預先分配,並且在運行時不會更改。

要檢查是否啓用了透明HugePages,請以root用戶身份運行以下命令之一:
紅帽企業Linux內核:

# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

其他內核:

# cat /sys/kernel/mm/transparent_hugepage/enabled

注意:
如果從內核中刪除了透明HugePages,則/sys/kernel/mm/transparent_hugepage或/sys/kernel/mm/redhat_transparent_hugepage文件不存在。

要禁用透明HugePage,請執行以下步驟:
將以下條目添加到/etc/grub.conf文件中的內核引導行中:

transparent_hugepage=never

例如:

title Oracle Linux Server (2.6.32-300.25.1.el6uek.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-300.25.1.el6uek.x86_64 ro root=LABEL=/ transparent_hugepage=never
        initrd /initramfs-2.6.32-300.25.1.el6uek.x86_64.img
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章