Как найти ограничения общей памяти и семафоров в Solaris, HP-UX и AIX?

Я использую следующие команды, чтобы найти ограничения общей памяти и семафоров в 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. Я много искал в Интернете, но так и не нашел подходящего решения. Поделитесь своими идеями, чтобы получить эту благодарность заранее.


person Kavi Chinna    schedule 24.04.2015    source источник
comment
Вы пишете сценарий оболочки или вам нужно решение на C? В любом случае, использование sysctls в Linux может быть проще: т.е. 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
comment
Да, я пишу сценарий оболочки   -  person Kavi Chinna    schedule 24.04.2015
comment
Я разместил свои знания о Linux и Solaris. Раньше я делал это в AIX, но это было давно, поэтому я сделал свой пост вики, надеюсь, кто-то обновит мой пост в AIX и HP-UX.   -  person myaut    schedule 24.04.2015


Ответы (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 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

AIX

К сожалению, в AIX нет команд, которые выводили бы требуемые ограничения IPC. По крайней мере, ничего из того, что я когда-либо находил ... Обычно я ссылаюсь на this table и примите наименьший общий знаменатель для поддерживаемых мной версий AIX.

Если бы мне нужно было программно определять ограничения в оболочке, я бы просто написал функцию / сценарий-оболочку, инкапсулирующую логику, указанную в таблице, на основе обнаруженной версии AIX.

person CoreyStup    schedule 25.04.2015