《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进行扩展。

相关文章
|
14天前
|
运维 监控 网络协议
|
1月前
|
存储 Oracle 关系型数据库
|
26天前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
32 1
|
3月前
|
存储 运维 监控
运维.Linux下执行定时任务(中:Cron的常用替代方案)
本文是关于Linux下执行定时任务系列的第二部分,主要探讨除了Cron之外的常用替代方案。介绍了Systemd Timers、Anacron及at命令三种工具,它们分别适用于不同场景下的定时任务需求。文章详细分析了每种工具的特点、工作原理、基本使用方法及其高级功能,并对比了它们各自的优缺点,帮助读者根据实际情况选择最适合的定时任务解决方案。此外,还提供了指向具体实例和进一步阅读材料的链接。
118 4
运维.Linux下执行定时任务(中:Cron的常用替代方案)
|
3月前
|
移动开发 运维 网络协议
运维必备 | Linux netstat命令详解
运维必备 | Linux netstat命令详解
|
3月前
|
运维 监控 Unix
运维必看,Linux 远程数据同步工具详解。
运维必看,Linux 远程数据同步工具详解。
|
4月前
|
存储 运维 Linux
|
4月前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
139 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
3月前
|
存储 Linux Shell
运维系列.Linux下的用户管理
运维系列.Linux下的用户管理
28 1
|
3月前
|
Web App开发 敏捷开发 测试技术
自动化测试框架的设计与实现探索操作系统的心脏:内核与用户空间的交互
【8月更文挑战第26天】本文旨在探讨自动化测试框架的设计原则、核心组件和实现方法。通过分析自动化测试的优势,我们深入讨论了框架设计的关键考虑因素,包括模块化、可重用性、可扩展性和易维护性。文章还介绍了如何利用流行的测试工具和编程语言来实现一个高效的自动化测试框架,并通过实例展示了框架的应用。
下一篇
无影云桌面