中间件中我们常通过启动多个进程来提高其运行的稳定性,而共享内存、消息队列、信号量等技术保证了多进程间的通信。
在Linux系统中通过自带的ipcs命令工具,可查看当前系统中以上三项的使用情况,从而利于定位多进程通信中出现的通信问题。
ipcs -h查看该命令的使用帮助
[root@test ~]# ipcs -h Usage: ipcs [resource ...] [output-format] ipcs [resource] -i <id> Options: -i, --id <id> print details on resource identified by id -h, --help display this help and exit -V, --version output version information and exit Resource options: -m, --shmems shared memory segments -q, --queues message queues -s, --semaphores semaphores -a, --all all (default) Output format: -t, --time show attach, detach and change times -p, --pid show creator and last operations PIDs -c, --creator show creator and owner -l, --limits show resource limits -u, --summary show status summary --human show sizes in human readable format -b, --bytes show sizes in bytes |
ipcs -a 查看当前使用的共享内存、消息队列及信号量所有信息
[root@test ~]# ipcs -a ------ Message Queues -------- key msqid owner perms used-bytes messages ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x6c001f61 32768 root 600 292944 6 ------ Semaphore Arrays -------- key semid owner perms nsems 0x7a001f61 163840 root 600 12 0x00000000 196609 nobody 600 1 0x00000000 262146 nobody 600 1 0x00000000 294915 nobody 600 1 0x00000000 327684 nobody 600 1 0x00000000 491525 nobody 600 1 |
Semaphore Arrays下面每一行代表一个信号量集
perms对应信号集的权限
nsems对应信号量集中信号量个数
2、消息队列Message Queues
msqid对应创建队列时得到的id值
messages对应当前队列中存在的消息个数
used-bytes对应当前所有消息占用的字节数,所以单个消息字节数=总字节数/消息个数;如果消息个数不为零则说明消息队列中有消息未及时处理,可以判断是否存在队列阻塞风险。
------------------------------------------------------------------------------------------------------------
ipcs -p 可以得到共享内存、消息队列相关进程之间的消息
[root@test ~]# ipcs -p ------ Message Queues PIDs -------- msqid owner lspid lrpid ------ Shared Memory Creator/Last-op PIDs -------- shmid owner cpid lpid 32768 root 12624 6914 |
Message Queues PIDs中的msqid对应ipcs -a中的消息队列id,根据id则可以获取lspid、lrpid消息;
lspid代表最近一次向消息队列中发生消息的“进程号”
lrpid代表最近一次从消息队列中读取消息的“进程号”。
注意:此处的进程号是弱进程号,既它有可能代表的是线程号,如果进程中是起的线程对消息队列发送、接收消息,则此处pid对应的均是线程号。可以采用ps -AL | grep pid来查找该线程对应的进程id。
------------------------------------------------------------------------------------------------------------
ipcs -u 查看各个资源的使用总结信息
[root@test ~]# ipcs -u ------ Messages Status -------- allocated queues = 0 used headers = 0 used space = 0 bytes ------ Shared Memory Status -------- segments allocated 1 pages allocated 129 pages resident 129 pages swapped 0 Swap performance: 0 attempts 0 successes ------ Semaphore Status -------- used arrays = 2 allocated semaphores = 14 |
可以看到使用的信号量集的个数、信号量个数,以及消息队列中当前使用的消息个数总数、占用的空间字节数。
------------------------------------------------------------------------------------------------------------
ipcs -l 查看各个资源的系统限制信息,可以看到系统允许的最大信号量集及信号量个数限制,最大的消息队列中消息个数等信息。
[root@test ~]# ipcs -l ------ Messages Limits -------- max queues system wide = 7578 max size of message (bytes) = 8192 default max size of queue (bytes) = 16384 ------ Shared Memory Limits -------- max number of segments = 4096 max seg size (kbytes) = 18014398509465599 max total shared memory (kbytes) = 18014398442373116 min seg size (bytes) = 1 ------ Semaphore Limits -------- max number of arrays = 128 信号量集最大个数 max semaphores per array = 250 每个信号量集中信号量最大个数 max semaphores system wide = 32000 所有信号量最大个数 max ops per semop call = 32 每个信号量同时被调用的次数 semaphore max value = 32767 |