Home  |  Administration  |  SQL  |  Tuning  |  Miscellaneous  |

Разделяемая Память и Семафоры

На большинстве UNIX-платформ для межпроцессного взаимодействия Oracle использует разделяемую память и семафоры. Поэтому еще до создания базы данных необходимо выставить корректные значения параметров, определяющих конфигурацию ядра в части семафоров и разделяемой памяти.

Shared Memory

SHMMIN Минимальный размер (в байтах) сегмента разделяемой памяти, поддерживаемый системой (значение по умолчанию - 1 байт). Изменять его не имеет особого смысла (по крайней мере я не знаю таких причин)
SHMMAX Максимальный размер (в байтах) сегмента разделяемой памяти, поддерживаемый системой. Этот параметр задает только максимально допустимый предел и не отражает реальное количество разделяемой памяти, которое будет отведено по запросу прикладной программы через системный вызов shmget(2). Большое значение SHMMAX никак не влияет на потребление ресурсов памяти ядра, поэтому этот параметр обычно устанавливают в максимально допустимое значение (4GB для большинства 32-разрядных платформ)
SHMMNI Максимальное число (идентификаторов) сегментов разделяемой памяти, поддерживаемое системой. Значение по умолчанию - 100. Для каждого сегмента разделяемой памяти система резервирует 200 байт памяти ядра для вспомогательных структур данных, где содержится описательная информация о сегменте. Обычно сегменты разделяемой памяти настраивают таким образом, чтобы каждый экземпляр Oracle работал только с одним сегментом разделяемой памяти. Тогда минимальное значение SHMMNI будет равно общему числу экземпляров Oracle в системе.
SHMSEG Максимальное число сегментов разделяемой памяти, которое может маппировать процесс.
SHMLBA Контролирует выбор ОС начального адреса сегмента разделяемой памяти. Адрес должен быть кратен этому параметру. Если не оговорено противное, изменять значение по умолчанию не стоит.

В зависимости от значения параметра SHMMAX в системе, Oracle будет пытаться разместить SGA в одном или нескольких сегментах разделяемой памяти. В последнем случае Oracle будет последовательно пытаться разместить сегменты 'непрерывно', один за другим без пропусков в адресном пространстве, и если попытка неудачна, то выделить сегменты в произвольном порядке (c поправкой на параметр SHMLBA). Если значение SHMMAX больше размера SGA (см. также Tip#1 'Как узнать размер SGA?'), то SGA целиком будет размещена в одном сегменте разделяемой памяти. Если значение параметра SHMMAX меньше размера SGA, Oracle будет пытаться алоцировать несколько сегментов разделяемой памяти.

Semaphores

SEMMNI Число идентификаторов семафорных наборов в системе. Определяет максимальное число семафорных наборов. Значение параметра должно быть не ниже числа экземпляров Oracle в системе при условии, что каждый инстанс обслуживается семафорами в рамках одного набора.
SEMMSL Максимальное число семафоров, разрешенное системой в пределах одного набора семафоров. Как правило, должен выставляться так, чтобы покрывать параметр PROCESSES, если экземпляр должен обслуживаться одним набором семафоров.
SEMMNS Число семафоров в системе. Каждый серверный процесс требует один семафор. Если на сервере установлено несколько баз данных, то SEMMNS должен быть установлен как сумма параметров PROCESSES всех инстансов Oracle.
SEMMNU Число undo-структур, которые используются для восстановления структур данных семафоров при гибели процесса. Выставляется в максимальное число одновременных процессов в статусе runnable в системе.

Рекомендуемые начальные значения параметров (Oracle8i Installation Guide Release 3(8.1.7): For SUN SPARC Solaris)

Shared Memory:

SHMMAX4294967295
SHMMIN1
SHMMNI100
SHMSEG10

Semaphores:

SEMMNI100
SEMMSLSet to 10 plus the largest PROCESSES parameter of any Oracle database on system.
SEMMNSSet to the sum of the PROCESSES parameter for each Oracle database, adding the largest one twice, then add an additional 10 for each database.
SEMOPM100
SEMVMX32767

Формат файла /etc/system (Solaris):

set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmax=4294967295
set shmsys:shminfo_shmmni=200
set shmsys:shminfo_shmseg=25
set semsys:seminfo_semmns=500
set semsys:seminfo_semmni=70

Посмотреть текущие значения параметров (Solaris): sysdef | tail -25

/export/home/ora817>
/export/home/ora817>sysdef | tail -25
*
* IPC Semaphores
*
    10  entries in semaphore map (SEMMAP)
    70  semaphore identifiers (SEMMNI)
   500  semaphores in system (SEMMNS)
    30  undo structures in system (SEMMNU)
   150  max semaphores per id (SEMMSL)
    10  max operations per semop call (SEMOPM)
    10  max undo entries per process (SEMUME)
 32767  semaphore maximum value (SEMVMX)
 16384  adjust on exit max value (SEMAEM)
*
* IPC Shared Memory
*
4294967295      max shared memory segment size (SHMMAX)
     1  min shared memory segment size (SHMMIN)
   200  shared memory identifiers (SHMMNI)
    25  max attached shm segments per process (SHMSEG)

Посмотреть текущие наборы семафоров в системе (Solaris): ipcs -sb

/export/home/ora817>
/export/home/ora817>ipcs -sb
IPC status from  as of Tue Mar 13 11:11:01 GMT 2001
T         ID      KEY        MODE        OWNER    GROUP NSEMS
Semaphores:
s     196608   0xc37e6b6  --ra-r-----   ora816      dba   202
s          1   0xc37e6b7  --ra-r-----   ora816      dba   202
s          2   0xc37e6b8  --ra-r-----   ora816      dba   202
s     458756   0xd5a24734 --ra-r-----   ora817      dba    54
s     196613   0xd8a027b4 --ra-r-----   ora817      dba   152
s          6   0xd8a027b5 --ra-r-----   ora817      dba   152
s          7   0xd8a027b6 --ra-r-----   ora817      dba   152
/export/home/ora817>

Иногда случается, что при падении экземпляра семафоры остаются блокированными. При этом вполне реальна ситуация, когда повторный запуск экземпляра не будет успешным из-за нехватки семафоров. В этом случае необходимо удалить соответствующие наборы командой 'ipcrm -s semsetID' , где semsetID - идентификатор семафорного набора

Last Update: October 11, 2007 18:33:32