如何在Solaris,HP-UX和AIX中查找共享内存限制和信号量限制?

时间:2015-04-24 07:18:06

标签: solaris aix hp-ux

我正在使用以下命令在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中获得此输出。我在互联网上搜索了很多,但我无法得到很好的解决方案。分享您的想法以提前获得此感谢。

2 个答案:

答案 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

在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

10之前的Solaris

在Solaris之前使用了10个内核参数。它们设置在/etc/system中。您可以从内核获取实际值,但仅在加载shmsyssemsys模块时(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及更高版本

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

不幸的是,AIX没有任何可以输出您正在寻找的IPC限制的命令。 至少没有我发现过的...... 我通常会引用this table并假设我支持的AIX版本的最小公分母。

如果我需要以编程方式检测shell中的限制,我只需编写一个封装函数/脚本,根据检测到的AIX版本封装表中列出的逻辑。

相关问题