当前位置: 首页 > news >正文

个人笔记:ORACLE大页内存hugepage和SGA、PGA的经验,SGA并不是越大越好

背景:ORACLE 11.2,SGA 64G,PGA 8G,压测出现操作系统内存耗尽
WARNING: Heavy swapping observed on system in last 5 mins.
pct of memory swapped in [1.94%] pct of memory swapped out [1.32%].

分析:
1、连接到数据库的每个系统连接进程大概会占用10M左右,1000个连接那么也就接近10G了;
2、在32位系统下,一个进程访问1GB的内存,会产生1M(110241024/44/1024/1024)的页表,如果是在64位系统,将会增大到2M。
SGA设置为64G,有1000个ORACLE用户进程(在linux中每个进程页表独立,都有自己的页表),64位LINUX的系统上,最大的页表占用内存为:64
2*1000/1024=125G;

解决方法:
1、控制SGA大小, sga+pga最好控制在50%物理内存以内,pga内存不要操作sga内存的20%;
2、当主机的物理内存为64G,设SGA>=32G时,建议开启大页;
内存都是以页的形式划分的,默认情况下每页是4K,这就意味着如果物理内存很大,则映射表的条目将会非常多,会影响CPU的检索效率。因为内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。
在Linux中配置hugepage可以提高oracle的性能,减少oracle sga的页交换,类似于aix中的lagepage。

设置方法(参考第三方材料):
1、关闭Oracle Database 11g中的AMM(Automatic Memory Management),即把两个参数MEMORY_TARGET / MEMORY_MAX_TARGET设为0
如果alter system set MEMORY_MAX_TARGET=0 scope=spfile;重启后发现没有改为0,可以alter system reset memory_max_target; 来设置

2、参考metalink(文档 ID 401749.1)提供的脚本,计算hugepages的大小

3、对hugepages_settings.sh这个脚本授可执行的权限
chmod +x hugepages_settings.sh

4、执行执行hugepages_settings.sh得到建议值
得出大页的大小为1028页(注:一页为2M,这个值不可改,1028*2M=2056M),实际上hugepages与参数sga_max_size有关,比sga_max_size的值稍微大一点点(比SGA_MAX_SIZE最少要多加一页,2M的页不要分配超过sga_max_size太多,会造成内存的浪费)
注意:使用Hugepage内存是共享内存,它会一直keep在内存中的,不会被交换出去,也就是说使用hurgepage的内存不能被其他的进程使用,所以,一定要合理设置这个值,避免造成浪费。对于只使用Oracle的服务器来说,把Hugepage_pool设置成大于SGA大小才能被Oracle使用。
SQL>show parameter sga_max_size
NAME TYPE VALUE


sga_max_size big integer 2G

5、设置hugepages,在内核参数中添加一行,vi /etc/sysctl.conf
vm.nr_hugepages = 1028

6、修改内核参数立即生效
[root@el5 ~]# sysctl -p

7、别忘记设定内存锁memlock,以K为单位,memlock数量要大于大页的数量,当然也要大于sga_max_size,这里设定为2056000,设置为-1,表示不限制。
[root@el5 ~]# vi /etc/security/limits.conf
oracle soft memlock 2056000
oracle hard memlock 2056000

8、检查limits是否正确
[root@el5 ~]# su - oracle
[oracle@el5 ~] ulimit -l
2056000

9、重启数据库

10、查看大页,已被使用
[oracle@el5 ~]$ watch -n1 'cat /proc/meminfo |grep -i HugePage'
HugePages_Total: 总共页
HugePages_Free: 空闲页
HugePages_Rsvd: 操作系统承诺给Oracle预留页
Hugepagesize: 2048 kB 每页是2M,不可修改

如:
HugePages_Total: 1028 ---总共1028页
HugePages_Free: 869 ---空闲869 页,即当前大页被使用了1028-869=159页,即被用了1592M=118M,小于sga_target。
HugePages_Rsvd: 842 ---操作系统承诺给Oracle预留842页,即842
2M=1684M(1684+118==SGA_MAX_SIZE)

使用了hugepage之后,SGA就默认pin在内存里了,那么就不用lock sga了。接下来我们研究一下参数:pre_page_sga,这个参数默认是false,我把它打开。
sys@OCM> alter system set pre_page_sga=true scope=spfile;
sys@OCM> show parameter sga
NAME TYPE VALUE


lock_sga boolean FALSE
pre_page_sga boolean TRUE
sga_max_size big integer 2G
sga_target big integer 1G
HugePages_Total: 1028 ---总共1028页
HugePages_Free: 548 ---空闲548页,即当前大页被使用了1028-548=480页,即被用了4802M=960M,约等于sga_target,参数pre_page_sga起作用了。
HugePages_Rsvd: 521 ---操作系统承诺给Oracle预留521页,即521
2M=1042M(理解为sga_max_size-sga_target)
Hugepagesize: 2048 kB --每页是2M,不可修改

参考metalink:USE_LARGE_PAGES To Enable HugePages (文档 ID 1392497.1)

补充关于内存申请的OverCommit
Linux下的OverCommit机制,主要是为了应对可能的异常的大量内存申请对OS本身造成冲击。
Linux有三种OverCommit机制,可以通过:/proc/sys/vm/overcommit_memory来配置,三种配置的具体含义:
0:启发式策略,后果比较严重的Overcommit将不能成功,而轻微的Overcommit将被允许。
1:永远允许Overcommit,这种策略适合那些不能承受内存分配失败的应用,比如某些科学计算应用。
2:永远禁止Overcommit,在这个情况下,系统所能分配的内存不会超过swap+RAM*系数(/proc/sys/vm /overcmmit_ratio,默认50%,你可以调整),如果这么多资源已经用光,那么后面任何尝试申请内存的行为都会返回错误,这通常意味着此时 没法运行任何新程序。

相关文章:

  • JavaScript 类数组对象与 arguments
  • 点击按钮,找不到url
  • WPF模板(一)详细介绍
  • 猿课python第二天
  • 再见了Server对象,拥抱IHostingEnvironment服务对象(.net core)
  • Sublime Text在Ubuntu下无法输入中文的解决方案
  • Oracle11g RAC下ASM 的管理与维护
  • 零基础入门微信小程序开发
  • oracle--数据筛选
  • Flutter widgets——Text/Icon/Button
  • window 环境 spring boot 发布脚本整理
  • The POM for XXX is invalid, transitive dependencies (if any) will not be available解决方案
  • spring第一冲刺阶段第四天
  • 福大软工1816 · 团队现场编程实战(抽奖系统)
  • Servlet重写init(ServletConfig config)还是init()
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Javascript 原型链
  • JS变量作用域
  • js面向对象
  • js如何打印object对象
  • Next.js之基础概念(二)
  • React Transition Group -- Transition 组件
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 关于Flux,Vuex,Redux的思考
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 简析gRPC client 连接管理
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 在Unity中实现一个简单的消息管理器
  • NLPIR智能语义技术让大数据挖掘更简单
  • 带你开发类似Pokemon Go的AR游戏
  • 国内开源镜像站点
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​io --- 处理流的核心工具​
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (9)STL算法之逆转旋转
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (七)c52学习之旅-中断
  • (十)c52学习之旅-定时器实验
  • .“空心村”成因分析及解决对策122344
  • .bat批处理(一):@echo off
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • 。Net下Windows服务程序开发疑惑
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [C++]拼图游戏