我正在使用以下命令在Linux中查找共享内存限制和信号量限制。
要查找共享内存限制,我使用了以下命令:
ipcs -lm
我得到了以下输出:
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4194303
max total shared memory (kbytes) = 1073741824
min seg size (bytes) = 1
要查找信号量限制,我使用了以下命令:
ipcs -ls
我得到了以下输出:
------ 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
我不知道如何在Solaris,HP-UX和AIX中获得此输出。我在互联网上搜索了很多,但我无法得到很好的解决方案。分享您的想法以提前获得此感谢。
答案 0 :(得分:2)
最简单,最稳健的方法是探测是否可以分配这些资源,即:
int shmid = shmget(key, LARGE_BUFFER_SIZE, 0644 | IPC_CREAT);
void* data = shmat(shmid, NULL, 0);
if (data == (char *)(-1)) {
/* Log an error and exit */
}
即。 Oracle数据库就是这样做的。
在Linux上,这些限制是通过sysctl
处理的:
$ /usr/sbin/sysctl kernel.shmmax
kernel.shmmax = 18446744073709551615
$ /usr/sbin/sysctl kernel.sem
kernel.sem = 250 256000 32 1024
^ SEMMSL ^ SEMMNI
您可以从/proc/sys
获取sysctl参数:
$ cat /proc/sys/kernel/sem
250 256000 32 1024
$ cat /proc/sys/kernel/shmmax
18446744073709551615
在Solaris之前使用了10个内核参数。它们设置在/etc/system
中。您可以从内核获取实际值,但仅在加载shmsys
和semsys
模块时(Solaris在第一次系统调用时延迟加载它们):
# modload /kernel/sys/sparcv9/semsys
# modload /kernel/sys/sparcv9/shmsys
# echo 'shminfo_shmmax/J' | mdb -k
shminfo_shmmax:
shminfo_shmmax: 800000
# echo 'seminfo_semmni/J' | mdb -k
seminfo_semmni:
seminfo_semmni: a0000003c
请注意,我在mdb中使用了/J
修饰符,它在hexademical中转储了8个字节。在32位版本中,您可能需要转储4个字节的/X
。
Solaris 10引入了一些项目,允许使用用户甚至进程的粒度设置这些限制。使用prctl
获取适当的限制:
# prctl -n project.max-shm-memory $$
process: 3451: bash
NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT
project.max-shm-memory
privileged 474MB - deny -
system 16,0EB max deny -
# prctl -n project.max-sem-ids $$
process: 3451: bash
NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT
project.max-sem-ids
privileged 128 - deny -
system 16,8M max deny -
# prctl -n process.max-sem-nsems $$
process: 3451: bash
NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT
process.max-sem-nsems
privileged 512 - deny -
system 32,8K max deny -
priviliged
值是您寻求的
答案 1 :(得分:0)
不幸的是,AIX没有任何可以输出您正在寻找的IPC限制的命令。 至少没有我发现过的...... 我通常会引用this table并假设我支持的AIX版本的最小公分母。
如果我需要以编程方式检测shell中的限制,我只需编写一个封装函数/脚本,根据检测到的AIX版本封装表中列出的逻辑。