Методом проб и ошибок
Самый простой и надежный метод - проверить, можете ли вы выделить эти ресурсы, а именно:
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 Database делает это.
Linux
В Linux эти ограничения обрабатываются через sysctl
:
$ /usr/sbin/sysctl kernel.shmmax
kernel.shmmax = 18446744073709551615
$ /usr/sbin/sysctl kernel.sem
kernel.sem = 250 256000 32 1024
^ SEMMSL ^ SEMMNI
Вы можете получить параметры sysctl из /proc/sys
:
$ cat /proc/sys/kernel/sem
250 256000 32 1024
$ cat /proc/sys/kernel/shmmax
18446744073709551615
Солярис до 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
Обратите внимание, что я использовал модификатор /J
в mdb, который выгружает 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 -
priviliged
ценностей - это то, что вы ищете
person
Community
schedule
24.04.2015
cat /proc/sys/kernel/shmmax
предоставит вам максимальный сегмент разделяемой памяти. Говоря о Solaris, Solaris 10 представляет проекты, поэтому решения для ›= 10 и‹ 10 будут разными. В любом случае, может быть проще метод проб и ошибок:if error in shmget(100 GB) than shmmax is not enough
- person myaut   schedule 24.04.2015