martes, 14 de abril de 2009

ESTRUCTURA DE LA MEMORIA

Estructura de la memoria

Introducción

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

  • Código del programa

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

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

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

  • La Caché de Datos

La memoria se puede estructurar en las siguientes partes:

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

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

  • Área de Ordenaciones (Sort Areas).

  • Memoria Virtual

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


Figura 1. Estructura de la memoria en Oracle

Área Global del Sistema (System Global Area, SGA)

El Área Global del Sistema (SGA) es un grupo de estructuras de la memoria compartida que contiene datos e información de control de una instancia de una BD. Si varios usuarios se conectan de forma concurrente a la misma instancia, entonces los datos se comparten en el SGA, por lo que también se llama shared global area.

Una instancia en Oracle se compone de un SGA y de procesos. Cuando se crea una instancia, Oracle asigna memoria a un SGA automáticamente y esta se devuelve al sistema operativo cuando la instancia se cierra. Por tanto, cada instancia posee su propio SGA.

Además, es de lectura/escritura. Todos los usuarios conectados a una instancia multiproceso pueden leer la información contenida en el SGA de la instancia y varios procesos pueden escribir en él durante la ejecución.

Una parte del SGA contiene información general acerca del estado de la base de datos y de la instancia, a la que los procesos en segundo plano necesitan acceder (SGA fija), pero no se almacenan los datos de usuario. El SGA también incluye información de comunicación entre procesos, como la información de bloqueos. Además, si el sistema usa una arquitectura de servidor compartido, entonces las colas de petición y respuesta y algunos contenidos del PGA se encuentran en el SGA.

El SGA contiene la siguiente estructura de datos:

  • Caché de los Buffers de la BD (Database Buffer Cache).

  • Buffer del Dietario o del Registro del Rehacer (Redo Log Buffer).

  • El ‘Pool’ Compartido (Shared Pool).

    • Caché de Biblioteca.

    • Caché del Diccionario de Datos.

    • Estructuras de Control.

  • Información diversa

Instancia de una Base de Datos

Cada instancia Oracle está asociada a una base de datos. Cuando se inicia una base de datos en un servidor (independientemente del tipo de ordenador), se le asigna un área de memoria (SGA) y lanza uno o más procesos. A la combinación del SGA y de los procesos es lo que se llama instancia. La memoria y los procesos de una instancia gestionan los datos de la base de datos asociada de forma eficiente y sirven a uno o varios usuarios.

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 cache del 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últiple 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.

Cache 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.

Cache 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 por que 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.

No hay comentarios:

Publicar un comentario