《Oracle高性能自动化运维》一一1.4 Linux内存体系与Oracle内存空间

简介:

本节书摘来自华章计算机《Oracle高性能自动化运维》一书中的第1章,第1.4节,作者:冷菠 著,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.4 Linux内存体系与Oracle内存空间

1.4.1 Linux用户空间与内核空间
一般来说,Linux操作系统把虚拟地址空间划分为用户空间和内核空间。例如x86架构下的32位Linux虚拟地址空间是4GB(0x0000 0000~0xffff ffff),其中大致将前3GB(0x0000 0000~0xbfff ffff)划分为用户空间,后1GB(0xc000 0000~0xffff ffff)划分为内核空间。
用户程序只能在用户模式(用户空间)下执行,而不能访问特权模式(内核空间)的数据,也不能跳转到内核代码执行,这样的设计可以保护内核,最主要的原因是当一个用户进程访问了非法地址,最坏的情况是该进程崩溃,而不会影响到内核和其他进程正常运行。
CPU在产生中断或异常时会自动切换模式,由用户模式切换到特权模式,这时就可以允许跳转到内核代码中执行中断或异常服务程序。事实上,所有内核代码的执行都是从中断或异常服务程序开始的,整个Linux内核就是由各种中断处理和异常处理程序组成的。
Linux下的Oracle内存分配如图1-3、图1-4所示。
Oracle10g中的SGA与PGA在Linux中是独立分配的,但是在11g中,默认情况下SGA内存区域包含了PGA的内存空间。
1.4.2 Linux下的Oracle内存体系结构
我们知道,Oracle主要是由内存结构和物理结构组成的,如图1-5所示。

image

图1-5 Oracle体系结构
可以看出,Oracle 内存结构存在于操作系统的用户空间,因此我们在部署Oracle前,就必须事先在Linux操作系统层面配置好Oracle内存地址空间,这样才能成功地配置SGA与PGA,从而避免在安装Oracle的时候出现类似“ORA-27102:out of memory”的错误。
1.4.3 Linux下的Oracle内存分配
Oracle内存结构处于Linux操作系统的用户空间,因此需要通过设置Linux操作系统内核参数来对Oracle 内存进行分配。由于Linux延续了SystemV IPC以及后来的POSIX IPC通信标准,因此Linux下的内存分配主要由以下参数决定,如表1-1所示。
image

SHMALL在很多系统上是用页面数而不是字节数来计算的。对于一般的Linux来说,Page页的大小一般为4096。
参数SHMMAX是Oracle最重要的Linux内核参数之一,该参数以字节为单位限制单个共享内存段的最大值。与此同时,参数SHMALL用于限制共享内存总数(字节或者Page页)。对于Oracle而言,必须保证这个数值足够大,建议值为超过数据库共享内存与其他共享内存的总和。Oracle官方文档对Linux参数限制描述如图1-6所示。
image

图1-6 Oracle官方Linux内核参数
我们可以通过以下示例来验证Linux下的Oracle(10g)内存分配:
1)查看Oracle SGA与PGA分配情况,如图1-7所示。
2)查看Linux系统共享内存分配情况,如图1-8所示。
可以看到,Linux系统分配了3个共享内存段,每个共享内存段的大小为2GB。
3)查看Linux环境中的sysctl.conf配置,如图1-9所示。
结合前面内容,不难看出:
单个共享内存段最大值为kernel.shmmax=2147483648B=2GB,与图1-10一致;
SGA=3(共享内存段数量)×2GB(单个内存段最大值)=6GB;
PGA=2GB;
Linux共享内存大小=kernel.shmall=2097152×4096/1024/1024/1024=8GB=SGA(6GB)+PGA(2GB)。
image

上述内容可以概括如图1-10所示。
结合前面内容,我们可以得出以下结论:
参数kernel.shmmax决定了单个共享内存段的最大值为2GB,即在Linux操作系统层面能分配的单个共享内存段的最大值为2GB。如果所需共享内存大于该值,则需要分配多个共享内存段,以最大共享内存段(2GB)为阈值对所需共享内存段进行拆分分配。
参数kernel.shmall(8GB)决定了Linux操作系统能够提供给Oracle共享内存的上限值,SGA与PGA总和不能超过该阈值。
image

图1-10 Linux下的Oracle内存分配(10g)
当sga_target设置为6GB时,kernel.shmmax(2GB)决定了Linux系统分配的单个共享内存段上限值,因此需要分配3(6GB/2GB)个共享内存段来提供给SGA。Oracle推荐1个Instance使用1个共享内存段,那么当上述3个共享内存段被分配时,将会在共享内存段之间产生内存地址断层(GAP)。所以当数据库进行IPC通信时,可能存在跨共享内存段的内部数据交互,这样会降低共享内存段间的数据交互效率。因此,建议Linux环境中的Oracle使用1个共享内存段,这样可以减少跨内存段的数据交互,从而提升数据库性能。
图1-10是以Oracle 10g为例进行讲解的,有兴趣的读者可以结合图1-4对Oracle11g进行扩展。

相关文章
|
2月前
|
存储 开发框架 .NET
"揭秘.NET内存奥秘:从CIL深处窥探值类型与引用类型的生死较量,一场关于速度与空间的激情大戏!"
【8月更文挑战第16天】在.NET框架中,通过CIL(公共中间语言)可以深入了解值类型与引用类型的内存分配机制。值类型如`int`和`double`直接在方法调用堆栈上分配,访问迅速,生命周期随栈帧销毁而结束。引用类型如`string`在托管堆上分配,堆栈上仅存储引用,CLR负责垃圾回收,确保高效且自动化的内存管理。
54 6
|
15天前
|
存储 运维 搜索推荐
|
8天前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
14 1
|
17天前
|
运维 网络协议 安全
Linux安全运维--一篇文章全部搞懂iptables
Linux安全运维--一篇文章全部搞懂iptables
27 1
|
29天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
99 5
|
9天前
|
Web App开发 运维 安全
1Panel:一个现代化、开源的 Linux 服务器运维管理面板
1Panel:一个现代化、开源的 Linux 服务器运维管理面板
|
1月前
|
运维 监控 Linux
深入理解Linux系统运维:命令行工具的力量
【9月更文挑战第14天】在Linux的世界里,命令行工具是系统管理员的瑞士军刀。本文将带你领略命令行的魅力,从基础操作到高级技巧,让你的运维工作更加高效和精准。准备好了吗?让我们一起开启这段探索之旅!
|
1月前
|
消息中间件 运维 Linux
linux之centos运维kafka
linux之centos运维kafka
|
2月前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
94 3