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

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

最佳答案

尝试和错误

最简单、更稳健的方法是探测是否可以分配这些资源,即:

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 修饰符,它以十六进制转储 8 字节。在 32 位版本上,您可能需要 /X 来转储 4 字节。

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                                 - 

特权值就是您所寻求的

关于solaris - 如何在 Solaris、HP-UX 和 AIX 中查找共享内存限制和信号量限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29841074/

相关文章:

linux - 从 GNU 到 solaris 的等效日期

java - Solaris 10 中的 Java 启动速度非常慢

linux - 用于验证多播网络设置的简单 ehcache 程序

unix - 在unix shell中,如何将昨天的日期放入变量中?

c - C 中的任何系统调用以更改 HP-UX 中文件的权限

c - Srcpy() 在 Solaris 中破坏了复制的字符串,但在 Linux 中没有

python - 删除 CSV UNIX 中双引号之间的\n

shell - 无法从 UNIX 上的命令文本输出文件中删除空白或空白区域

linux - LINUX bash 中的 typeset -l 和 typeset -u 是否等效?

jakarta-ee - 在 Solaris 上的 tomcat 中读取对 ROOT/parent 目录的访问权限