我使用以下命令查找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中获得此输出。我在网上搜索了很多,但是我找不到好的解决方案。分享你的想法,提前得到这句感谢。
发布于 2015-04-24 19:27:04
试错
最简单和更健壮的方法是探测您是否可以分配这些资源,即:
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
18446744073709551615Solaris 10之前版本
在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位版本中,您可能需要转储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值就是您要寻找的值
发布于 2015-04-26 06:54:43
AIX
不幸的是,AIX没有任何命令可以输出您正在寻找的IPC限制。至少我没找到过..。我通常指的是this table,并假定我支持的AIX版本的公分母是最低的。
如果我需要以编程方式检测shell中的限制,我只需编写一个包装器函数/脚本,根据检测到的AIX版本封装表中列出的逻辑。
https://stackoverflow.com/questions/29841074
复制相似问题