ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [20210826]内核参数kernel.sem.txt

[20210826]内核参数kernel.sem.txt

原创 Linux操作系统 作者:lfree 时间:2021-09-01 10:17:20 1 删除 编辑

[20210826]内核参数kernel.sem.txt

kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI

where

semmsl:  The number of semaphores per set                                     每组信号量
semmns:  The total number of semaphores available                             可用信号量的总数
semopm:  The number of operations which can be made per semaphore call        每个信号量呼叫可以执行的操作数。
semmni:  The maximum number of shared memory segments available in the system 系统中可用的最大共享内存段数
--//注:以上信息出处我已经无法找到,不过semmni的解析应该不正确,这个参数的设置应该与信号量相关,而不应该与最大共享内存段
--//有关系。

--//说句老实话,我对OS这方面知识了解很少,甚至不理解,安装配置仅仅是照抄别人推荐的设置。
--//我记得我第一次安装oracle 8i是在soalris服务器,当时配置这些参数是就卡在那里,不理解这些参数的具体含义,只能上新闻组问这
--//些问题。实际上你如果问现在许多安装N多次oracle数据库的人,基本也就是机械的copy and paste,具体表示什么未必清楚。

--//首先转抄链接:http://blog.itpub.net/26736162/viewspace-2147273/,并加入我对这些参数的理解。

重要的几个参数如下所示:
kernel.shmall = 2097152
kernel.shmmax = 1054472192
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128

其含义分别如下所示:
(一)kernel.shmall = 2097152
# kernel.shmall参数是控制共享内存页数。Linux 共享内存页大小为4KB,共享内存段的大小都是共享内存页大小的整数倍。如果一个共
# 享内存段的最大大小是16G,那么需要共享内存页数是 16GB/4KB = 16777216KB/4KB = 4194304(页),也就是64Bit系统下16GB物理内存
# ,设置kernel.shmall = 4194304才符合要求(几乎是原来设置2097152的两倍)。简言之,该参数的值始终应该至少为:
# ceil(SHMMAX/PAGE_SIZE)。这个值太小有可能导致数据库启动报错(ORA-27102: out of memory)。

(二)kernel.shmmax = 1054472192  
# 定义一个内存段最大可以分配的内存空间,单位为字节。如果定义太小,那么会导致启动实例失败,或者SGA就会被分配到多个共享内
# 存段。那么内存中的指针连接会给系统带来一定的开销,从而降低系统性能。这个值的设置应该大于SGA_MAX_TARGET或
# MEMORY_MAX_TARGET的值,最大值可以设置成大于或等于实际的物理内存。如果kernel.shmmax为100M,sga_max_size为500M,那么启动
# Oracle实例至少会分配5个共享内存段;如果设置kernel.shmmax为2G,sga_max_size为500M,那么启动Oracle实例只需要分配1个共享
# 内存段。

(三)kernel.shmmni = 4096
# 设置系统级最大共享内存段数量,该参数的默认值是4096。这一数值已经足够,通常不需要更改。。

(四)kernel.sem = 250 32000 100 128
# 信号灯的相关配置,信号灯semaphores是进程或线程间访问共享内存时提供同步的计数器。可以通过命令"cat /proc/sys/kernel/sem"
# 来查看当前信号灯的参数配置,如下所示:

# cat /proc/sys/kernel/sem
250     32000   100     128

其4个值的含义分别如下:
① 250表示SEMMSL,设置每个信号灯组中信号灯最大数量,推荐的最小值是250。对于系统中存在大量并发连接的系统,推荐将这个值设
   置为PROCESSES初始化参数加10。
--// 实际上对于linux 设置为PROCESSES初始化参数加4就可以了。
② 32000表示SEMMNS,设置系统中信号灯的最大数量。操作系统在分配信号灯时不会超过LEAST(SEMMNS,SEMMSL*SEMMNI)。事实上,如果
   SEMMNS的值超过了SEMMSL*SEMMNI是非法的,因此推荐SEMMNS的值就设置为SEMMSL*SEMMNI。Oracle推荐SEMMNS的设置不小于32000。
--//SEMMSL*SEMMNI=250*128 = 32000
③ 100表示SEMOPM,设置每次系统调用可以同时执行的最大信号灯操作的数量。由于一个信号灯组最多拥有SEMMSL个信号灯,因此有推荐
   将SEMOPM设置为SEMMSL的值。Oracle验证的10.2和11.1的SEMOPM的配置为100。
④ 128表示SEMMNI,设置系统中信号灯组的最大数量。Oracle10g和11g的推荐值为142。
--//一直也不理解小麦苗为什么推荐设置142,不知道出处再那里,对参数SEMMNI的解析是设置系统中信号灯组的最大数量。也就是最大
--//有128信号组,感觉这个解析比较正确。

--//补充我测试环境的设置:
 $ cat /proc/sys/kernel/sem
2600    332800  2600    128

--//2600*128 = 332800
--//再次看了ipcs的文档,发现加入参数-ls 就可以查看semaphore Limits。
$ ipcs -ls

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 2600
max semaphores system wide = 332800
max ops per semop call = 2600
semaphore max value = 32767

--//kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI,很明显解析如下:
kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI

where

SEMMSL  max semaphores per array
SEMMNS  max semaphores system wide ,SEMMSL*SEMMNI=2600*128 = 332800
SEMOPM  max ops per semop call, SEMOPM=SEMMSL?
SEMMNI  max number of arrays
--//SEM 表示 Semaphore.
--//我想通过一些测试说明以上问题,加深理解,太长另外写一篇blog

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2789797/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7970344