Unix/linux下的共享内存、信号量、队列信息管理
在unix/linux下,经常有因为共享内存、信号量,队列等共享信息没有干净地清除而引起一些问题。
查看共享信息的内存的命令是:ipcs [-m|-s|-q]。
默认会列出共享内存、信号量,队列信息
-m列出共享内存
-s列出共享信号量
-q列出共享队列
清除命令是:ipcrm [-m|-s|-q] id。
-m 删除共享内存
-s删除共享信号量
-q删除共享队列。
案例分析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[oracle@trade_as02 ~]$ ipcs -a
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x30024289
32768
futures
777
528384
1
0xca2fd414
491521
oracle
640
1730150400
16
------ Semaphore Arrays --------
key semid owner perms nsems
0x00028009
0
futures
666
1
0x0002800c
32769
futures
666
1
0x30024003
262146
futures
777
3
0x3002428a
294915
futures
777
2
0x3002428b
327684
futures
777
2
0x3002428c
360453
futures
777
2
0x3002428d
393222
futures
777
2
0x3002428e
425991
futures
777
2
0x52dff7d0
3964936
oracle
640
151
0x52dff7d1
3997705
oracle
640
151
0x52dff7d2
4030474
oracle
640
151
0x52dff7d3
4063243
oracle
640
151
0x52dff7d4
4096012
oracle
640
151
------ Message Queues --------
key msqid owner perms used-bytes messages
|
共享内存段有时不能马上删除,需使用这个内存段的所有进程向OS发送detach命令时才有释放,此时可以考虑删除进程使用的信号量,帮助释放共享内存段
相关知识:信号量、资源释放、ipcs、ipcrm
信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况;共享内存是运行在同一台机器上的进程间通信最快的方式,因为数据不需要在不同的进程间复制。通常由一个进程创建一块共享内存区,其余进程对这块内存区进行读写。在Linux系统下 ,常用的方式是通过shmXXX函数族来实现利用共享内存进行存储的。如Shmget,类似于 malloc函数
ipcs可用来显示当前Linux系统中的共享内存段、信号量集、消息队列等的使用情况。
1
2
3
4
5
|
命令示例:
ipcs -a或ipc 显示当前系统中共享内存段、信号量集、消息队列的使用情况;
ipcs -m 显示共享内存段的使用情况;
ipcs -s 显示信号量集的使用情况;
ipcs -q 显示消息队列的使用情况;
|
ipcrm可用来删除对应的共享内存段、信号量、消息队列;
1
2
3
4
5
6
7
8
9
|
命令示例:
ipcrm -s semid 删除对应的信号量集
ipcrm -m shmid 删除对应的共享内存段
ipcrm -q msqid 删除对应的消息队列
ipcrm本身只能实现单个资源的删除,利用以下命令可实现批量删除:
1.
ipcs -s|grep 用户名|cut -d
" "
-f2|xargs -n1 ipcrm -s
2.
ipcs -s|awk
'/用户名/{print $2}'
|xargs -n1 ipcrm -s
3.
ipcs -s|awk
'/用户名/{system("ipcrm -s "$2)}'
4.
for
i
in
echo `ipcs|grep 用户名|cut -d
" "
-f2`; do ipcrm -s $i; done
|
更深入的了解:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
Oracle 内存段参数设定:
[root@rh6 ~]# sysctl -p
net.ipv4.ip_forward =
0
net.ipv4.conf.default.rp_filter =
1
net.ipv4.conf.default.accept_source_route =
0
kernel.sysrq =
0
kernel.core_uses_pid =
1
net.ipv4.tcp_syncookies =
1
error:
"net.bridge.bridge-nf-call-ip6tables"
is an unknown key
error:
"net.bridge.bridge-nf-call-iptables"
is an unknown key
error:
"net.bridge.bridge-nf-call-arptables"
is an unknown key
fs.aio-max-nr =
1048576
fs.file-max =
6815744
kernel.shmall =
2097152
kernel.shmmax =
536870912
kernel.shmmni =
4096
kernel.sem =
250
32000
100
128
net.ipv4.ip_local_port_range =
9000
65500
net.core.rmem_default =
262144
net.core.rmem_max =
4194304
net.core.wmem_default =
262144
net.core.wmem_max =
1048586
|
本文转自 客居天涯 51CTO博客,原文链接:http://blog.51cto.com/tiany/1599364,如需转载请自行联系原作者