Разделяемая Память и Семафоры
На большинстве 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:
| SHMMAX | 4294967295 |
| SHMMIN | 1 |
| SHMMNI | 100 |
| SHMSEG | 10 |
Semaphores:
| SEMMNI | 100 |
| SEMMSL | Set to 10 plus the largest PROCESSES parameter of any Oracle database on system. |
| SEMMNS | Set to the sum of the PROCESSES parameter for each Oracle database, adding
the largest one twice, then add an additional 10 for each database. |
| SEMOPM | 100 |
| SEMVMX | 32767 |
Формат файла /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 - идентификатор
семафорного набора