lunes, 15 de junio de 2009

El gran misterio del log_buffer

Buenas de nuevo, escribo algo muy sencillo, pero que he visto que está extendido en varias bases de datos que he tocado. Lo llamaré “El gran misterio log_buffer”. Y es que he visto en más de una ocasión que el valor de este parámetro está puesto a 10M y hasta 32M. Y me pregunto ¿Por qué y para qué?
He notado que algunos administradores tienden a aumentar el tamaño de este valor cada vez que aumentan el tamaño de su SGA, pero esto sin duda alguna, es una “mala” práctica, y ahora les explico porqué. Para ello primero me pregunto ¿Para que uso ese pedacito de memoria y como funciona? Cada vez que realizo hago cambios (Insert, Delete, Update, y más cosas) estos cambios se guardan en memoria temporalmente, justo ahí, en el redo log buffer, y el tamaño de este buffer lo determina el parámetro log_buffer. Si ocurren ciertos eventos, un proceso llamado Log Writer (LGWR) “escribe” la información que está en esa parte de la memoria a los Online Redo logs, mejor, realmente “vuelca” (flush en ingles) la información de memoria a disco, y reutiliza ese espacio. Con esto se esta intentando guardar la integridad de los datos y de la base de datos (a groso modo).
Pero ¿Cada cuanto vuelco esta información que está en la memoria a disco?
Existen varios eventos por los que se producen estas escrituras. Quien lo describe perfectamente es Tom Kyte en su libro “Expert Oracle database architecture” en la página 176, donde dice que estos eventos (LGWR despierta para trabajar) se ejecutan cada:

- Tres segundos
- “COMMIT” de cualquier transacción
- Cuando se llega a un tercio del tamaño del redo log buffer
- Cuando llega a 1M de información

También pueden encontrar esta información en METALINK en la nota “Tuning the Redolog Buffer Cache and Resolving Redo Latch Contention” con id 147471.1, ó también esto mismo lo podemos leer en el documento "Performance Tuning Guide " ya sea 9i ó 10g, en el capitulo de "Memory Configuration and Use" en la parte de "Configuring and using the Redo Log Buffer".

Entonces teniendo en cuenta que se va a realizar un volcado de esta información cada vez que llegue a 1M, ¿Por qué tengo 14M ó incluso 30M de redo log buffer? La verdad, no lo se y no lo entiendo, el caso es que he encontrado estos “detalles” en muchísimas bases de datos. Y los argumentos de algunos son : que es un OLTP (gran volumen de transacciones), o que su SGA es muy grande, y otra razón que también escucho es que como tienen muchas CPU pues deducen (ejemplo: 32*512K dan 16M de log_buffer) tal y como dice el DBA Reference. Pero realmente creo que muchos DBAs no ven normal que el resto de “pools” de la SGA vayan creciendo según la carga y/o el tipo de uso de la base de datos y que esta parte de la memoria no lo crezca también, y simplemente la aumentan por si acaso, creo.

Pero es cierto es una “mala” practica, sino pruébenlo, pasen de 14M (si lo tienen) a 3M, en sus base de datos (8i, 9i ó 10g), miren si el rendimiento de su base de datos decrece.
Realmente no importa mucho si tienes 32 Gigas de memoria y de SGA tienes 24. Al final lo único que estas haciendo es desperdiciar unos pocos megas, tal y como lo dice Tom.
Este pequeño espacio de memoria le viene muy bien a otras partes de la SGA, y no veo conveniente desperdiciar ni bloque del sistema para nada, solo por un mal mito repartido en muchos sitios.
Si después de esta prueba ven que el rendimiento decrece o es malo por este cambio, por favor envíenme la demostración "real" que estoy deseoso de verla, ya que confío y creo que esto no se produce.

Por cierto, si realmente consumen menos de 300K de información de redo por segundo (el dato aparece en los reportes AWR), no es necesario ni siquiera llegar hasta los 3M, con menos de esto valor nos vale (calcúlalo con lo antes explicado ;). Es poco común, pero este mundo es muy grande. Claro, que tampoco es correcto poner un valor muy pequeño, y ese es el momento donde posiblemente tengas algún problema, reduciéndolo demasiado.

3 comentarios:

  1. A la mejor tienen 14M porque 10gR2 + lo hace haci... Doc ID: 351857.1 "The Log_buffer Default Size Cannot Be Reduced In 10g R2"

    ResponderEliminar
  2. Hola Daniel,

    Este es un BUG para la versión 10.2.0.1, pero mira lo que pasa con la 10.2.0.3:

    SQL> show sga

    Total System Global Area 218103808 bytes
    Fixed Size 1260960 bytes
    Variable Size 142606944 bytes
    Database Buffers 67108864 bytes
    Redo Buffers 7127040 bytes
    SQL> show parameter log_buffer

    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    log_buffer integer 7016448
    SQL> select banner
    2 from v$version;

    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
    PL/SQL Release 10.2.0.3.0 - Production
    CORE 10.2.0.3.0 Production
    TNS for Linux: Version 10.2.0.3.0 - Production
    NLSRTL Version 10.2.0.3.0 - Production

    Pero en eso no consiste el "post". Lo puse porque desde versiones desde la 8 hasta 10g, he visto como, por regla general, algunos DBAs aumentan el parametro log_buffer, cuando aumnetan la SGA y cuando cambian de versión.
    Una practica, desde mi punto de vista errada. Que no tiene "ton, ni son". Aunque me gustaría, que más gente como tu, me pueda explicar porque lo hacen, y que además lo demuestren.

    Muchas gracias por el comentario y por la nota de metalink.

    ResponderEliminar
  3. Corrección para versiones 10g y 11g. Para la versión 11g no salta el LGWR con 1M, y además en las versiones 10.2.0.3 en adelante realmente se crean dos vectores de Redo de 7M cada uno.
    Si que existe un problema con log_buffer pequeños. Cuando el LGWR está escribiendo los server process, que necesitan escribir información de Redo, si que escriben en el restante de los vectores del log_buffer, y cuando se llena este espacio los server process quedan con el evento de espera "log buffer space" así y quedan realmente "congelados" porque no pueden meter sus sentencias de Redo hasta que termine de trabajar el LGWR.
    Esto solo lo he visto en entornos que generan más de 14M de información de Redo por segundo, que es muchísima información de Redo. No muchos entornos son capaces de generar esta cantidad de información de Redo.
    Pero si, entre esta BBDD y la explicación de Jonathan Lewis que me hizo una correción en el foro:

    http://forums.oracle.com/forums/thread.jspa?threadID=1089170&start=15&tstart=0

    Espero escribir un post de esto

    ResponderEliminar