东瑜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  135 随笔 :: 0 文章 :: 11 评论 :: 21万 阅读

作者:@张扶摇
本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhangshengdong/p/13646124.html


目录

查看linux下的Oracle共享内存段
shmmax
shmall
调节kernel.shmall和kernel.shmmax的原因

查看linux下的Oracle共享内存段

[oracle@oradb ~]$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 1835009    oracle     640        100663296  180                     
0x00000000 1867778    oracle     640        1174405120 180                     
0x00000000 1900547    oracle     640        1174405120 180                     
0x00000000 1933316    oracle     640        1174405120 180                     
0x00000000 1966085    oracle     640        1174405120 180                     
0x00000000 1998854    oracle     640        1174405120 180                     
0x00000000 2031623    oracle     640        1174405120 180                     
0x00000000 2064392    oracle     640        1174405120 180                     
0x00000000 2097161    oracle     640        1174405120 180                     
0x00000000 2129930    oracle     640        1174405120 180                     
0x00000000 2162699    oracle     640        1174405120 180                     
0x00000000 2195468    oracle     640        1174405120 180                     
0x00000000 2228237    oracle     640        1174405120 180                     
0x00000000 2261006    oracle     640        1174405120 180                     
0x00000000 2293775    oracle     640        1174405120 180                     
0x00000000 2326544    oracle     640        637534208  180                     
0x73c02390 2359313    oracle     640        2097152    180 

可以看出Oracle的内存共享段,分成了10余个内存共享段。

为什么会是1174405120字节呢?

通过查询

[oracle@oradb ~]$ cat /etc/sysctl.conf |grep shmmax
kernel.shmmax = 1200000000
[oracle@oradb ~]$ cat /etc/sysctl.conf |grep shmall
kernel.shmall = 10388608

可以知道

shmmax

是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值。

64 位 linux 系统:可取的最大值为物理内存值 -1byte ,建议值为多于物理内存的一半,一般取值大于 SGA_MAX_SIZE 即可,可以取物理内存 -1byte 。

* 内存为 12G 时,该值为 12*1024*1024*1024-1 = 12884901887
* 内存为 16G 时,该值为 16*1024*1024*1024-1 = 17179869183
* 内存为 32G 时,该值为 32*1024*1024*1024-1 = 34359738367
* 内存为 64G 时,该值为 64*1024*1024*1024-1 = 68719476735
* 内存为 128G 时,该值为 128*1024*1024*1024-1 = 137438953471

shmall

该参数控制可以使用的共享内存的总页数。 Linux 共享内存页大小为 4KB, 共享内存段的大小都是共享内存页大小的整数倍。

一个共享内存段的最大大小是 16G ,那么需要共享内存页数是 16GB/4KB==4194304 (页),

  • 当内存为 12G 时, kernel.shmall = 3145728
  • 当内存为 16G 时, kernel.shmall = 4194304
  • 当内次为 32G 时, kernel.shmall = 8388608
  • 当内存为 64G 时, kernel.shmall = 16777216
  • 当内存为 128G 时, kernel.shmall = 33554432

调节kernel.shmall和kernel.shmmax的原因

如果我们的sga为16GB。物理服务器是32GB。那么这两个参数设置值如下:

kernel.shmall = 8388608
kernel.shmmax = 17179869184

为什么要设置大一点的shmall和shmmax,因为想让Oracle的一个instance包含在一个共享内存段中。
可以看,上述服务器的共享内存段分配了14个,这样会出现内存地址断层(GAP)。当数据库进行IPC通信时,会出现跨共享内存段的内部数据交互。这样会降低内存段间的数据交互效率。
因此,1个共享内存段包含数据库instance实例所需要的内存,可以减少跨内存段的交互,提高数据库的性能。



感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接
posted on   东瑜  阅读(1327)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
\\页脚html代码
点击右上角即可分享
微信分享提示