陈老师:1415968548 郑老师:2735197625 乐老师:354331153
客服热线:
19941464235/19906632509(微信同号)

客服微信

【Oracle OCP】Oracle 19C之大页配置

作者:炎燚小寶
发布时间:2023-12-19 09:23
浏览量:875

本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。


一、介绍

对于大的SGA大小,HugePages可以在虚拟内存管理方面提供实质性的好处。如果没有HugePages, SGA的内存将被划分为4K页面,这些页面必须由Linux内核管理。使用HugePages,页面大小增加到2MB(如果硬件支持,可以配置为1G),从而减少了内核要管理的页面总数,从而减少了在内存中保存页面表所需的内存量。除了这些更改之外,与HugePages关联的内存不能交换出去,这迫使SGA保持内存驻留。内存的节省和页面管理的工作量使得在x86-64架构上运行的Oracle 11g系统几乎必须使用HugePages。


仅仅因为您有一个大的SGA,并不意味着如果不使用HugePages就会出现问题。通常,大型SGA和大量数据库连接的组合会导致问题。要确定当前使用多少内存来支持页表,请在服务器处于正常/重载状态时运行以下命令。

# grep PageTables /proc/meminfo
PageTables:      1244880 kB


注意:自动内存管理(Automatic Memory Management, AMM)与Linux HugePages不兼容,所以除了ASM实例和小型不重要的数据库之外,在Linux上运行的真实数据库上可能不需要AMM。相反,应该使用自动共享内存管理和自动PGA管理,因为它们与HugePages兼容


二、配置大页

运行以下命令确定当前HugePage的使用情况。在Oracle Linux 5上,默认的HugePage大小是2MB。从下面的输出中可以看到,默认情况下没有定义HugePages。

$ grep Huge /proc/meminfo
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB


根据SGA的大小,您可能希望将Hugepagesize的值增加到1G。

用以下内容创建一个名为“hugepages_setting.sh”的文件。

#!/bin/bash
#
# hugepages_setting.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' | '3.10' | '4.1' | '4.14' ) echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    *) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End

使文件可执行。

$ chmod u+x hugepages_setting.sh
确保所有Oracle服务在服务器上正常运行,然后运行脚本并记录推荐的“vm.nr_hugepages”价值。
$ ./hugepages_setting.sh 
Recommended setting: vm.nr_hugepages = 305


以“root”用户身份编辑“/etc/sysctl.conf”文件,添加以下条目,并根据脚本的输出进行调整。您应该将值设置为大于或等于脚本显示的值。您只需要 1 或 2 个备用页。

vm.nr_hugepages=306


有人报告还需要 Oracle Linux 6.5 上的hugetlb_shm_group 设置。我没有,它仅被列为 SUSE 的要求。如果要设置的话,获取dba组的ID。

# fgrep dba /etc/group
dba:x:54322:oracle


在“/etc/sysctl.conf”文件中使用生成的组 ID。

vm.hugetlb_shm_group=54322
以“root”用户身份运行以下命令。
# sysctl -p
或者,编辑“/etc/grub.conf”文件,将“hugepages=306”添加到默认内核的内核行末尾,然后重新启动。


您现在可以看到 HugePages 已创建,但当前尚未使用。

$ grep Huge /proc/meminfo
AnonHugePages:         0 kB
HugePages_Total:     306
HugePages_Free:      306
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
将以下条目添加到“/etc/security/limits.conf”脚本或“/etc/security/limits.d/99-grid-oracle-limits.conf”脚本中,其中设置至少为HugePages 分配(以 KB 为单位)(HugePages * Hugepagesize)。在这种情况下,该值为 306*2048=626688。
* soft memlock 626688
* hard memlock 626688
检查是否未为数据库设置 MEMORY_TARGET 参数,而是使用 SGA_TARGET 和 PGA_AGGREGATE_TARGET 参数。
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 200M
sga_target                           big integer 600M

根据需要重启服务器并重启数据库服务。


再次检查HugePages信息。

$ grep Huge /proc/meminfo
AnonHugePages:         0 kB
HugePages_Total:     306
HugePages_Free:       98
HugePages_Rsvd:       93
HugePages_Surp:        0
Hugepagesize:       2048 kB
您可以看到 HugePages 现在正在被使用。


三、强制ORACLE使用大页 (USE_LARGE_PAGES)

正确调整 HugePages 的数量非常重要,因为在 11.2.0.3 之前,如果整个 SGA 不适合可用的 HugePages,实例将在不使用任何 HugePages 的情况下启动。从11.2.0.3开始,SGA部分可以运行在HugePages中,部分不能运行,所以这个问题的影响不是很大。不正确的尺寸可能不易被发现。数据库的更高版本在启动期间在警报日志中显示“大页信息”部分。

****************** Large Pages Information *****************
Total Shared Global Region in Large Pages = 602 MB (100%)
Large Pages used by this instance: 301 (602 MB)
Large Pages unused system wide = 5 (10 MB) (alloc incr 4096 KB)
Large Pages configured system wide = 306 (612 MB)
Large Page size = 2048 KB
***********************************************************


如果您运行的是 Oracle 11.2.0.2 或更高版本,则可以将 USE_LARGE_PAGES 初始化参数设置为“only”,这样数据库在没有大页支持的情况下将无法启动。

ALTER SYSTEM SET use_large_pages=only SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;


启动时,警报日志中的“大页面信息”反映了此参数的使用。

****************** Large Pages Information *****************
Parameter use_large_pages = ONLY
Total Shared Global Region in Large Pages = 602 MB (100%)
Large Pages used by this instance: 301 (602 MB)
Large Pages unused system wide = 5 (10 MB) (alloc incr 4096 KB)
Large Pages configured system wide = 306 (612 MB)
Large Page size = 2048 KB
***********************************************************


当没有足够的 HugePages 来容纳 SGA 时尝试启动数据库现在将返回以下错误。

SQL> STARTUP
ORA-27137: unable to allocate large pages to create a shared memory segment
Linux-x86_64 Error: 12: Cannot allocate memory
SQL>


警报日志输出的“大页信息”部分描述了启动失败以及要采取的适当操作。

****************** Large Pages Information *****************
Parameter use_large_pages = ONLY
Large Pages unused system wide = 0 (0 KB) (alloc incr 4096 KB)
Large Pages configured system wide = 0 (0 KB)
Large Page size = 2048 KB
ERROR:
  Failed to allocate shared global region with large pages, unix errno = 12.
  Aborting Instance startup.
  ORA-27137: unable to allocate Large Pages to create a shared memory segment
ACTION:
  Total Shared Global Region size is 608 MB. Increase the number of
  unused large pages to atleast 304 (608 MB) to allocate 100% Shared Global
  Region with Large Pages.
***********************************************************



四、禁止透明大页 (RHEL6/OL6 and RHEL7/OL7)

从 RHEL6/OL6 开始,默认实现并启用透明大页。它们旨在通过允许“khugpaged”内核线程动态分配 HugePages 来改进内存管理,而不是像传统的 HugePages 那样在启动时分配。这听起来是个好主意,但不幸的是,透明大页不能很好地与 Oracle 数据库配合使用,并且与 RAC 安装中的节点重新启动以及单实例和 RAC 安装中的性能问题相关。因此,Oracle 建议在运行 Oracle 数据库的所有服务器上禁用透明大页。



五、配置1G大页

正如 Eugene 在评论中提到的,Oracle 目前不建议使用 1G Hugepagesize。您可以在 MOS 文档 ID 1607545.1 中阅读有关此内容的更多信息。考虑到这一点,本节的其余部分可能应该被视为更多的学术练习。


检查您当前的硬件是否可以支持 1G 的 Hugepagesize。如果以下命令产生任何输出,则可以。

# cat /proc/cpuinfo | grep pdpe1gb
编辑“/etc/grub.conf”文件,将以下条目添加到默认 grub 条目的内核行。将“hugepages”条目调整为所需的 1G 页数。请注意,这包括禁用透明大页,这不是强制性的,但却是一个好主意
transparent_hugepage=never hugepagesz=1G hugepages=1 default_hugepagesz=1G


检查当前的 HugePages 设置。

# grep Huge /proc/meminfo
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB


重新启动并再次检查 HugePages 设置。

#  grep Huge /proc/meminfo
HugePages_Total:       1
HugePages_Free:        1
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:    1048576 kB