Да, я даже и не заметил спросонья, а скажите, откуда вообще рекомендация использования /USERVA такого размера в применении к Ораклу?
отсюда
Oracle + 32bit Windows
Использование больших объемов оперативной памяти
Симптомы
- ORA-12500 / TNS-12500
- TNS:listener failed to start a dedicated server process
- ORA-12540 / TNS-12540 TNS:internal limit restriction exceeded
- NT-8 Not enough storage is available to process this command
- skgpspawn failed:category = ....
- ORA-27142 could not create new process
- ORA-27143 OS system call failure
- ORA-4030 out of process memory when trying to allocate ....
Диагноз
Как известно, в Windows экземпляр Oracle выполняется как единый процесс, все внутренние процессы которого выполняются в виде нитей внутри одного процесса oracle.exe. Соответственно, объем адресуемой памяти ограничен для экземпляра 2-мя гигабайтами в стандартной конфигурации на 32-битной платформе.
Лечение
1. Заставить Windows отдать процессам 3Гб (т.н. 4G Tuning).
Условия:
- ОС: Windows Server 2003, Windows 2000 AS/DS, Windows NT 4.0 EE;
- Oracle: EE/SE от 7.3 и выше;
- Памяти на сервере должно быть установлено 4 гигабайта и более.
Если вышеперечисленные условия удовлетворяются, добавляем в boot.ini ключ /3GB. После перезагрузки память, доступная Oracle, должна увеличиться (в теории) до 3 гигабайт. На практике удавалось достичь только 2,7 гигабайта. При этом никаких дополнительных настроек в экземпляре Oracle выполнять не нужно – разве только пересмотреть параметры БД, управляющие выделением структур в памяти, в большую сторону.
При установленном свиче /3GB в кластерной конфигурации периодически может появляться ошибка:
ORA-00603: ORACLE server session terminated by fatal error
ORA-27501: IPC error creating a port
ORA-27300: OS system dependent operation:IPC_CreateNamedSocket failed with status: 10013
ORA-27301: OS failure message: An attempt was made to access a socket in a way forbidden by its access permiss
ORA-27302: failure occurred at: initport_1
, связанная с нехваткой ресурсов у ОС (free PTE).
В Windows 2003 это решается увеличением памяти для ОС свичом /USERVA:
/3GB /USERVA=2900
т.е. ОС получит на 172 (3072-2900) мегабайта больше.
2. Использование Address Windowing Extensions (AWE).
Условия:
- ОС: Windows Server 2003 AS/DS, Windows 2000 AS/DS;
- Oracle: EE/SE 8.1.6.x, 8.1.7.x, 9.2.x, 10.1.x;
- Памяти на сервере должно быть установлено более 4 гигабайт.
Если вышеперечисленные условия удовлетворяются, добавляем в boot.ini ключ /PAE. Этот ключ может быть использован совместно с /3GB, но следует помнить, что объем доступной памяти в этом случае будет ограничен 16 гигабайтами. Вся память выше «нижних» 4 гигабайт может быть использована под DB_BLOCK_BUFFERS. Для этого необходимо соответствующим образом настроить экземпляр Oracle:
a) дать учетной записи, под которой запускается сервис экземпляра Oracle привилегию «Lock Pages in Memory» (Local System, под которым запускается сервис по умолчанию, этой привилегией обладает);
b) добавить в реестр (HKLM\Software\Oracle\HomeX) ключ (тип – строковый параметр) размера AWE_WINDOW_MEMORY – окна, сквозь которое будут обрабатываться DB_BLOCK_BUFFERS, вынесенные в «верхнюю» память. Указывается в байтах. Если этот ключ не установлен явно, используется значение по умолчанию 1 гигабайт. Зачастую этот размер достаточен, однако вполне работоспособны и экземпляры с AWE_WINDOW_MEMORY = 0,5 гигабайт;
в версии 9.2.0 существует небольшое изменение по сравнению с предыдущими релизами - Oracle начал проверять минимальный размер окна AWE_WINDOW_MEMORY по формуле:
min(AWE_WINDOW_MEMORY) = (4096*DB_BLOCK_SIZE*_DB_BLOCK_LRU_LATCHES)/8
где значение по умолчанию _DB_BLOCK_LRU_LATCHES = (16*CPU_COUNT)
Рассчитанные минимумы AWE_WINDOW_MEMORY для популярных значений DB_BLOCK_SIZE и CPU_COUNT:
+---------------+-----------+-----------------------------+
| DB_BLOCK_SIZE | CPU_COUNT | MIN(AWE_WINDOW_MEMORY), Mb |
+---------------+-----------+-----------------------------+
8192 2 128
8192 4 256
8192 8 512
8192 16 1024
16384 2 256
16384 4 512
16384 8 1024
16384 16 2048
32768 2 512
32768 4 1024
32768 8 2048
32768 16 4096
c) добавить параметр USE_INDIRECT_DATA_BUFFERS=TRUE в (s)pfile;
следует помнить, что после установки этого параметра в версии 9.2.0.Х теряются следующие возможности:
- использовать разные размеры db_block_size в базе данных и
- использование новых параметров DB%CACHE_SIZE;
d) установить достаточно большой размер DB_BLOCK_BUFFERS (не менее размера AWE_WINDOW_MEMORY) – только он может быть перенесен в «верхнюю память»; максимальное значение вычисляется по формуле:
(RAM - 4GB + AWE_WINDOW_MEMORY)
Для калькуляции размера DB_BLOCK_BUFFERS важно представлять себе как размещаются структуры Oracle в памяти сервера.
Что находится в нижней памяти (1,7 или 2,7 гигабайта в зависимости от установки ключа /3GB в boot.ini):
- AWE_WINDOW_MEMORY
- элементы SGA (shared_pool, large_pool, java_pool, log_buffers)
- Oracle.exe и DLL (65-100M)
- стэк нитей пользовательский процессов (1 мб на нить по умолчанию - можно изменить утилитой orastack.exe)
- PGA пользовательских сессий
Очень важно правильно выставить значение AWE_WINDOW_MEMORY.
При недостаточном размере процесс DBWR может потреблять до 100% процессорного времени. С версии 9.2.0.Х это легко проверяется запросом:
select * from v$sysstat where statistic# in (154, 155);
где: 154 – number of map operations
155 – number of map misses
Если значение number of map misses относительно велико либо постоянно увеличивается – необходимо увеличивать AWE_WINDOW_MEMORY.
В версии 8i необходимо следить за потреблением процессорного времени процессом DBWR.