ipcs与ipcrm是两个很不错的命令,主要在查看共享内存、信号量;以及在程序调试时,清除相关的共享内存及信号量
ipcs:check the shared memory allocation on a system
ipcrm:manually deallocate shared memory on a system
ipcs命令的文档帮助:
[root@wangerxiao ~]# ipcs --help
Usage:
ipcs [resource ...] [output-format]
ipcs [resource] -i <id>
Options:
-i, --id <id> print details on resource identified by id
Resource options:
-m, --shmems shared memory segments 输出有关共享内存(shared memory)的信息
-q, --queues message queues 输出有关信息队列(message queue)的信息
-s, --semaphores semaphores 输出有关“遮断器”(semaphore)的信息
-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命令的输出:
[root@wangerxiao ~]# ipcs
------ Message Queues --------
key msqid owner perms used-bytes messages
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 65536 root 600 524288 2 dest
0x00000000 163841 root 600 4194304 2 dest
------ Semaphore Arrays --------
key semid owner perms nsems
0x00105b6b 32768 root 600 1
0x00105b6c 65537 root 666 1
第二列是共享内存的编号shmid;
第三列就是创建的用户owner;
第四列就是权限perms;
第五列为创建的大小bytes;
第六列为连接到共享内存的进程数nattach;
第七列是共享内存的状态status。其中显示“dest”表示共享内存段已经被删除,但是还有用户在使用它,当该段内存的mode字段设置为SHM_DEST时就会显示“dest”。当用户调用shmctl的IPC_RMID时,内存先查看多少个进程与这个内存关联着,如果关联数为0,就会销毁这段共享内存,否者设置这段内存的mod的mode位为SHM_DEST,如果所有进程都不用则删除这段共享内存。
ipcrm用于删除ipc(清除共享内存信息)
ipcrm命令文档:
[root@wangerxiao ~]# ipcrm --help
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
移除一个消息对象。或者共享内存段,或者一个信号集,同时会将与ipc对象相关链的数据也一起移除。当然,只有超级管理员,或者ipc对象的创建者才有这项权利啦
ipcrm -M shmkey 移除用shmkey创建的共享内存段
ipcrm -m shmid 移除用shmid标识的共享内存段
ipcrm -Q msgkey 移除用msqkey创建的消息队列
ipcrm -q msqid 移除用msqid标识的消息队列
ipcrm -S semkey 移除用semkey创建的信号
ipcrm -s semid 移除用semid标识的信号
栗子:
ipcrm -m 501for i in `ipcs |grep oracle|awk '{print $2}'`
do
ipcrm -m $i
ipcrm -s $i
done
ps -ef|egrep "ora_|asm_"|grep -v grep |grep -v crs|awk '{print $2}' |xargs kill -9
共享内存大小修改
使用下面的命令查看共享内存的大小:
# cat /proc/sys/kernel/shmmax
修改共享内存大小:
临时修改:在root用户下执行# echo 268435456 > /proc/sys/kernel/shmmax把共享内存大小设置为256MB;
永久修改:在root用户下修改/etc/rc.d/rc.local文件,加入下面一行:
echo 268435456 > /proc/sys/kernel/shmmax
即可每次启动时把共享内存修改为256MB。