中间件中我们常通过启动多个进程来提高其运行的稳定性,而共享内存、消息队列、信号量等技术保证了多进程间的通信。
在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
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
————————————————
此外还可以通过以下三条命令查看消息队列、信号量、共享内存的信息。
cat /proc/sysvipc/msg
cat /proc/sysvipc/sem
cat /proc/sysvipc/shm
****************************************************************************************************************************************
$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x000004d2 0 root 600 20600 5
0x00000064 32769 root 666 51200 11
0x00000d80 65538 root 600 20600 0
------ Semaphore Arrays --------
key semid owner perms nsems
0x00000067 0 root 666 1
0x00000065 32769 root 666 1
0x00000066 65538 root 666 20
0xec141972 98307 root 666 1
0x020134ea 131076 root 666 1
0x040134ea 163845 root 666 1
------ Message Queues --------
key msqid owner perms used-bytes messages
0x000004d2 0 root 600 0 0
0x00000068 32769 root 666 0 0
0x00001634 65538 root 600 0 0
0x00000d80 98307 root 600 0 0
0x611419a3 163844 root 666 0 0
0x681419a4 229381 root 666 0 0
0x611418e9 294918 root 666 0 0
0x611418ea 360455 root 666 0 0
0x611418eb 425992 root 666 0 0
$ ipcs -s -i 65538
Semaphore Array semid=65538
uid=0 gid=0 cuid=0 cgid=0
mode=0666, access_perms=0666
nsems = 20
otime = Wed Sep 25 01:36:25 2019
ctime = Wed Sep 25 01:19:04 2019
semnum value ncount zcount pid
0 0 1 0 1483
1 0 0 0 1483
2 0 0 0 23166
3 0 0 0 1967
4 0 0 0 1967
5 0 0 0 1967
6 0 0 0 1967
7 0 0 0 1967
8 0 0 0 1967
9 1 0 0 1483
10 0 0 0 11606
11 1 0 0 1483
12 1 0 0 1483
13 1 0 0 1483
14 0 0 0 1483
15 0 0 0 1483
16 0 0 0 1483
17 0 0 0 1483
18 0 0 0 1483
19 0 0 0 1483
$ ipcs -q -i 32769
Message Queue msqid=32769
uid=0 gid=0 cuid=0 cgid=0 mode=0666
cbytes=0 qbytes=16384 qnum=0 lspid=23166 lrpid=1700
send_time=Wed Sep 25 01:37:10 2019
rcv_time=Wed Sep 25 01:37:10 2019
change_time=Wed Sep 25 00:19:09 2019
********************************************************************************************************************************************
ipcrm
1. 命令功能
通过指定ID删除删除IPC资源,同时将与IPC对象关联的数据一并删除,只有超级用户或IPC资源创建者能够删除
2. 使用方法
ipcrm -M shmkey
移除用shmkey创建的共享内存段
ipcrm -m shmid
移除用shmid标识的共享内存段
ipcrm -S semkey
移除用semkey创建的信号量
ipcrm -s semid
移除用semid标识的信号量
ipcrm -Q msgkey
移除用msgkey创建的消息队列
ipcrm -q msgid
移除用msgid标识的消息队列