我使用以下命令来查找 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
中设置。您可以从内核获取实际值,但仅当加载 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
修饰符,它以十六进制转储 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/