共享内存、消息队列、信号量之ipcs命令详解

中间件中我们常通过启动多个进程来提高其运行的稳定性,而共享内存、消息队列、信号量等技术保证了多进程间的通信。

在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标识的消息队列

发布了9 篇原创文章 · 获赞 1 · 访问量 6692

猜你喜欢

转载自blog.csdn.net/u014426028/article/details/103264889