ipcs、ipcrm、sysresv、kernel.shmmax

0    166    2

Tags:

👉 本文共约3472个字,系统预计阅读时间或需14分钟。

ipcs、ipcrm、sysresv、kernel.shmmax

前言部分

导读和注意事项

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:

① ipcs的使用

② ipcrm释放oracle内存段

③ sysresv的使用

④ 内核参数kernel.shmmax

⑤ 如何快速的清理Oracle的进程

⑥ 其它维护操作

本文简介

最近有朋友因为kernel.shmmax内核参数的问题导致数据库不能启动。小麦苗之前碰到过一次,只是没有记录下来,而且以前安装数据库的时候也没有详细介绍这几个参数的含义,趁这次机会就把这个参数在详细介绍一下吧。

ipcs/ipcrm命令

unix/linux下的共享内存、信号量、队列信息管理

在Unix或Linux下,经常有因为共享内存、信号量,队列等共享信息没有干净地清除而引起一些问题。

查看共享内存的命令是:ipcs [-m|-s|-q]。若ipcs命令不带参数,则默认会列出共享内存、信号量,队列信息,而-m列出共享内存,-s列出共享信号量,-q列出共享队列。

清除命令是:ipcrm [-m|-s|-q] id,其中,-m删除共享内存,-s删除共享信号量,-q删除共享队列。

ipcs

1. 命令格式

ipcs [resource-option] [output-format]

ipcs [resource-option] -i id

2. 命令功能

提供IPC设备的信息

3. 使用方法

resource选项:

ipcs -m 查看系统共享内存信息

ipcs -q 查看系统消息队列信息

ipcs -s 查看系统信号量信息

ipcs [-a] 系统默认输出信息,显示系统内所有的IPC信息

输出格式控制:

ipcs -c 查看IPC的创建者和所有者

ipcs -l 查看IPC资源的限制信息

ipcs -p 查看IPC资源的创建者和使用的进程ID

ipcs -t 查看最新调用IPC资源的详细时间

ipcs -u 查看IPC资源状态汇总信息

额外格式控制:

ipcs -l --human

以人类可以阅读的方式显示size

ipcrm

1. 命令功能

通过指定ID删除删除IPC资源,同时将与IPC对象关联的数据一并删除,只有超级用户或IPC资源创建者能够删除

2. 使用方法

ipcrm -M shmkey

移除用shmkey创建的共享内存段

ipcrm -m shmid

移除用shmid标识的共享内存段

ipcrm -S semkey

移除用semkey创建的信号量

ipcrm -s semid

移除用semid标识的信号量

ipcrm -Q msgkey

移除用msgkey创建的消息队列

ipcrm -q msgid

移除用msgid标识的消息队列

如何快速的清理Oracle的进程?

  1. 如何快速的清理Oracle的进程?

答案:若想要快速清理掉Oracle的进程,则最直接的办法是杀pmon进程。有如下3条命令可供选择,其中加粗的orcl替换成ORACLE_SID的值即可。

若想要快速杀掉集群的进程,则可以执行如下命令:

注意,生产库上严禁使用,否则可能导致集群不能正常启动。

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

sysresv命令

若是一个主机上有多个oracle实例的话该如何确定哪个共享内存段属于我们该清掉的oracle实例的内存段?

答案:使用sysresv命令。sysresv是Oracle在Linux/Unix平台提供的工具,用来查看Oracle实例使用的共享内存和信号量等信息。sysresv存放的路径:$ORACLE_HOME/bin/sysresv。使用时需要设置LD_LIBRARY_PATH环境变量,用来告诉Oracle共享库文件的位置。sysresv用法如下:

来看一下简单使用:

说明一下:在安装ORACLE产品前,需要设置系统的共享内存段的最大值和个数限制,实例在启动后,应尽量保证SGA在一个共享内存段上,这里由于我是在RAC的一个节点上进行的测试,所以实例内存被分配到4个共享内存段上。

IPC的清理可以使用sysresv –if,如果实例正在运行,清理操作会被终止:

另外如果需要清理内存段和信号量,而sysresv发现实例是alive的,可以使用ipcrm命令:

实验

Oracle内核参数

查看:more /proc/sys/kernel/shmmax

临时生效:echo 3145728 > /proc/sys/kernel/shmmax

永久生效,修改文件:/etc/sysctl.conf,并使修改参数立即生效:/sbin/sysctl -p

重要的几个参数如下所示:

其含义分别如下所示:

  1. 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)。

  2. 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个共享内存段。

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

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

其4个值的含义分别如下:

  1. 250表示SEMMSL,设置每个信号灯组中信号灯最大数量,推荐的最小值是250。对于系统中存在大量并发连接的系统,推荐将这个值设置为PROCESSES初始化参数加10。
  2. 32000表示SEMMNS,设置系统中信号灯的最大数量。操作系统在分配信号灯时不会超过LEAST(SEMMNS,SEMMSL*SEMMNI)。事实上,如果SEMMNS的值超过了SEMMSL*SEMMNI是非法的,因此推荐SEMMNS的值就设置为SEMMSL*SEMMNI。Oracle推荐SEMMNS的设置不小于32000。
  3. 100表示SEMOPM,设置每次系统调用可以同时执行的最大信号灯操作的数量。由于一个信号灯组最多拥有SEMMSL个信号灯,因此有推荐将SEMOPM设置为SEMMSL的值。Oracle验证的10.2和11.1的SEMOPM的配置为100。
  4. 128表示SEMMNI,设置系统中信号灯组的最大数量。Oracle10g和11g的推荐值为142。

kernel.shmmax参数

实验1

下面临时设置kernel.shmmax为3M,会导致Oracle不能启动,设置sqlplus不能进入:

告警日志:

或启动报错:

有关“TNS-12518: TNS:listener could not hand off client connection”的更多内容请参考:

【故障|监听】TNS-12518、TNS-00517和 Linux Error:32:Broken pipehttp://blog.itpub.net/26736162/viewspace-2135468/

实验2

下面临时设置kernel.shmmax为100M,sga_max_size为500M,则至少需要5个共享内存段,查看临时段的个数:

下面临时设置kernel.shmmax为2G,sga_max_size为500M,则只需要1个共享内存段,查看临时段的个数:

kernel.shmall

该参数设置过小,有可能导致数据库启动报错。很多人调整系统内核参数的时候只关注SHMMAX参数,而忽略了SHMALL参数的设置。

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

5 × 4 =

 

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部