В Solaris 10 на смену переменным в /etc/system, регулирующим семафоры и shared memory (shm* и sem*) пришли проекты - один из способов динамического управления ресурсами, в том числе и IPC. Конфигурация выполняется двумя утилитами: projmod (для изменения конфигурации) и prctl (для настройки на лету) и сохраняется в файл /etc/project. К сожалению настройка проектов слабо отражена в документации по установке Oracle, поэтому я советую вам обратится к блогу Андрея Евдокимова: blogs.sun.com/ave/entry/correct_way_to_configure_solaris
Потребителем Shared Memory является SGA - System Global Area, содержащая различные промежуточные буферы для СУБД, работающей в режиме Shared Server. Не буду вдаваться в подробности насчет SGA, много полезной информации по ней вы можете найти в замечательной презентации SGA Internals:
www.juliandyke.com/Presentations/SGAInternals.ppt
Конфигурация размера SGA выполняется переменными SGA_MAX_SIZE или SGA_TARGET, или конфигурацией непосредственно буферов. После того, как я выставил размер Shared Memory в проекте равным SGA_TARGET (6G) - база оказалась стартовать:
SQL> startup;
ORA-27102: out of memory
SVR4 Error: 22: Invalid argument
В alert log содержались следующие строки:
WARNING: EINVAL creating segment of size 0x0000000180004000
fix shm parameters in /etc/system or equivalent
Таким образом при старте базы Oracle потребовал памяти больше, чем указано в ограничении project.max-shm-memory. Это же подтверждается и утилитой truss (выполнялось на другой базе):
# truss -f -t shmget -p <PID процесса sqlplus>
...
757: shmget(-1801673040, 2147491840, 0640|IPC_CREAT|IPC_EXCL) = 13 << 2 Гигабайта + 8 Кб
...
В тоже время как sqlplus говорил только о выделенных 2 гигабайтах:
SQL> startup
ORACLE instance started.
Total System Global Area 2147483648 bytes << 2 Гигабайта
Fixed Size 1980032 bytes
Variable Size 486541696 bytes
Database Buffers 1644167168 bytes
Redo Buffers 14794752 bytes
Database mounted.
Database opened.
Как оказалось, кроме вышеуказанных IPC-буферов, Oracle требует несколько страниц на skgm overhead - набор архитектуро-зависимых структур.
Чтобы выяснить структуру Oracle IPC можно выполнить сооответствующую трассировку:
SQL> oradebug setmypid
Statement processed.
SQL> oradebug ipc
Information written to trace file.
SQL> oradebug tracefile_name
/oracle/admin/paw/udump/paw_ora_24158.trc
SQL> ^D
Указанный файл /oracle/admin/paw/udump/paw_ora_24158.trc содержит всю информацию по Oracle IPC. Сложив поля Total size получим размер сегмента. Округлив его согласно размеру страницы и получим искомое 0x0000000180004000 (это значение также указано в Segment size все того же файла).
Таким образом из-за особенностей реализации Oracle на Solaris требуется выставлять значение project.max-shm-memory исходя из требований Oracle, а не конфигурации init-файла. Устанавливаем новые значения в /etc/project и меняем конфигурацию (у меня размер skgm overhead составил 16 килобайт):
# prctl -n project.max-shm-memory -t privileged -x -i project user.oracle
# prctl -n project.max-shm-memory -t privileged -s -v 6291472K -i project user.oracle
# projmod -sK "project.max-shm-memory=(privileged,6291472K,deny)" user.oracle
После этого база нормально стартует.