top of page
Foto del escritorBrandon Esquivel

2.1.1 Estructura de Memoria y Procesos de la Instancia

Introducción


Oracle utiliza la memoria para almacenar la siguiente información:


1. Código del programa

2. Información acerca de una sesión conectada, incluso si no se encuentra activa.

3. Información necesaria durante la ejecución del programa(por ejemplo, el estado de las consultas)

4. La información que comparten y con la cual se comunican los procesos Oracle (por ejemplo, la información de bloqueo)

5. La Caché de Datos

6. La memoria se puede estructurar en las siguientes partes:

7. Área Global del sistema (SGA), la cual se comparte entre todos los servidores y los procesos en segundo plano.

8. Áreas globales de programas (PGA), que es privada para cada servidor y proceso en segundo planos; a cada proceso se asigna un PGA.

9. Área de Ordenaciones (Sort Areas).

10. Memoria Virtual

11. Área de código de Software (SCA).


Figura 2. Estructura de una instancia de Oracle


La Instancia y la Base de Datos


Cuando se inicia una instancia Oracle monta la base de datos, es decir, asocia dicha instancia a su base de datos correspondiente. En un mismo ordenador pueden ejecutarse varias instancias simultáneamente, accediendo cada una a su propia base de datos física. Únicamente el administrador de la base de datos puede iniciar una instancia y abrir una base de datos. Si una base de datos está abierta, entonces el administrador puede cerrarla y, cuando esto ocurre, los usuarios no pueden acceder a la información que contiene.


Estructura de Datos del SGA


Caché de los Buffers (Database Buffer Cache)

La caché de los buffers de la base de datos es una parte de la SGA que contiene copias de los bloques de datos de lectura de las páginas. Todos los procesos de los usuarios conectados concurrentemente a la instancia comparten el acceso a ella. Esta caché junto con la caché compartida de SQL están lógicamente segmentadas en varios conjuntos, lo que reduce la contención en sistemas multiprocesador.


Organización de la Caché de los Buffers

Los buffers en la caché están organizados en dos listas: la lista en espera y la lista LRU. La lista en espera contiene los buffers en espera (dirty buffers), los cuales contienen datos que han sido modificados pero que aún no se han escrito en disco. La lista LRU contiene los buffers libres, buffers que están siendo accedidos actualmente (pinned buffers) y los buffers en espera, que aún no están almacenados en la lista en espera. Cuando un proceso Oracle accede a un buffer, este lo sitúa al final de la lista LRU.

La primera vez que un proceso de usuario necesita un dato concreto, este los busca en los datos almacenados en la caché de los buffers. Si el proceso encuentra el dato en uno de estos buffers, se lee directamente de la memoria (cache hit). Si no lo encuentra, entonces debe copiar la página en disco a un buffer de la caché antes de leerlo (cache miss). Acceder a los datos a través de un ‘cache hit’ es más rápido que hacerlo mediante un ‘cache miss’. Antes de leer un bloque de datos dentro de la caché, el proceso debe encontrar primero un buffer libre, empezando desde el menos usado recientemente de la lista LRU. El proceso sigue buscando hasta que encuentra un buffer libre o hasta que llega al final de la lista.


El Algoritmo LRU y la Lectura Completa de Tablas

Cuando un proceso de usuario realiza una exploración completa de la tabla, lee cada bloque de la tabla en los buffers y los pone al final de la lista LRU. Se hace así porque normalmente la exploración completa se necesita brevemente, por lo que los bloques deben sacarse rápidamente para dejar espacio en la caché a los bloques que se usan con mayor frecuencia.


Tamaño de la Caché de los buffer

Oracle soporta múltiples tamaños de bloque en una base de datos. El tamaño estándar de bloque se especifica mediante la configuración del parámetro DB_BLOCK_SIZE. Se admiten valores desde 2K hasta 32K. Opcionalmente, también se puede seleccionar el tamaño de dos pool de buffer adicionales, KEEP y RECYCLE, configurando DB_KEEP_CACHE_SIZE y DB_RECYCLE_CACHE_SIZE. Estos tres parámetros son independientes entre sí.


Múltiples Pools de Buffer

Se puede configurar la cache del buffer con “buffer pools” distintos, en los que cualquiera contiene datos, o están disponibles para nuevos datos tras usar los bloques de datos. Objetos particulares del esquema (tablas, clusters, índices y particiones) se asignan al buffer pool apropiado para controlar la forma en que los bloques de datos “envejecen” en la cache.


El buffer pool KEEP conserva los bloques de datos de los objetos del esquema en memoria.

El buffer pool RECYCLE elimina bloques de datos de la memoria tan pronto como dejan de ser necesitados.

El buffer pool DEFAULT contiene bloques de datos de los objetos del esquema que no son asignados a ningún buffer pool, así como los objetos del esquema que son explícitamente asignados al pool DEFAULT.


Los parámetros que configuran los buffer pools KEEP y RECYCLE son DB_KEEP_CACHE_SIZE y DB_RECYCLE_CACHE_SIZE.


Buffer del Registro del Rehacer (Redo Log Buffer)

El redo log buffer es un buffer circular en el SGA que contiene información sobre cambios hechos a la base de datos, la cual se almacena en las ‘entradas redo’. Estas entradas contienen la información necesaria para reconstruir, o rehacer cambios hechos en la base de datos mediante las operaciones INSERT, UPDATE, DELETE, CREATE, ALTER o DROP y se usan para la recuperación de la base de datos, si fuera necesario. Las entradas se copian por los procesos desde el espacio de memoria del usuario al redo log buffer en el SGA, ocupando continuamente espacio secuencial. El proceso en segundo plano LGWR escribe el redo log buffer en el fichero redo log activo (o grupo de ficheros) en disco.


El parámetro LOG_BUFFER determina el tamaño (en bytes) del redo log buffer.


El Pool Compartido

Es la parte del SGA que contiene la cache de biblioteca, la cache de diccionario, los buffers para los mensajes de ejecución paralela y las estructuras de control. El tamaño total del Pool Compartido se determina por el parámetro SHARED_POOL_SIZE. El valor por defecto es de 8MB en plataformas de 32-bit, y de 64MB para plataformas de 64-bit. Incrementando su valor se incrementa la cantidad de memoria reservada para el pool compartido.


Caché de Biblioteca (Library Cache)

La cache de biblioteca incluye áreas de SQL compartidas, áreas SQL privadas (en caso de una configuración de servidor compartido), procedimientos y paquetes PL/SQL, y estructuras de control tales como bloqueos y el manejo de la cache de biblioteca. Ya que las áreas de SQL compartidas son accesibles para todos los usuarios, la caché de biblioteca está contenida en el Pool compartido dentro del SGA.


Áreas SQL Compartidas y Áreas SQL Privadas

Oracle representa cada declaración de SQL con un área SQL compartida y un área SQL privada. Oracle reconoce cuando dos usuarios están ejecutando la misma instrucción SQL y reutiliza el área SQL compartida para esos usuarios. Sin embargo, cada usuario debe tener una copia separada de la declaración del área SQL privada.


Áreas SQL Compartidas

Un área SQL Compartida contiene el árbol de análisis y el plan de ejecución para una instrucción SQL dada. Se ahorra memoria usando un solo área SQL compartida para instrucciones SQL ejecutándose varias veces, lo cual ocurre con frecuencia cuando varios usuarios ejecutan la misma aplicación.


Programas PL/SQL y el Pool Compartido

Oracle procesa programas PL/SQL (procedimientos, funciones, paquetes, bloques anónimos, triggers) tanto como procesa instrucciones SQL individuales. Oracle asigna un área compartida que contiene la forma analizada y compilada del programa. Asigna un área privada para mantener los valores específicos de la sesión que ejecuta el programa, incluyendo variables locales, globales y de paquete y buffers para ejecución SQL. Si más de un usuario ejecuta el mismo programa, entonces una simple área compartida es usada por todos los usuarios siempre que tenga una copia de su área SQL privada, manteniendo valores específicos de su sesión.


Las instrucciones SQL individuales están contenidas en programas PL/SQL.


Large Pool

El administrador de la base de datos puede configurar un área de memoria opcional llamado large pool que proporciona grandes cantidades de memoria para asignar:

Memoria de la sesión para el servidor compartido y el Oracle XA interface (usado donde las transacciones interactúan con más de una base de datos)

Procesamiento de E/S

Copias de seguridad y operaciones de recuperación

El large pool satisface mejor las peticiones de gran cantidad de memoria que el pool compartido. Sin embargo, no posee una lista LRU.


Java Pool

La memoria java pool se usa en la memoria del servidor para almacenar todo el código y datos del JVM en las sesiones. Se usa de diferentes formas, dependiendo del modo en que se ejecute el servidor Oracle. El asesor de estadísticas de java pool proporciona información sobre la memoria de la cache de biblioteca usada para java y predice como pueden afectar cambios en el tamaño del java pool en la tasa de análisis. El asesor de java pool se activa internamente cuando el statistics_level está configurado en TYPICAL o mayor. Estas estadísticas se reinician cuando el asesor es desactivado.


Streams Pool

En una única base de datos, se puede especificar que los flujos de memoria se asignen desde un pool en el SGA llamado Streams pool. Para configurarlo se especifica el tamaño del pool en bytes usando el parámetro STREAMS_POOL_SIZE. Si un streams pool no está definido, entonces se crea automáticamente cuando los flujos se usan por primera vez. Si SGA_TARGET está activo, entonces la memoria del SGA para los Streams pool viene del pool global del SGA. Si no está activo, entonces se transfiere desde la cache del buffer, aunque solo tiene lugar después del primer uso de los flujos. La cantidad transferida es del 10% del tamaño del pool compartido.


Caché de Diccionario (Dictionary Cache)

El diccionario de datos es una colección de tablas y vistas de la base de datos que contienen información sobre la base de datos (sus estructuras y sus usuarios. Oracle accede con frecuencia al diccionario de datos, por lo que tiene dos localizaciones especiales en memoria designadas a mantenerlo. Una de ellas es la caché del diccionario de datos, también conocida como la cache de fila porque contiene datos sobre las filas en vez de los buffers (los cuales contienen bloques de datos), y la otra es el cache de biblioteca.


El Parámetro SGA_MAX_SIZE

El SGA comprende un número de componentes de memoria, denominados pools de memoria, que se usan para satisfacer una clase particular de asignación de memoria. Todos los componentes del SGA asignan y liberan espacio en unidades (módulos). El tamaño del módulo queda determinado por el tamaño total del SGA. En la mayoría de las plataformas el tamaño del módulo es 4MB si el tamaño total del SGA es menor de 1GB, y de 16MB para SGA mayores. La base de datos puede configurar límites sobre cuanta memoria virtual se usa para el SGA. Puede crear instancias con un mínimo de memoria y permitir que la instancia use más, expandiendo la memoria asignada a los componentes del SGA, hasta un máximo determinado por el SGA_MAX_SIZE. Si el valor es menor que la suma de memoria asignada para todos los componentes, la base de datos ignora la configuración de SGA_MAX_SIZE.


Para un rendimiento óptimo, en la mayoría de los sistemas, todo el SGA debería ajustarse a la memoria real. Si no es así, y la memoria virtual es usada para almacenar partes del SGA, entonces el rendimiento total del sistema puede decrementarse en gran medida. La cantidad de memoria dedicada para todas las áreas compartidas en el SGA también influye en el rendimiento.


El tamaño del SGA queda determinado por muchos parámetros, aunque son los siguientes los que tienen un gran efecto sobre el tamaño del SGA:


Parámetro

Descripción

DB_CACHE_SIZE

Tamaño de la cache de los bloques estándar.

LOG_BUFFER

Número de bytes asignados al redo log buffer.

SHARED_POOL_SIZE

Tamaño en bytes para el área dedicada al SQL compartido e instrucciones PL/SQL.

LARGE_POOL_SIZE

Tamaño del large pool, por defecto es 0.

JAVA_POOL_SIZE

Tamaño del java pool.


Gestión Automática de Memoria Compartida

En versiones anteriores el administrador de la base de datos tenía que especificar manualmente los tamaños de los diferentes componentes del SGA configurando un número de parámetros de inicialización, que incluían el SHARED_POOL_SIZE, DB_CACHE_SIZE, JAVA_POOL_SIZE, y LARGE_POOL_SIZE. En la versión 10g se incluye la gestión automática de la memoria compartida que simplifica la gestión de la memoria del SGA. El administrador de la BD puede simplemente especificar la cantidad total de memoria del SGA disponible para una instancia usando SGA_TARGET y la base de datos automáticamente distribuirá esta memoria entre varios subcomponentes para asegurar el mayor uso de memoria efectiva. Cuando la gestión automática de memoria del SGA esta activada, el tamaño de los diferentes componentes del SGA es flexible y pueden adaptarse a las necesidades del trabajo sin requerir ninguna configuración adicional. La base de datos automáticamente distribuye la memoria disponible entre varios componentes como se requiera, permitiendo al sistema maximizar el uso de toda la memoria del SGA disponible.


Configurando un único parámetro se simplifica mucho la tarea de administración ya que puedes especificar solo la cantidad de memoria del SGA que una instancia tiene disponible y olvidarte de los tamaños de los componentes individuales. No se generan errores de “out of memory” a menos que el sistema se haya quedado sin memoria. La gestión automática del SGA puede mejorar el rendimiento sin necesidad de recursos adicionales ni ajustes manuales. Con la configuración manual del SGA es posible que instrucciones SQL compiladas se saquen del pool compartido debido a su insuficiente tamaño lo que incrementa la frecuencia de análisis difíciles, que reducen el rendimiento. Cuando la gestión automática del SGA esta activa, el algoritmo de ajuste interno supervisa el rendimiento del trabajo, incrementando el tamaño del pool compartido si reduce el número de análisis requeridos.


El Parámetro SGA_TARGET


El parámetro SGA_TARGET refleja el tamaño total del SGA e incluye la memoria para los siguientes componentes:

SGA Fija y otras asignaciones internas necesarias para la instancia.

El log buffer

El pool compartido

El Java pool

La caché del buffer

Las cachés de los buffers keep y recycle (si son especificados)

El tamaño de los bloques no estándar de las cachés de los buffer (si son especificados)

El Streams pool

Este incluye toda la memoria del SGA, en diferencia con las versiones anteriores en las que la memoria para la SGA interna y fija se configuraba a través de otros parámetros. En consecuencia, el SGA_TARGET da un control preciso sobre el tamaño de la región de memoria compartida asignada por la base de datos. Si está configurado con un valor mayor que SGA_MAX_SIZE al inicio, entonces este último se usa como respaldo para el SGA_TARGET.


Nota: No configurar dinámicamente el SGA_TARGET. Debería ser configurado solo al inicio.


Limitando el Tamaño de la SGA


El parámetro SGA_MAX_SIZE especifica el tamaño máximo del SGA durante la duración de la instancia. Puedes modificar dinámicamente los parámetros que afectan al tamaño de las caches de los buffers, del pool compartido, large pool, java pool, y streams pool pero solo para controlar que la suma de estos tamaños y los tamaños de los otros componentes del SGA no exceden el valor especificado por SGA_MAX_SIZE.


17 visualizaciones0 comentarios

Entradas recientes

Ver todo

Comments


bottom of page