[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相关的函数使用方法。
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。
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
每天进步一点点,多思考,多总结
版权声明:本文为CNblog博主「zaituzhong」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。