在同一台服務器上運行的多個程序之間如果需要相互通信的,那么他們就需要使用的共享內存等進程交互模塊:
多進程間通信常用的手段包括共享內存,消息隊列,信號量等等,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
以上,共勉!