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

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

在Linux系统中通过自带的ipcs命令工具,可查看当前系统中以上三项的使用情况,从而利于定位多进程通信中出现的通信问题。

ipcs -h查看该命令的使用帮助

[root@test ~]# ipcs -h

Usage:
 ipcs [resource ...] [output-format]
 ipcs [resource] -i


Options:
 -i, --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





你可能感兴趣的:(Linux运维)