查看: 35908|回复: 51

[精华] 关于Linux 下kernel.shmmax 的设置问题 。

[复制链接]
论坛徽章:
71
2015年新春福章
日期:2015-03-06 11:57:312013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-01-06 13:31:18蜘蛛蛋
日期:2013-01-06 10:26:08茶鸡蛋
日期:2012-11-21 19:35:23ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07版主2段
日期:2012-05-15 15:24:11铁扇公主
日期:2012-02-21 15:02:402012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
跳转到指定楼层
1#
发表于 2006-5-19 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是Oracle 文档上的解释, http://download-west.oracle.com/ ... 1/pre.htm#sthref107   


SHMMAX  Available physical memory  Defines the maximum allowable size of one shared memory segment.  

The SHMMAX setting should be large enough to hold the entire SGA in one shared memory segment. A low setting can cause creation of multiple shared memory segments which may lead to performance degradation.  


shmmax 的含义是单个共享内存段的最大尺寸, 设置shmmax=1G,sga分配了1.2G,当启动实例的时候就分配 2  块共享内存给Oracle .
如果物理内存是 2 G,   假设这台DB Server上还有Apache 在运行,那么shmmax 中设置的内存也会被Apache 来使用,那么分配的 2 块共享内存段给Oracle 是否就是 2 * 1G ,   还是仅仅满足 SGA需求的 1.2 G就停止分配 , 其他的内存的一部分分配给Oracle PGA 和软件 Apache 来使用 ?
论坛徽章:
71
2015年新春福章
日期:2015-03-06 11:57:312013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-01-06 13:31:18蜘蛛蛋
日期:2013-01-06 10:26:08茶鸡蛋
日期:2012-11-21 19:35:23ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07版主2段
日期:2012-05-15 15:24:11铁扇公主
日期:2012-02-21 15:02:402012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
2#
 楼主| 发表于 2006-5-19 10:13 | 只看该作者
看Oracle Document 说法 , 当需要分配多个 ( creation of multiple shared memory segments ) 共享内存段的时候会导致性能下降 。
如果偶尔分配需要 2 个共享内存段 ,性能应该不会受到太大影响吧 。

使用道具 举报

回复
论坛徽章:
71
2015年新春福章
日期:2015-03-06 11:57:312013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-01-06 13:31:18蜘蛛蛋
日期:2013-01-06 10:26:08茶鸡蛋
日期:2012-11-21 19:35:23ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07版主2段
日期:2012-05-15 15:24:11铁扇公主
日期:2012-02-21 15:02:402012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
3#
 楼主| 发表于 2006-5-19 10:56 | 只看该作者
顶下

使用道具 举报

回复
论坛徽章:
9
授权会员
日期:2005-10-30 17:05:33ITPUB元老
日期:2005-11-07 17:06:46铁扇公主
日期:2006-04-12 17:42:13红孩儿
日期:2006-04-13 08:43:44嫦娥
日期:2006-04-13 08:43:54玉兔
日期:2006-04-13 08:44:02九尾狐狸
日期:2006-04-13 08:44:12会员2006贡献徽章
日期:2006-04-17 13:46:34生肖徽章2007版:虎
日期:2009-04-21 21:32:53
4#
发表于 2006-5-19 10:57 | 只看该作者
楼主理解的不对。
oracle 建议 shmmax 大于sga,以让 sga在一个共享内存段中,从而提高性能
shmmax 仅仅表示一个最大值,在实际的生产条件中,如果运行apach等,可能就没有1个内存段达到1G的

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
5#
发表于 2006-5-19 11:12 | 只看该作者
到底谁说的对呢?

使用道具 举报

回复
论坛徽章:
52
ITPUB元老
日期:2006-02-14 08:33:40现任管理团队成员
日期:2011-05-07 01:45:08
6#
发表于 2006-5-19 11:15 | 只看该作者
最初由 tolywang 发布
[B]看Oracle Document 说法 , 当需要分配多个 ( creation of multiple shared memory segments ) 共享内存段的时候会导致性能下降 。
如果偶尔分配需要 2 个共享内存段 ,性能应该不会受到太大影响吧 。 [/B]


实际过程中很少见到sga分配到多上段的状况。
有些记不清了,我好像记得这个值如果没你要求分配的值低,并不会分配多个共享内存段,实际上会报错(hp-unix)

这个需要实测一下。性能下降一定是一定会的了,分配多段一定会有内存段中data的交互,应该会降一些性能,但不会太大。

使用道具 举报

回复
论坛徽章:
9
授权会员
日期:2006-03-15 22:32:12数据库板块每日发贴之星
日期:2006-08-15 01:02:49会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
7#
发表于 2006-5-19 11:23 | 只看该作者

Re: 关于Linux 下kernel.shmmax 的设置问题 。

最初由 tolywang 发布
[B]下面是Oracle 文档上的解释, http://download-west.oracle.com/ ... 1/pre.htm#sthref107   


SHMMAX  Available physical memory  Defines the maximum allowable size of one shared memory segment.  

The SHMMAX setting should be large enough to hold the entire SGA in one shared memory segment. A low setting can cause creation of multiple shared memory segments which may lead to performance degradation.  


shmmax 的含义是单个共享内存段的最大尺寸, 设置shmmax=1G,sga分配了1.2G,当启动实例的时候就分配 2  块共享内存给Oracle .
如果物理内存是 2 G,   假设这台DB Server上还有Apache 在运行,那么shmmax 中设置的内存也会被Apache 来使用,那么分配的 2 块共享内存段给Oracle 是否就是 2 * 1G ,   还是仅仅满足 SGA需求的 1.2 G就停止分配 , 其他的内存的一部分分配给Oracle PGA 和软件 Apache 来使用 ? [/B]



  应该是满足SGA的1.2G后,分配就停止了,如果有其它应用的话,会重新分配共享内存段给其它应用,

[root@localhost root]# ipcs -sa

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 0          oracle    640        4194304    12                     
0x00000000 32769      oracle    640        33554432   12                     
0x00000000 65538      oracle    640        33554432   12                     
0x00000000 98307      oracle    640        33554432   12                     
0x00000000 131076     oracle    640        33554432   12                     
0x00000000 163845     oracle    640        33554432   12                     
0x00000000 196614     oracle    640        33554432   12                     
0x00000000 229383     oracle    640        33554432   12                     
0x4daf3264 262152     oracle    640        4194304    48                     

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x1af040f0 98304      oracle    640        154      
0x00000000 425985     nobody    600        1         

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages   

[root@localhost root]# more /proc/sys/kernel/shmm
shmmax  shmmni  
[root@localhost root]# more /proc/sys/kernel/shmmax
33554432

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
8#
发表于 2006-5-22 15:15 | 只看该作者

Re: Re: 关于Linux 下kernel.shmmax 的设置问题 。

最初由 exitgogo 发布
[B]


  应该是满足SGA的1.2G后,分配就停止了,如果有其它应用的话,会重新分配共享内存段给其它应用,

[root@localhost root]# ipcs -sa

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 0          oracle    640        4194304    12                     
0x00000000 32769      oracle    640        33554432   12                     
0x00000000 65538      oracle    640        33554432   12                     
0x00000000 98307      oracle    640        33554432   12                     
0x00000000 131076     oracle    640        33554432   12                     
0x00000000 163845     oracle    640        33554432   12                     
0x00000000 196614     oracle    640        33554432   12                     
0x00000000 229383     oracle    640        33554432   12                     
0x4daf3264 262152     oracle    640        4194304    48                     

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x1af040f0 98304      oracle    640        154      
0x00000000 425985     nobody    600        1         

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages   

[root@localhost root]# more /proc/sys/kernel/shmm
shmmax  shmmni  
[root@localhost root]# more /proc/sys/kernel/shmmax
33554432 [/B]


  能否解释一下你的图和你的结论之间的关系

使用道具 举报

回复
论坛徽章:
26
ITPUB元老
日期:2005-02-28 12:57:00生肖徽章:兔
日期:2006-09-26 21:29:55生肖徽章:兔
日期:2006-09-07 17:01:32生肖徽章:兔
日期:2006-09-07 17:02:25生肖徽章:兔
日期:2006-09-07 17:02:46生肖徽章:兔
日期:2006-09-07 17:06:29生肖徽章:兔
日期:2006-09-18 05:26:00生肖徽章:狗
日期:2006-10-06 13:28:27生肖徽章:狗
日期:2006-10-08 05:28:34生肖徽章2007版:鸡
日期:2008-01-02 17:35:53
9#
发表于 2006-5-22 15:35 | 只看该作者
应该是满足SGA的1.2G后,分配就停止了,如果有其它应用的话,会重新分配共享内存段给其它应用,
这个值是单个共享内存段的最大值如果你的SHMMAX 设置为1GB 的话,而且又给oracle 的SGA 分了1.2gb 的话,那么数据库启动的时候SGA 会被分成2个segment,一共1.2GB ,其他的应用应该和oracle 的SGA 又有关系的


如果内存分配给oracle 的SGA 很大的话,最好将这个值设置的比较大一点以便可以使用一个共享内存段就可以放下整个SGA

如果小的话,那么SGA 就被分成好几个shared memory segment ,这样就会在多个内存段上面发生数据的交互,会影响性能的,但是影响不会太大的

这个值还和shmseg有关系。如果值太小而将SGA 分成多个段的话,如果超过shmseg 的话,那也不行

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
10#
发表于 2006-5-22 15:45 | 只看该作者
http://www.itpub.net/showthread. ... 229&pagenumber=

参考这个地方,我个人的一点意见
实际上内存段之间的数据的交互的问题 是一个  想象出来的概念,本身虚拟内存地址是否连续 并不影响访问数据的效率,只是在计算地址的时候有点差别,但这个差别几乎不导致性能上的影响。


实际上,shmmax 是否大于sga造成的影响,不过是 sga 在虚拟内存空间上到底是连续的还是离散的问题!

如果 shmmax大于 sga ,则当oracle 启动的时候,连续地分配一段虚拟空间作为一个 share segment 并给sga使用。 但是这些虚拟内存空间 在物理上却并不一定连续,这是os来管理和维护的。


如果sga 分布在多个共享的虚拟空间段上,如上面 YONG HUANG 引述的内容,在启动的时候 需要去创建多个虚拟地址段,在进程创建的时候要让进程对多个段进行“识别”,会有一些影响。但是在真正地访问 虚拟内存空间(sga)的时候,不过是根据共享段的起始地址来计算偏移量而已。 多个share segment 不过会造成计算访问的内存地址的时候始始地址并不统一,但对数据的访问本身并没有什么差异。 也许在内核中地址的转换有这一部差异,但对应用来讲关系不大。 也许我的描述并不准确,或者说,上面这些话是我个人的理解的一个猜测,但是,我坚信,这本身对数据库性能不会造成多大的影响。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表