oracle 中的大页无法使用问题

oracle 中的大页问题

今天巡检数据库的时候,发现有一个备库节点上的负载很大。这个备库基本无人使用。仅做延时查询使用,按理来说不应该有这么大负载,

环境说明  11.2.0.4 单节点dg库。

问题 大页不生效。且数据库所在服务器负载极大

top - 09:33:00 up 326 days, 19 min,  3 users,  load average: 17.69, 11.65, 5.83   --负载说明

Tasks: 357 total,   1 running, 356 sleeping,   0 stopped,   0 zombie

Cpu(s):  0.2%us,  0.3%sy,  0.0%ni, 68.4%id, 31.1%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:  65970692k total, 64774768k used,  1195924k free,     6992k buffers

Swap: 33054712k total,  5563048k used, 27491664k free,   399336k cached

  179 root      20   0     0    0    0 D  0.3  0.0 517:34.66 kswapd0 

查询当前大页大小:

grep HugePages /proc/meminfo

AnonHugePages:         0 kB

HugePages_Total:    9960

HugePages_Free:     9960

HugePages_Rsvd:        0

HugePages_Surp:        0

数据库中sga大小

SQL> show parameter sga

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

lock_sga                             boolean     FALSE

pre_page_sga                         boolean     FALSE

sga_max_size                         big integer 31G

sga_target                           big integer 31G

看到这里问题有点明朗了,好像是数据库没有使用大页导致的。满心欢喜的去查询了一下大页修改的方法。

根据如下 shell脚本跑出了一个修改值。

#!/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  

# 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. 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" ;; 

esac 

   

End 

然后修改 /etc/sysctl.conf  

vm.nr_hugepages = 20000

sysctl -p    --应用参数  到这里也没有任何问题。

修改完成之后重启数据库 

recover managed standby database cancel;

shutdown immediate;

startup

启动之后继续查询大页的参数

[oracle@itunesdg4 ~]$ grep HugePages /proc/meminfo

AnonHugePages:         0 kB

HugePages_Total:    9960

HugePages_Free:     9960

HugePages_Rsvd:        0

HugePages_Surp:        0

发现居然没有改变。。。

因为这个是一个测试库,于是重启了一下 再次查询

[oracle@itunesdg4 ~]$  grep HugePages /proc/meminfo

AnonHugePages:    176128 kB

HugePages_Total:   20000

HugePages_Free:    20000

HugePages_Rsvd:        0

HugePages_Surp:        0

发现变HugePages_Total是变过来了。但是大页依旧没有使用上。

再次查询数据库相关的参数

alter system reset memory_target scope=spfile;                             

alter system reset memory_max_target scope=spfile;

SQL> show parameter memory_target

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

memory_target                        big integer 0

SQL> show parameter memory_max_target

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

memory_max_target                    big integer 0

值也都是正常的,最后使出大招修改这个参数

alter system set use_large_pages=only scope=spfile; 让数据库强制使用 大页。重启数据库。

重启时报错了:

[oracle@itunesdg4 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Sat Feb 24 14:19:35 2018

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup

ORA-27137: unable to allocate large pages to create a shared memory segment

Linux-x86_64 Error: 1: Operation not permitted

Additional information: 201326592

Additional information: 1

上网查询了一下解决方法。

When a process uses some memory, the CPU is marking the RAM as used by that process. For efficiency, the CPU allocate RAM by chunks of 4K bytes (it's the default value on many platforms). Those chunks are named pages. Those pages can be swapped to disk, etc.

Since the process address space are virtual, the CPU and the operating system have to remember which page belong to which process, and where it is stored. Obviously, the more pages you have, the more time it takes to find where the memory is mapped. When a process uses 1GB of memory, that's 262144 entries to look up (1GB / 4K). If one Page Table Entry consume 8bytes, that's 2MB (262144 * 8) to look-up.

Most current CPU architectures support bigger pages (so the CPU/OS have less entries to look-up), those are named Huge pages (on Linux), Super Pages (on BSD) or Large Pages (on Windows), but it all the same thing.

1: [root@gsp cdrom]# id oracle

2: uid=501(oracle) gid=501(oinstall) groups=501(oinstall),502(dba)

3: [root@gsp cdrom]# more /proc/sys/vm/hugetlb_shm_group

4: 0

5: [root@gsp cdrom]#  echo 502 >/proc/sys/vm/hugetlb_shm_group

按照网上给出的解决方法去设置了一下这个文件的值。

[oracle@itunesdg4 ~]$ id

uid=502(oracle) gid=501(oinstall) groups=501(oinstall),502(dba)

[oracle@itunesdg4 ~]$ echo 502 >/proc/sys/vm/hugetlb_shm_group

-bash: /proc/sys/vm/hugetlb_shm_group: Permission denied

[oracle@itunesdg4 ~]$ su -

Password:

[root@itunesdg4 ~]# echo 502 >/proc/sys/vm/hugetlb_shm_group

[root@itunesdg4 ~]# exit

logout

[oracle@itunesdg4 ~]$ more /proc/sys/vm/hugetlb_shm_group

502

重启数据库 查询大页使用情况

[oracle@itunesdg4 ~]$  grep HugePages /proc/meminfo

AnonHugePages:    188416 kB

HugePages_Total:   20000

HugePages_Free:    17965

HugePages_Rsvd:    13838

HugePages_Surp:        0

发现能使用了。

那么究竟是 alter system set use_large_pages=only scope=spfile;  这个参数导致了大页生效还是, hugetlb_shm_group 这个文件导致了大页生效呢。做如下测试;

SQL> alter system set use_large_pages=true scope=spfile;

SQL> shutdown abort;               --我这里是测试库 而且是dg库所以直接abort 快速关闭。各位请勿模仿

[oracle@itunesdg4 ~]$  grep HugePages /proc/meminfo   --这里数据关闭所以释放了大页

AnonHugePages:    174080 kB

HugePages_Total:   20000

HugePages_Free:    20000

HugePages_Rsvd:        0

HugePages_Surp:        0

SQL> startup                       --重新启动

[oracle@itunesdg4 ~]$  grep HugePages /proc/meminfo    --大页还是能正常使用

AnonHugePages:    182272 kB

HugePages_Total:   20000

HugePages_Free:    18566

HugePages_Rsvd:    14439

HugePages_Surp:        0

第一个实验做完了,发现并不是 use_large_pages这个参数导致的大页能够使用。那么尝试修改 hugetlb_shm_group 这个文件 重启数据库

[root@itunesdg4 ~]# echo 0 >/proc/sys/vm/hugetlb_shm_group    --修改文件的值

[oracle@itunesdg4 ~]$ grep HugePages /proc/meminfo  --修改之后查询正常使用大页

AnonHugePages:    186368 kB

HugePages_Total:   20000

HugePages_Free:    17977

HugePages_Rsvd:    13850

HugePages_Surp:        0

SQL> shutdown abort;         --重启

SQL> startup

[oracle@itunesdg4 ~]$ grep HugePages /proc/meminfo   --这里并没有使用大页了。

AnonHugePages:    182272 kB

HugePages_Total:   20000

HugePages_Free:    20000

HugePages_Rsvd:        0

HugePages_Surp:        0

果然是因为这个文件的缘故,那么这个文件究竟是干什么用的呢

网上查询可知:

hugetlb_shm_group

hugetlb_shm_group contains group id that is allowed to create SysV shared memory segment using hugetlb page

该文件表示允许使用hugetlb页创建System VIPC共享内存段的系统组ID。

且这个文件在重启之后会重置成0,所以需要在 /etc/sysctl.conf 中 添加一行 vm.hugetlb_shm_group = 502

最后总结一下大页的配置步骤。

1.查询是否开启了大页

[oracle@itunesdg4 ~]$ cat /proc/meminfo |grep Huge    --如果total 为0则未开启大页。

AnonHugePages:    196608 kB

HugePages_Total:   20000

HugePages_Free:    17965

HugePages_Rsvd:    13838

HugePages_Surp:        0

2.如果未开启,可以用上面的计算脚本算出一个系统给出的大页值。

3.在/etc/sysctl.conf 中添加一行 vm.nr_hugepages= 计算出的值 

4.刷新sysctl.conf 这个文件 sysctl -p 并查询 大页的total是否为你设置的值,如果还是0多刷新几次。

5.设置内存锁:内存锁的数量要大于所设置的大页数量。可以设置为 -1 ,不限制。

vi /etc/security/limits.conf

oracle soft memlock -1

oracle hard memlock -1

6.重启数据库 查询 cat /proc/meminfo |grep Huge 如果 free的值再减少则说明大页正在被使用。如果没使用,或许按照我的方法能给你们提供帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发环境下的实现与优化策略

在现代互联网应用中,高并发处理能力是衡量系统性能和稳定性的关键指标之一。尤其对于电商、社交、在线支付等业务场景,面对瞬间涌入的大规模用户请求,如何保证系统的稳定性和响应速度,对技术架构设计与优化提出了极高要求。本文将…

【Linux】Supervisor 基础

要在Linux上启动Supervisor,你可以按照以下步骤进行操作: 确保你已经安装了Supervisor。使用适合你的Linux发行版的包管理器进行安装。例如,对于Ubuntu,可以运行以下命令安装Supervisor: sudo apt-get update sudo apt…

在Java应用程序中嵌入百度地图的实现方法

在许多应用程序中,展示地图是一个常见的需求,特别是对于需要展示位置信息或者导航功能的应用。百度地图是一种常用的地图服务,本文将介绍如何在Java应用程序中嵌入百度地图,并提供一个简单易懂的示例代码。 1. 准备工作 在开始之…

Leetcode:283.移动零

题目要求 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0…

OAuth2.0客户端和服务端Java实现

oauth2 引言 读了《设计模式之美》和《凤凰架构》架构安全篇之后,决定写一个OAuth2.0的认证流程的Demo,也算是一个阶段性的总结,具体原理实现见《凤凰架构》(架构安全设计篇)。 涉及到的源码可以从https://github.com/WeiXiao-Hyy/oauth2获…

Digicert 证书

一、简介 在当今数字化时代,网络安全已成为全球关注的焦点。随着网络攻击和数据泄露事件的频发,企业和组织越来越重视保护自己的网络环境。在这种背景下,数字证书成为了确保网络通信安全的关键工具。作为数字证书行业的领导者,Di…

2024.4.9记——C++多线程系列文章(五)之死锁

引言 如果用单一的全局互斥保护所有共享数据,也即锁的粒度过大,例如在共享大量数据的系统中,这么做会消除并发带来的任何性能优势,原因是多线程系统由此受到强制限定,任意时刻都只准许运行其中一个线程,即…

python应援灯牌代码

代码如下 import pygame import sys import random# 初始化Pygame pygame.init()# 设置窗口尺寸 WINDOW_WIDTH 800 WINDOW_HEIGHT 600 window_surface pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption(应援语跑马灯模拟)# 定义颜色 WH…

Web API(六)之正则表达式

Web API(六)之正则表达式 正则表达式正则基本使用元字符边界符量词范围字符类替换和修饰符change 事件判断是否有类正则表达式 正则表达式(Regular Expression)是一种字符串匹配的模式(规则) 使用场景: 例如验证表单:手机号表单要求用户只能输入11位的数字 (匹配)过滤…

利用AI开源引擎:文本自动摘要提取API (可本地化部署)

新闻摘要提取技术是一种高效的自然语言处理技术,它通过算法对新闻文章进行全面的语义理解和分析,自动抽取文章中的关键信息,生成简洁、连贯的摘要文本。该技术在多个领域都有着广泛的应用,下面将深入探讨其主要的应用场景。 开源项…

【接口】HTTP(4)|Session、Cookie、token有什么区别?

HTTP是一种无状态的协议,服务器本身没有记忆功能,无法记住客户端之前是否有发送过请求,因此客户端每次发送的请求都是独立的 无状态:HTTP是一个无状态的协议。这句话里的无状态是什么意思? - 知乎 1、为什么需要cookie…

Rust通用代码生成器莲花,红莲尝鲜版二十二,发布数据库自动反射新功能及其视频

Rust通用代码生成器莲花,红莲尝鲜版二十二,发布数据库自动反射新功能及其视频 Rust 通用代码生成器莲花,红莲尝鲜版二十二,此版本新增了数据库自动反射功能,可以为遗留数据库配上操作软件。此版本增强了模板向导界面的…

LINUX 下IPTABLES配置详解

-t<表>&#xff1a;指定要操纵的表&#xff1b; -A&#xff1a;向规则链中添加条目&#xff1b; -D&#xff1a;从规则链中删除条目&#xff1b; -i&#xff1a;向规则链中插入条目&#xff1b; -R&#xff1a;替换规则链中的条目&#xff1b; -L&#xff1a;显示规则链中…

MQ中的交换机与队列

交换机与队列的介绍 1.流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff…

最简单知识点PyTorch中的nn.Linear(1, 1)

一、nn.Linear(1, 1) nn.Linear(1, 1) 是 PyTorch 中的一个线性层&#xff08;全连接层&#xff09;的定义。 nn 是 PyTorch 的神经网络模块&#xff08;torch.nn&#xff09;的常用缩写。 nn.Linear(1, 1) 的含义如下&#xff1a; 第一个参数 1&#xff1a;输入特征的数量…

【人工智能】AI赋能城市交通 未来城市的驱动力

前言 随着城市化进程的不断加速&#xff0c;交通拥堵、环境污染等问题日益凸显&#xff0c;人们对交通系统的效率和可持续性提出了更高的要求。在这样的背景下&#xff0c;智能交通技术正成为改善城市交通的重要驱动力。本文将探讨智能交通技术在解决城市交通挑战方面的应用和未…

为什么要在 Golang 中使用指针

1、性能优化&#xff1a;指针允许你在不复制数据的情况下访问和修改变量。当你有一个大型的数据结构时&#xff0c;如果直接传递这个数据结构&#xff0c;会产生一个完整的副本&#xff0c;这会增加内存的使用和CPU的计算时间。使用指针&#xff0c;你可以只传递数据的地址&…

谷歌留痕霸屏要怎么做?

谷歌留痕霸屏&#xff0c;就是让你的网站或者页面在谷歌搜索结果里尽可能多地出现&#xff0c;就像是在你的潜在客户眼前留下深刻印象一样&#xff0c;你要做的就是在一些高权重平台发布有价值的信息&#xff0c;同时巧妙地留下你的品牌名、产品名或者任何你想要推广的关键词&a…

css实现各级标题自动编号

本文在博客同步发布&#xff0c;您也可以在这里看到最新的文章 Markdown编辑器大多不会提供分级标题的自动编号功能&#xff0c;但我们可以通过简单的css样式设置实现。 本文介绍了使用css实现各级标题自动编号的方法&#xff0c;本方法同样适用于typora编辑器和wordpress主题…

六角螺母缺陷分类数据集:3440张图像

六角螺母缺陷数据集&#xff1a;包含变形&#xff0c;划痕&#xff0c;断裂&#xff0c;生锈&#xff0c;以及优质螺母图片数据&#xff0c;共计3440张&#xff0c;无标注 一.变形螺母-1839 二.断裂螺母-287 三.划痕螺母-473 四.生锈螺母-529 五.优良螺母-312 适用于CV项目&am…