[Linux]ipcs,ipcm 命令详解

多进程间通信的技术手段包括共享内存、消息队列、信号量等等,Linux系统下的ipcs是一个极好的工具,可以查看当前系统以上三项的使用情况,从而利于定位多进程通信中出现的通信问题。

root@doufupic11a ~]# 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命令可以查看当前使用的共享内存、消息队列及信号量所有信息,对于该选项对应的结果,介绍以下几个部分:
1、信号量在创建时分信号量集和信号量的概念,该命令的查询结果中,Semaphore Arrays下面每一行代表一个信号量集,其中perms对应信号量集的权限,nsems对应信号量集中信号量的个数,对于信号量集的创建方法可以查询semctl相关的函数使用方法。
2、对于消息队列Message Queues而言,可以看到msqid对应创建队列时得到的id值,从messages中可以看到当前队列中存在的消息个数,从used_bytes中可以看到当前所有消息占用的字节数,所以单个消息的字节数则为总字节数除以消息数,同时如果消息个数不为零则说明消息队列中的消息没有得到及时处理,可以据此判断是否存在队列阻塞的风险。
[root@doufupic11a ~]# ipcs -a

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00004dc4 65536      sapadm     760        40141728   1                       
0x00004dbe 98305      root       777        637620     1                       
0x00000000 655362     root       600        524288     2          dest         
0x00000000 557059     root       600        524288     2          dest         
0x00000000 753668     root       600        16777216   2          dest         
0x00000000 786437     root       600        524288     2          dest         
0x00000000 819206     root       600        524288     2          dest         

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x0000752f 98304      sapadm     777        5         
ipcs -p命令可以得到与共享内存、消息队列相关进程之间的消息。对于此选项,有如下介绍:
1、从该命令结果中可以看到Message Queues PIDs中的msqid既对应上条命令结果中的消息队列id,根据id则可以获取到lspid、lrpid消息,其中lspid代表最近一次向消息队列中发送消息的“进程号”,lrpid对应最近一次从消息队列中读取消息的“进程号”。但请注意:此处的进程号是弱进程号,既它有可能代表的是线程号,如果进程中是起的线程对消息队列发送、接收消息,则此处pid对应的均是线程号。可以采用ps -AL | grep pid来查找该线程对应的进程id。
[root@doufupic11a ~]# ipcs -p

------ Message Queues PIDs --------
msqid      owner      lspid      lrpid     

------ Shared Memory Creator/Last-op PIDs --------
shmid      owner      cpid       lpid      
65536      sapadm     13321      13321     
98305      root       13407      23585     
655362     root       22847      13297     
557059     root       22812      13297     
753668     root       23061      23075     
786437     root       22584      13297     
819206     root       22847      13297     

ipcs -u命令可以查看各个资源的使用总结信息,其中可以看到使用的信号量集的个数、信号量的个数,以及消息队列中当前使用的消息个数总数、占用的空间字节数

[root@doufupic11a ~]# ipcs -u

------ Messages Status --------
allocated queues = 0
used headers = 0
used space = 0 bytes

------ Shared Memory Status --------
segments allocated 7
pages allocated 14565
pages resident  10623
pages swapped   0
Swap performance: 0 attempts     0 successes

------ Semaphore Status --------
used arrays = 1
allocated semaphores = 5

 

 ipcs -l命令可以查看各个资源的系统限制信息,可以看到系统允许的最大信号量集及信号量个数限制、最大的消息队列中消息个数等信息。
1、从中可以看到以下信号量的限制信息,其中信号量集最大个数为128、每个信号量集中信号量最大个数为250、所有信号量最大个数为32000、每个信号量可以被同时调用的次数为32,这些参数是linux系统下的默认参数,对于限制参数也可以做一定程度的优化,会有一定程度上性能的提升,具体优化方法可以搜索相关帖子。

 

[root@doufupic11a~]# ipcs -l

------ Messages Limits --------
max queues system wide = 32768
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

------ Shared Memory Limits --------
max number of segments = 32768
max seg size (kbytes) = 18014398509481983
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

 对应的参数文件/etc/sysctl.conf

cat /etc/sysctl.conf|grep -v ^#|grep -v ^$
fs.file-max=20000000
fs.aio-max-nr=18446744073709551615
vm.memory_failure_early_kill=1
kernel.shmmax=18446744073709551615
kernel.shmmni=32768
vm.max_map_count=2147483647

 

ipcrm

ipcrm -h

Usage:
 ipcrm [options]
 ipcrm <shm|msg|sem> <id> [...]

Options:
 -m, --shmem-id <id>        remove shared memory segment by shmid
 -M, --shmem-key <key>      remove shared memory segment by key
 -q, --queue-id <id>        remove message queue by id
 -Q, --queue-key <key>      remove message queue by key
 -s, --semaphore-id <id>    remove semaphore by id
 -S, --semaphore-key <key>  remove semaphore by key
 -a, --all[=<shm|msg|sem>]  remove all
 -v, --verbose              explain what is being done

 -h, --help     display this help and exit
 -V, --version  output version information and exit

 

 




posted on 2020-01-21 15:48  InnoLeo  阅读(1793)  评论(0编辑  收藏  举报