null

Oracle SGA и Solaris Projects - выставляем правильное значение Shared Memory.

В 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


После этого база нормально стартует.

 

 

К списку статей

 

Интересуюсь по большей части системным анализом программного обеспечения: поиском багов и анализом неисправностей, а также системным программированием (и не оставляю надежд запилить свою операционку, хотя нехватка времени сказывается :) ). Программированием увлекаюсь с 12 лет, но так уж получилось, что стал я инженером.

Основная сфера моей деятельности связана с поддержкой Solaris и оборудования Sun/Oracle, хотя в последнее время к ним прибавились технологии виртуализации (линейка Citrix Xen) и всякое разное от IBM - от xSeries до Power. Учусь на кафедре Вычислительной Техники НИУ ИТМО.

See you...out there!

http://www.facebook.com/profile.php?id=100001947776045
https://twitter.com/AnnoyingBugs

Ничего не найдено. n is 0