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