1、共享内存相关的一些参数:
1)/proc/sys/kernel/shmall
   该文件表示在任何给定时刻,系统上可以使用的共享内存的总量(bytes)。
  缺省设置:2097152(操作系统的内核、版本不同会有所不同)
2)/proc/sys/kernel/shmmax
   该文件表示内核所允许的最大共享内存段的大小(bytes)。
   缺省设置:33554432
   建议设置:物理内存 * 50%
  实际可用最大共享内存段大小=shmmax * 98%,其中大约2%用于共享内存结构
3)/proc/sys/kernel/shmmni
   该文件表示用于整个系统的共享内存段的最大数目(个)。
   缺省设置:4096
4)/proc/sys/kernel/sem
   该文件用于控制内核信号量,信号量是System VIPC用于进程间通讯的方法。
   建议设置:250 32000 100 128
   第一列,表示每个信号集中的最大信号量数目。
   第二列,表示系统范围内的最大信号量总数目。
   第三列,表示每个信号发生时的最大系统操作数目。
   第四列,表示系统范围内的最大信号集总数目。
   所以,(第一列)*(第四列)=(第二列)
2、如何查看这些参数:
1)直接查看文件
    cat /proc/sys/kernel/shmall
    268435200
2)使用sysctl命令
    /sbin/sysctl -e kernel
    kernel.shmall = 268435200
3)使用ipcs命令
  ipcs -l
------ Shared Memory Limits --------


max number of segments = 4096


max seg size (kbytes) = 4194303


max total shared memory (kbytes) = 1073740800


min seg size (bytes) = 1
------ Semaphore Limits --------


max number of arrays = 4096


max semaphores per array = 250


max semaphores system wide = 256000


max ops per semop call = 4096


semaphore max value = 32767
------ Messages: Limits --------


max queues system wide = 16


max size of message (bytes) = 65536


default max size of queue (bytes) = 65536
3、如何修改这些值
1)直接修改文件内容
    echo "268435200" > /proc/sys/kernel/shmall
    优点:简直、直观、快捷,马上生效
    缺点:机器重启后修改丢失,又恢复成默认值
    PS. 可以在rc.local加入这种修改方式,这样机器迁移时,可以很直观得知道共享内存的值需要修改。
2)修改/etc/sysctl.conf文件
    优点:永久修改,重启不会丢失
    缺点:需重启才会生效


    ps.可通过/sbin/sysctl -p命令使修改立即生效,而不需要重启
3)使用/sbin/sysctl命令
    sysctl -w kernel.shmmni
    优点:会做数据有效性校验,安全可靠,且马上生效,重启不会丢失
    缺点:在做机器迁移时,此种修改方法易被忽略
综上,建议使用第3种方式进行修改,且做好文档的管理工作,在明显位置记录此种修改。
4、其他一些问题:
1)如何查看本机的所有共享内存:
    ipcs -m
    输出内容为“key        shmid      owner      perms      bytes      nattch     status ”
2)如何查看本机的所有信号量
    ipcs -s
3)如何删除一个共享内存
    ipcrm -M 0x0000231d
4)如何删除一个信号量
    ipcrm -S 0x0000231d
5)如何知道一个共享内存被哪些进程使用了
    #参数中SYSV后面的值为共享内存的KEY值
    lsof | grep "SYSV00002320"


6)进程加载共享内存失败怎么处理?


#首先确认共享内存有没有正确初始化


    ipcs -m  -i 0x00002600


    #如果没有初始化,应该调用始始化程序进行初始化;如果已经初始化可尝试,删除后重新初始化


    ipcrm -M 0x00002600


7)进程初始化共享内存或信号量失败怎么处理?


    一般是由于超过了共享内存或信号量限制导致。可通过ipcs -u查看当前的使用情况。可通过以上第三步中介绍的方法进行修改。 


8)如何删除系统中所有已不再使用的工享内存 


    ipcs -m | awk '{if($6==0) print "ipcrm -M "$1}'| sh


    即第6个字段,nattach为零的共享内存即为没有进程使用的共享内存。


    PS.如果是在现网进行操作一定要谨慎使用此命令,因为可能有的共享内存可能当前没有被使用,但是在其他时刻有可能会被继续使用。