Oracle 11g автоматическое управление памятью

Обновлено: 07.07.2024

Обзор управления памятью

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

Использование автоматического выделения памяти значительно упрощает задачу. Но даже в таком случае в целях оптимизации необходим мониторинг и может потребоваться ручное конфигурирование размеров некоторых частей памяти.

В курсе Oracle Database 10g: Администрирование I было представлено введение в вопросы настройки памяти. В этом уроке описывается, как функционирует автоматическая настройка памяти, когда производить ручную настройку, что представляет из себя программная глобальная область (Program Global Area - PGA), а также предоставляются подробные сведения о каждой структуре памяти экземпляра Oracle.

Структуры памяти Oracle

С экземпляром Oracle связаны следующие основные структуры памяти:

системная глобальная область (System Global Area - SGA); эта область совместно используется всеми серверными и фоновыми процессами.
программная глобальная область (Program Global Area - PGA); такая приватная область выделяется для каждого серверного и фонового процесса (одна область PGA для каждого процесса).

SGA - разделяемая область, содержащая данные и управляющую информацию экземпляра.


SGA содержит следующие структуры данных:

кэш буферов базы данных (database buffer cache) - используется для кэширования блоков, выбираемых из файлов данных;
журнальный буфер (redo log buffer) - содержит журнальные данные перед их записью в журнальные файлы;
разделяемый пул (shared pool) - содержит различные структуры, которые могут совместно использоваться пользователями;
большой пул (large pool) - необязательная область памяти, используемая буферами ввода-вывода большого объема при выполнении параллельных запросов, разделяемым сервером, Oracle ХА, а также определенными типами операций резервирования;
java-пул - используется при выполнении Java-кода всех сеансов и обработки данных внутри виртуальной Java-машины (Java Virtual Machine - JVM);
streams пул - используется опцией Oracle Streams;
keep пул - необязательный дополнительный пул буферов для объектов, чьи блоки должны оставаться в памяти как можно дольше;
recycle пул - для блоков, которые не должны задерживаться в памяти;
кэши буферов для блоков размера иК; кэшируют блоки данных, размер которых отличается от стандартного размера блока базы данных; используются для поддержки перемещаемых табличных пространств (transportable lablespaces).


В динамической инфраструктуре SGA размеры кэша буферов базы данных, разделяемого пула, большого пула, Streams-пула и Java-пула изменяются без остановки экземпляра. Кроме того, размеры таких структур памяти, как удерживающий кэш буферов (keep buffer cache), рециклируюший кэш буферов (recycle buffer cache), а также кэши буферов для блоков размера «К, могут быть изменены без остановки экземпляра.


Преконфигурированная база данных предварительно настроена и для нее установлены соответствующие параметры использования памяти. Однако по мере расширения использования может возникнуть необходимость изменить установки таких параметров.

Программная глобальная область (Program Global Area - PGA) - область памяти, содержащая данные и управляющую информацию для каждого серверного процесса.

Серверный процесс (server process) - это такой процесс, который обслуживает запросы по выполнению команд, поступающие от клиента. Каждому серверному процессу принадлежит своя собственная приватная область PGA, которая создается, когда запускается серверный процесс. Доступ к этой области предоставляется исключительно этому серверному процессу и все действия по чтению и записи в эту область производятся только путем вызова соответствующего кода сервера Oracle.

Размер памяти, используемой PGA, и ее содержимое зависит от того, сконфигурирован ли экземпляр в режиме разделяемого сервера.

Обычно PGA содержит следующее:

Приватная область SQL (private SQL area). В этой области находятся такие данные, как информация привязки и структуры памяти, используемые при выполнении команды. Каждый сеанс, в котором вводится команда SQL, имеет приватную область SQL.
Память сеанса (session memory) . В памяти сеанса находятся переменные сеанса и другая информация, связанная с сеансом.

Кэш буферов

Для конфигурирование кэша буферов используется параметр DB_CACHE_SIZE. Кэш буферов содержит копии блоков данных из файлов данных. Размер этих блоков равен значению параметра DB_BLOCK_SIZE. Поскольку кэш буферов является частью SGA, эти блоки могут использоваться всеми пользователями. Серверные процессы читают блоки из файлов данных в кэш буферов. Для повышения производительности серверный процесс иногда читает несколько блоков за одну операцию чтения. Процесс DBWn записывает данные из кэша буферов в файлы данных. Для повышения производительности процесс DBWn записывает несколько блоков за одну операцию записи.

В произвольный момент времени кэш буферов может содержать несколько копий одного и того же блока базы данных. Только одна из них является текущей, остальные конструируются на основе информации сегментов отмены (construct read-consistent copies from past image information - CR block). Они обеспечивают целостные чтения данных.

Для мониторинга использования буферов используется список наиболее давно использовавшихся (least recently used -LRU) буферов. В этом списке буферы сортируются на основе учета того, как давно и как часто они использовались. Поэтому в одном конце этого списка находятся буферы, которые использовались совсем недавно (most recently used-MRU), а в другом - давно не использовавшиеся буферы, которые доступны в первую очередь для перезаписи блоками, поступающими в кэш. Поступающий блок копируются в буфер в конце списка, где располагаются давно не использовавшиеся блоки, а затем переносится в середину списка. После этого он будет перемещаться вверх или вниз по списку в зависимости от использования.

Буферы в кэше буферов могут быть в одном из четырех состояний:

Pinned ("закрепленный") - означает, что несколько сеансов не могут в один и тот же момент времени писать в один блок и вынуждены ждать доступа к блоку, находящемуся в буфере.
Clean ("чистый") - означает, что буфер в настоящее время не закреплен (unpinned) и является кандидатом на удаление из кэша, если на его содержимое не будет опять ссылок. Содержимое буфера либо синхронизировано с блоком на диске, либо буфер использовался для генерации и обработки старого моментального снимка блока в режиме целостного чтения (consistent read - CR блок).
Free/unused (свободный/неиспользуемый) - означает, что буфер пустой, т.к. экземпляр только что был запушен. Состояние очень похоже на состояние clean, за исключением того, что буфер еще не использовался.
Dirty ("грязный") - буфер больше не является закрепленным, но его содержимое было изменено и должно быть записано на диск процессом DBWn перед удалением из кэша.

Серверные процессы используют блоки в кэше буферов, но доступными блоки делает процесс DBWn, записывая их в файлы данных. Очередь контрольной точки (checkpoint queue) представляет собой список буферов (блоков), которые должны быть записаны на диск.

Oracle поддерживает использование несколько размеров блоков в одной и той же базе данных. Стандартный размер блока используется в табличном пространстве SYSTEM и задается параметром инициализации DB_BLOCK_SIZE. Нестандарные размеры блока могут иметь значение 2" в диапазоне от 2 Кб до 32 Кб и задаются следующими параметрами инициализации:

DB_2K_CACHE_SIZE DB_4K_CACHE_SIZE
DB_8K_CACHE_SIZE
DB_16K_CACHE_SIZE DB_32K_CACHE_SIZE


Параметры DB_nKCACHE_SIZE не могут использоваться для задания размера кэша с буферами, равными стандартному размеру блока. Если значение параметра DB_BLOCK_SIZE равно лК, тогда нельзя задать параметр DB_nK_CACHE_SIZE. Размер кэша с буферами стандартного размера всегда определяется параметром
DB_CACHE_SIZE.

Любой кэш буферов ограничен по размеру. Поэтому не все данные, хранимые на диске, могут разместиться в кэше. Когда кэш заполнен полностью, последующие непопадания в кэш (cache misses) заставляют Oracle производить запись "грязных" (измененных) данных из кэша на диск для того, чтобы освободить место для новых данных. Если буфер "негрязный", то не требуется писать его содержимое на диск перед чтением нового блока в буфер. Последующее обращение в данным, которые уже были записаны на диск, вызовет дополнительное неудачное чтение из кэша (cache misses).

Размер кэша влияет на вероятность того, что запрос данных обнаружит их в кэше (попадание в кеш - cache hit). Когда кэш большой, больше вероятность того, что в нем содержатся запрашиваемые для обработки данные. С увеличением размера кэша возрастает процент удачных обращений к кэшу (cache hits).

Использование нескольких пулов буферов

Использование нескольких пулов буферов

АБД может повысить производительность кэша буферов базы данных, создавая несколько буферных пулов. Объекты назначаются буферному пулу в зависимости от того, как осуществляется доступ к этим объектам. Существует три буферных пула:

KEEP (удерживающий); используется для удержания в памяти объектов, вероятность повторного использования которых велика - это позволяет уменьшить количество операций ввода-вывода. Удержание буферов в этом пуле обеспечивается за счет задания такого размера пула, который больше чем общий размер сегментов, размещаемых в этом пуле. В результате не возникнет необходимость выгрузки буферов из оперативной памяти на диск. Удерживающий пул конфигурируется путем задания значения параметра DB_KEEP_CACHE_SIZE.

RECYCLE (повторно используемый); используется для удаления из памяти блоков, если вероятность их повторного использования мала. Размер повторно используемого пула меньше, чем общий размер размещаемых в нем сегментов. Поэтому блоки, читаемые в этот пул, часто выгружаются на диск. Данный пул конфигурируется путем задания значения параметра DB_RECYCLE_CACHE_S IZE.

DEFAULТ (стандартный пул по умолчанию); этот пул существует всегда - он эквивалентен единственному кэшу буферов для экземпляра без удерживающего и рециклирующего пулов и конфигурируется с помощью параметра DB_CACHE_SIZE.


Примечание: память пулов keep и recycle не выделяется из пространства пула default.

Использование нескольких пулов буферов (продолжение)

Использование нескольких пулов буферов (продолжение)

Фраза BUFFER_POOL определяет буферный пул, который используется объектом по умолчанию. Она является частью предложения STORAGE и допустима в командах CREATE и ALTER для таблиц, кластеров и индексов. Блоки объекта, для которого явно не задан буферный пул, будут помещаться в пул DEFAULT.

Если в команде ALTER для объекта изменяется пул буферов по умолчанию, то все блоки, которые уже кэшированы в текущем пуле, остаются в нем до тех пор, пока они не будут выгружены обычным образом. Блоки, читаемые с диска, будут размешаться в новом буферном пуле, заданном для данного сегмента.

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

Разделяемый пул

Размер разделяемого пула можно задать с помощью параметра инициализации SHARED_POOL__SIZE. Разделяемый пул (sharedpool) - это область памяти, в которой хранится информация, совместно используемая многими сеансами. Он содержит различные данные, которые отражены на слайде.

Библиотечный кэш
Библиотечный кэш содержит разделяемые области SQL и PL/SQL: полностью разобранные или откомпилированные представления блоков PL/SQL и команд SQL.

К блокам PL/SQL относятся:

процедуры и функции;
пакеты;
триггеры;
анонимные блоки PL/SQL.

Кэш словаря данных
Кэш словаря данных используется для хранения в памяти объектов словаря данных.

Users Global Area (UGA)
UGA содержит информацию о сеансах разделяемого сервера Oracle. При их использовании UGA размещается в разделяемом пуле, если не сконфигурирован большой пул.

Большой пул

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

Преимущества большого пула:

Большой пул используется для выделения памяти, необходимой сеансам:

серверных процессов ввода-вывода;
при выполнении операций резервирования и восстановления;
разделяемых серверных процессов Oracle и интерфейсу Oracle ХА (используется, когда в транзакции происходит взаимодействие с несколькими базами данных других производителей)


Выделяя память для сеансов разделяемых серверных процессов в большом пуле, сервер Oracle может использовать разделяемый пул непосредственно для кэширования разделяемых команд SQL. Это позволяет устранить дополнительную конкуренцию за доступ к разделяемому пулу, которая уменьшает доступное пространство для кэширования команд SQL и снижает производительность.

Память, используемая Java-приложениям

Java-пул (Java pool) - это структура внутри SGA, используемая для хранения Java-кода всех сеансов и данных внутри Java-машины.

Разделяемый пул
Разделяемый пул используется загрузчиком классов (class loader) внутри виртуальной Java-машины (Java Virtual Machine - JVM). Загрузчик классов расходует примерно 8 Кб на каждый загружаемый класс. Разделяемый пул также применяется, когда компилируется исходный Java-код и когда вызываются методы java-классов. Кроме того, память в разделяемом пуле занимается при создании спецификаций вызова и когда система динамически отслеживает загружаемые Java-классы в ходе выполнения.

Java пул
Менеджер памяти виртуальной машины Oracle (Oracle JVM memory manager) размещает все остальные Java-структуры в ходе выполнения в Java-пуле, в том числе совместно используемые, располагаемые в памяти представления Java-методов и определения классов, а также Java-объекты, которые мигрируют в пространство сеанса в конце выполнения вызова.

Память Java-пула используется различными путями в зависимости от того, использует ли база данных Oracle разделяемые серверные процессы или нет.

Дополнительные сведения об использовании памяти Java-пула см. в документе Oracle Database Java Developer's Guide.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot

Ничем (или недостаточно) ограниченный механизм Automatic Shared Memory Management (ASMM), динамически меняя размеры пулов SGA, может заставить Oracle переключаться между режимами direct path read и кэшированного чтения (через buffer cache SGA), что, в свою очередь, может неожиданно, но вполне заметно влиять на время выполнения типовых запросов

When ASMM increases the buffer cache due to increased demand, 11g might not again do serial direct path read scans for these same large tables

После очередной вынужденной (ora-4031 при включенном ASMM без ограничений нижних пределов размеров пулов параметрами db_cache_size, shared_pool_size. ) перезагрузки инстанса проявились проблемы с увеличившимся временем выполнения типовых быстровыполнявшихся запросов

Симптомы проблемы на примере одного запроса:

1) при неизменившемся плане выполнения (и неизменных данных) запрос стал выполняться заметно медленнее:

2) статистика (autotrace on) показывает неуменьшающееся при повторных непараллельных выполнениях конкретного запроса высокое кол-во physical reads:

при общем кол-ве блоков таблицы:

4) в ожиданиях сессии, выполняющей проблемный запрос в не параллельном режиме (реальный план выполнения, полученный с помощью dbms_xplan.display_cursor привожу просто для примера, чтобы показать, что запрос выполняется непараллельно):

При этом параметр _serial_direct_read (судя по названию, имеющий отношение к проблеме) установлен в значение по умолчанию:

В момент (внепланового) рестарта инстанса размер буферного кэша был экстремально низким (2 из 20 GB SGA)

В соответственно маленькие значения были установлены внутренние параметры _db_block_buffers и _small_table_threshold:

соответственно увеличились значения _db_block_buffers и _small_table_threshold:

Время выполнения и physical reads значительно уменьшаются:)

, уменьшается время выполнения проблемных запросов, ситуация возвращается к нормальному состоянию

Таким образом, при необходимости обеспечения стабильности времён (не планов) выполнения запросов при использовании ASMM можно:

clip_image002

Экземпляр базы данных oracle состоит из ряда системных глобальных областей и фоновых процессов.

Способ доступа клиента к базе данных - это клиентский процесс ----> Глобальные программы -----> Буферный кеш базы данных, и в то же время перезапись копии в буфере журнала повторного выполнения

Методы управления памятью Oracle: автоматическое управление памятью и ручное управление памятью, эта статья в основном объясняет автоматическое управление памятью (автоматическое управление памятью AMM)

1. Oracle 11G запускает автоматическое управление памятью

Для Oracle 11G включение автоматического управления памятью должно гарантировать, что параметр memory_target не равен 0. Для базы данных, созданной DBCA, используйте метод установки по умолчанию, функция автоматического управления памятью активирована по умолчанию, а размер параметра memory_target установлен на 40% от общего размера памяти.

2. Понять важные компоненты SGA.

Наиболее важные компоненты SGA

² Кэш базы данных

² Повторить кеш журнала

² Общий бассейн

² Большой бассейн

² бассейн JAVA

² проточный бассейн

² Фиксированный SGA

Пул буферов базы данных(Буферный кеш базы данных) также называется пулом буферов, который представляет собой область памяти, в которой хранится резервная копия, прочитанная из файла данных. Пул буферов - это текущий или недавно использованный блок данных, временно хранящийся по адресу основной памяти через диспетчер буферов. Все пользователи, в настоящее время подключенные к экземпляру базы данных, используют этот пул буферов.

Цели использования буферного пула базы данных:

Ø Оптимизировать физический ввод / вывод

Ø Поддерживайте частый доступ к буферной базе данных, уменьшайте количество операций блока на диске, тем самым увеличивая скорость доступа

Некоторые термины в буферном пуле базы данных:

Buffer Состояние буфера)

Неиспользуемое: неиспользуемое пространство

Очистить: ранее использованное пространство можно использовать снова после того, как оно будет помечено как чистое, что позволяет перезаписать

Грязный: данные, которые необходимо записать на диск.

Buffer mode

Current mode

Consistent Mode

Logical I/O Также называется буферным вводом-выводом, который предназначен для чтения ввода-вывода непосредственно из кеша.

Physical I/O, Чтение ввода-вывода с физического диска

Buffer Write: Процесс DBWn периодически записывает расширенные данные на диск, и условие записи на диск

Серверный процесс не может найти свободный кеш, чтобы прочитать новый блок в кеш

Buffer Reads

Buffer cache hit ration(Скорость попадания в кеш): Отношение блока данных, прочитанного в кэше, к общему блоку данных (включая блок данных, прочитанный из кеша и диска).

Buffers and full table scan

Повторить кеш журнала: Кэш журнала повтора - это кольцевой кеш в области SGA, в котором хранятся объекты повтора (например, операторы SQL), изменяющие базу данных. Сущность реконструкции включает операции восстановления и повторения DML / DDL.

Общий бассейн): Общий пул кэширует различные типы данных программы, такие как операторы pl / sql, системные параметры и информацию словаря данных.

Oike: Это дополнительная область выделения памяти и вспомогательная область кэша.

JavaБассейн: Это область памяти, в которой хранятся все сеансы о jave-коде, то есть область памяти, которая управляет java-соединениями.

Stream Бассейн: Область памяти, выделенная для потоковых подключений.

Fixed SGA: Внутренняя зарезервированная область, которая описывает состояние базы данных, информацию об экземпляре и т. Д.

Примеры применения

1. Проверьте, включена ли функция автоматического управления памятью Oracle.

ВОПРОС:

Как увеличить память выделяемую для Oracle 10g и 11g при увеличении RAM на сервере (для Windows)?

ОТВЕТ:

(Для случая использования автоматического управления памятью, ручное управление здесь не рассматривается).

В Oracle 10g и 11g автоматическое управление памятью, используемое по умолчанию, работает по разному. В расчетах, приведенных в этой статье, это учитывается.

1) (Для Oracle 10g и 11g) Определить сколько необходимо памяти под PGA на существующем экземпляре.

Для этого нужно выполнить запрос под sys.

SELECT ROUND (PGA_TARGET_FOR_ESTIMATE / 1024 / 1024) target_mb,
PGA_TARGET_FACTOR,
ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc,
ESTD_OVERALLOC_COUNT
FROM V$PGA_TARGET_ADVICE;

2) (Для Oracle 10g и 11g). Определить сколько памяти в ОС мы можем использовать под экземпляр Oracle.

Помимо Oracle на сервер работают и другие процессы и они тоже потребляют память сервера. Поэтому нужно определить сколько памяти потребляется на сервере без участия Oracle. Для этого можно на работающем сервере остановить экземпляр Oracle и посмотреть потребление памяти в диспетчере задач.

image

Для приведенного примера: Всего на сервере 16Гб памяти RAM, используется 7,73Гб, доступно 8424Мб. Т.е. можно использовать 8424Мб. Но у процессов, которые в данный момент запущены на сервере, может увеличиться потребление памяти, тогда сервер станет интенсивно использовать файл подкачки, что резко снизит производительность, что для сервера недопустимо. Поэтому необходимо оставить запас свободной памяти, от 10% и выше. Предположим что мы оставляем 25% запаса свободной памяти. Тогда у нас остается 8424-(8424*25/100)=6318Мб.

3) Установка размеров областей памяти для Oracle

3.1) Установка размеров областей памяти для Oracle 10g (используется ASMM)

3.2) Установка размеров областей памяти для Oracle 11g (используется AMM)

В Oracle 11g с AMM в памяти выделяется одна область под все области, PGA также входит в эту одну общую область, поэтому можно использовать всю вычисленную свободную память 6318Мб (PGA вычитать не нужно). Для удобства округлим 6318Мб до 6Гб.

Читайте также: