ipcs
在同一台服务器上运行的多个程序之间如果需要相互通信的,那么他们就需要使用的共享内存等进程交互模块:
多进程间通信常用的手段包括共享内存,消息队列,信号量等等,linux自带的ipcs命令,就是检查前面提到的三项的使用情况,从而有利于定位多进程通信中出现的问题;之前在时光没有涉及到是因为时光的gameserver都是单进程,一台机器上不会出现过多的进程间通信,但是犀牛就不一样了。
这是 ipcs -a 指令的输出样子,其中
信号量在创建的时候分为信号量集和信号量的概念,该命令的查询结果中,Semaphore Arrays下每一行代表一个信号量集,其中perms对应的是权限,nsems对应信号量集中信号量的个数。
对于消息队列Message Queues而言,mspid是创建队列时给到的ID值, 从messages中可以看到当前队列中存在的消息个数,从used_bytes中可以看到当前所有消息占用的字节数,所以单个消息的字节数则为总字节数除以消息数,同时如果消息个数不为零则说明消息队列中的消息没有得到及时处理,可以据此判断是否存在队列阻塞的风险。
ipcs -p的指令输出:
其中, Message Queues PIDs中的msqid既对应上条命令结果中的消息队列id,根据id则可以获取到lspid、lrpid消息,其中lspid代表最近一次向消息队列中发送消息的“进程号”,lrpid对应最近一次从消息队列中读取消息的“进程号”。但请注意:此处的进程号是弱进程号,既它有可能代表的是线程号,如果进程中是起的线程对消息队列发送、接收消息,则此处pid对应的均是线程号。可以采用ps -AL | grep pid来查找该线程对应的进程id。
ipcs -u 指令的输出为:
ipcs -u命令可以查看各个资源的使用总结信息,其中可以看到使用的信号量集的个数、信号量的个数,以及消息队列中当前使用的消息个数总数、占用的空间字节数。
ipcs -l命令可以查看各个资源的系统限制信息,可以看到系统允许的最大信号量集及信号量个数限制、最大的消息队列中消息个数等信息:
从中可以看到以下信号量的限制信息,其中信号量集最大个数为128、每个信号量集中信号量最大个数为250、所有信号量最大个数为32000、每个信号量可以被同时调用的次数为32,这些参数是linux系统下的默认参数,对于限制参数也可以做一定程度的优化,会有一定程度上性能的提升,具体优化方法可以搜索相关帖子。
与之相关联的指令ipcrm:
功能:通过指定ID删除IPC资源,同时将于IPC对象关联的数据一起删除,只有超级用户和IPC资源创建者才能删除。
使用方法:
ipcrm -M shmkey
移除用shmkey创建的共享内存段
ipcrm -m shmid
移除用shmid标识的共享内存段
ipcrm -S semkey
移除用semkey创建的信号量
ipcrm -s semid
移除用semid标识的信号量
ipcrm -Q msgkey
移除用msgkey创建的消息队列
ipcrm -q msgid
移除用msgid标识的消息队列
这里我们能够使用一条符合指令完成共享内的清理:
ipcs |awk '{if($6==0) printf "ipcrm shm %d\n",$2}' |sh ; ipcs
以上,共勉!