百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Oracle 之Hugepage(www.oraclel.com官网)

mhr18 2024-10-13 03:23 23 浏览 0 评论


1. Hugepage基本概念

系统进程是通过虚拟地址访问内存,但是CPU必须把它转换成物理内存地址才能真正访问内存。

为了提高这个转换效率,CPU会缓存最近的"虚拟内存地址和物理内存地址"的映射关系,并保存在一个由CPU维护的映射表(page table)中。


page table(页表)是操作系统上的虚拟内存系统的数据结构模型,用于存储虚拟地址与物理地址的对应关系。当我们访问内存时,首先访问"page table",然后Linux再通过"page table"的mapping来访问真实物理内存(RAM或SWAP).


在32位系统下,一个进程访问1GB的内存,会产生1M的页表,如果是在64位系统,将会增大到2M。

很容易推算,如果一个SGA设置为60G,有1500个ORACLE用户进程,64位LINUX的系统上,最大的页表占用内存为:60*2*1500/1024=175G 。


为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。而在Redhat Linux中,内存都是以页(Page)的形式划分的,默认情况下每页是4K Bytes,这就意味着如果物理内存很大,比如64G ,则映射表的条目将会非常多,这将会影响CPU的检索效率(CPU需要转化虚拟地址为物理地址)。而且根据上面的推算,页表会占用比物理内存还多的内存大小。


因内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。这种增大的内存页尺寸在Linux 2.1中,称为Big page;在AS 3/4或后续版本中,称为Hugepage。如果系统有大量的物理内存(大于8G),则无论32位的操作系统还是64位的,都应该使用Hugepage。


2. Hugepage基本信息查看

Linux中,可以通过如下命令来查看HugePage相关的值:

$ cat /proc/meminfo | grep Huge

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

Hugepagesize: 2048 KB


通常情况下,Linux hugepage大小为2MB (不同的处理器架构,可能不一样)

HugePages_Total: Hugepage的页面数量

HugePages_Free: 剩余的页面数量

HugePages_Rsvd: 被分配预留但是还没有使用的page数目

Hugepagesize: 每单位数量大小


注意: 使用Hugepage内存是共享内存,它会一直pin在内存中,不会被交换出去,也就是说使用hugepage的内存不能被其他的进程使用,所以一定要合理设置这个值,避免造成浪费。对于只使用Oracle的服务器来说,把Hugepage_pool设置成稍大于SGA大小即可。PGA因不是共享内存,是使用不到Hugepage的。


HugePages_Free - HugePages_Rsvd部分的内存是浪费的,且不能被其他程序使用。在实际应用中,

尽可能让HugePages_Free - HugePages_Rsvd=0

设置了多少的huge page,free内存就会被使用多少。比如:设置sysctl vm.nr_hugepages=1024

之后, free命令可以看到free的内存会减少2048MB (1024*2M)。(这也和Hugepagesize的大小有关)


3. Hugepage的好处:

a. 大大提高了CPU cache中存放的page table所覆盖的内存大小,从而提高了TLB命中率。

b. CPU cache中有一部分TLB(Translation Lookaside Buffer)用来存放部分page table以提高虚拟内存地址到物理内存地址转换的速度。因为page size变大了,所以同样大小的TLB,所覆盖的内存大小也变大了。

提高了TBL命中率,也就是提高了地址转换的速度。

c. 减少CPU的sys的使用。由于提高了CPU的TLB的命中率,也就降低了CPU的sys部分的使用。

d. 大页会将SGA LOCK在RAM里, 当内存短缺的时候也不会被page out


4. 如何配置Hugepages

根据下面的步骤来配置Hugepages,修改Hugepages需要重启机器。

1). 需要在/etc/security/limits.conf 中设置memlock值(单位KB),该值小于内存大小,

例如你的内存大小是64G,有可以设置以下的值:

* soft memlock 60397977

* hard memlock 60397977

这个值大于SGA需求并没有什么害处。


2). 重新登录root和oracle用户,检查memlock limit

$ ulimit -l

60397977


3). 如果你使用11G及以后的版本,AMM(自动内存管理)已经默认开启,但是AMM与Hugepages

是不兼容的(因为hugepage是共享内存,不适合PGA),必须先关闭AMM。


4). 确保你的全部实例都已经启动(包括ASM) ,然后根据Document 401749.1 的hugepages_settings.sh

去评估需要设置的Hugepages的大小。

$ ./hugepages_settings.sh

...

Recommended setting: vm.nr_hugepages = 1496

注:也可以自己计算需要的Hugepages大小,其实就是Hugepages size> all of the SGA size


5). 编辑/etc/sysctl.conf 设置 vm.nr_hugepages参数:

vm.nr_hugepages = 1496

6). 停止实例并重启OS系统

7). 检查设置是否生效

系统重启后,启动全部的数据库,通过以下命令检查

# grep HugePages /proc/meminfo

HugePages_Total: 1496

HugePages_Free: 485

HugePages_Rsvd: 446

HugePages_Surp: 0

HugePages_Free< HugePages_Total 既说明Hugepages已经生效,同时HugePages_Rsvd不为"0".


5. 如何控制数据库SGA是否使用Hugepages?

11.2.0.2之前的版本,DB的SGA只能选择全部使用hugepages或者完全不使用hugepages。

11.2.0.2 及以后的版本, oracle增加了一个新的参数"USE_LARGE_PAGES"来管理数据库如何使用 hugepages.

在11.2.0.3的时候,USE_LARGE_PAGES这个参数让Oracle的行为更加灵活。如果出现HugePage分配不足的情况,

SGA是可以使用那些small pages的。这就保证了极端情况下数据库是可以正常运行的。

USE_LARGE_PAGES参数有三个值: "true" (default), "only", "false" and "auto"(since 11.2.0.3 patchset).


a). 现在默认值是"true",如果系统设置Hugepages的话,SGA会优先使用hugepages,有多少用多少。

11.2.0.2 如果没有足够的 hugepages, SGA是不会使用hugepages的. 这会导致ORA-4030错误,因为hugepages已经从物理内存分配,但是SGA没有使用它,却使用其他部分内存,导致内存资源不足。 但是在11.2.0.3版本,这个使用策略被改变了,SGA可以一部分使用hugepages,剩余部分使用small pages。这样,SGA会有限使用hugepages,在hugepages用完之后,再使用regular sized pages。


b). 如果设置为"false" , SGA就不会使用hugepages

c). 如果设置为 "only" 如果hugepages大小不够的话,数据库实例是无法启动的 (防止内存溢出的情况发生).

d). 11.2.0.3版本之后,可以设置为 "auto".这个选项会触发oradism进程重新配置linux内核,以增加hugepages的数量。

相关推荐

软考架构师-案例分析之Redis(软考架构师真题)

软考架构师考试中,Redis的知识考了很多回,从最近几年来看,案例分析经常考,有的时候单独考,有的时候和其他知识点一起考。Redis过往的考试中,考过的知识如下:1、Redis特点,涉及数据类型、持久...

揭秘:视频播放网站如何精准记录用户观看进度

在互联网蓬勃发展的当下,视频内容已毫无争议地成为人们获取信息、享受娱乐休闲时光的核心方式。据权威数据统计,全球每天有数十亿小时的视频被观看,视频流量在网络总流量中的占比逐年攀升,预计在未来几年内将超过...

量子级一致性!Flink+Redis全局状态管理

百万级实时计算任务如何实现亚毫秒级状态访问?本文揭秘Flink+Redis的量子纠缠态状态管理方案,将状态延迟降至0.3ms。引子:实时风控系统的量子跃迁//传统Flink状态管理(基于RocksD...

在 Mac 上运行 Redis 的 Docker 容器

在Mac上运行Redis的Docker容器,你可以按以下步骤操作,非常简单高效:一、前提要求已安装DockerDesktopforMac可通过终端验证Docker是否可用:d...

从 0 到 1:使用 Nginx + Lua 打造高性能 Web 网关

在大规模分布式架构中,Web网关扮演着重要角色,负责请求转发、负载均衡、限流、认证等功能。而Nginx+Lua结合可以提供:o高性能:Nginx是目前最流行的高性能Web服务器o动...

外贸独立站缓存设置黑科技:用错Redis比没缓存更致命

上周帮一个杭州卖家排查网站崩溃问题,发现这老铁把Redis缓存设置成128MB还开着持久化,服务器内存直接炸得比春节红包还彻底——"你这哪是缓存啊,根本是DDoS攻击自己!"最近Clo...

Spring Boot3 整合 Redis,这些缓存注解你真的会用吗?

你在开发SpringBoot3项目时,有没有遇到过这样的困扰?随着项目功能不断增加,数据量逐渐庞大,接口响应速度变得越来越慢,用户体验直线下降。好不容易找到优化方向——引入Redis缓存...

MySQL处理并发访问和高负载的关键技术和策略

MySQL处理并发访问和高负载的关键技术和策略主要包括以下几个方面:一、硬件优化1.CPU:提升CPU处理能力可以明显改善并发处理性能。根据数据库负载,考虑使用更多的CPU核心。2.内存:增加内存可以...

druid解决高并发的数据库(druid多数据源配置 spring boot)

处理高并发的时候可以解决我们java一个核心问题java核心问题就是并发问题解决并发一个是redis一个是线程池的方式现在出来是个druid好像现在解决高并发的方式进行更换数据库的方式操作场景插入频繁...

高并发方案最全详解(8大常见方案)

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen睿哥。高并发是大型架构的核心,下面我重点来详解常见8大高并发方案@mikechen文章来源:mikechen.cc分...

MySQL如何处理并发访问和高负载?(mysql如何处理并发访问和高负载访问)

MySQL在处理并发访问和高负载方面,采取了一系列关键技术和策略,以确保数据库系统在面对不断增长的并发需求时维持高效和稳定的性能。以下是对这些技术和策略的详细阐述,旨在全面解析MySQL如何处理并发访...

Redis高可用集群详解(redis高可用方案以及优缺点)

Redis集群与哨兵架构对比Redis哨兵架构在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具监控master节点状态,如果master节点异常,则会做主从切换,将某一台sla...

MCP协议重大升级!Spring AI联合阿里Higress,性能提升300%

引言:一场颠覆AI通信的技术革命2025年3月,MCP(ModelContextProtocol)协议迎来里程碑式升级——StreamableHTTP正式取代HTTP+SSE成为默认传输层。这一...

阿里三面被挂,幸获内推,历经5轮终于拿到口碑offer

作者:Java程序猿阿谷来源:https://www.jianshu.com/p/1c8271f03aa5每一个互联网人心中都有一个大厂梦,百度、阿里巴巴、腾讯是很多互联网人梦寐以求的地方,而我也不例...

来瞧瞧阿里一面都面些什么(笔试+机试)

絮叨说实话,能有机会面一下阿里对我来说帮助确实有蛮多,至少让我知道了自己的不足在哪,都说面试造火箭,上班拧螺丝。但就算是如此,为了生存,你也只有不停的学习,唯有光头,才能更强。哈哈起因2月28日在Bo...

取消回复欢迎 发表评论: