Asignación de espacio en Firebird 2.1 y versiones posteriores
Vlad Khorsun, 20-OCT-2010
Desde el principio, Firebird no tenía reglas sobre cómo asignar espacio en disco para los archivos de base de datos. Simplemente escribe las páginas recién asignadas en un orden no determinado (debido a las dependencias entre páginas para servir la estrategia de «escritura cuidadosa»).
Este enfoque es muy simple pero tiene algunos inconvenientes:
• debido al orden no determinado de las escrituras, puede haber una situación en la que la caché de páginas contenga muchas páginas sucias en el momento en que una página recién asignada debe escribirse pero no puede debido a la falta de espacio en disco. En tales casos, a menudo se pierden todas las demás páginas sucias porque los administradores prefieren apagar la base de datos antes de liberar algo de espacio en disco. Esto conduce a corrupciones graves.
• asignar espacio en disco en fragmentos relativamente pequeños puede provocar una fragmentación significativa del archivo a nivel del sistema de archivos y reducir el rendimiento de escaneos grandes (por ejemplo, durante una copia de seguridad).
Con el nuevo ODS 11.1, Firebird cambia su algoritmo de asignación de espacio en disco para evitar corrupciones en condiciones de falta de espacio en disco y para dar al sistema de archivos la oportunidad de evitar la fragmentación. Estos cambios se describen a continuación.
a) Cada página recién asignada se escribe en disco inmediatamente antes de devolverse al motor. Si la página no puede escribirse, la asignación no ocurre, el bit PIP no se limpia y se genera el error de E/S correspondiente. Este error no puede provocar corrupciones, ya que tenemos la garantía de que todas las páginas sucias en la caché tienen espacio en disco asignado y pueden escribirse de manera segura.
Este cambio implica una escritura adicional de cada página recién asignada en comparación con el comportamiento anterior. Por lo tanto, se espera una penalización de rendimiento durante el crecimiento del archivo de base de datos. Para reducir esta penalización, Firebird agrupa las escrituras de páginas recién asignadas hasta 128KB a la vez y realiza un seguimiento del número de páginas «inicializadas» en el encabezado PIP.
Nota: una página recién asignada se escribirá en disco dos veces solo si esta página se asigna por primera vez. Es decir, si una página fue asignada, liberada y asignada nuevamente, no se escribirá dos veces en la segunda asignación.
b) Para evitar la fragmentación del archivo, Firebird utilizó la API apropiada del sistema de archivos para preasignar espacio en disco en fragmentos relativamente grandes. Actualmente, dicha API solo existe en Windows, pero se agregó recientemente a la API de Linux y puede implementarse en sistemas de archivos populares como ext2, etc. en el futuro. Por lo tanto, esta característica actualmente solo está implementada en las versiones de Windows de Firebird y puede implementarse en las versiones de Linux en el futuro.
Para un mejor control de la preasignación de espacio en disco, se introdujo una nueva configuración en Firebird.conf: DatabaseGrowthIncrement. Este es el límite superior del tamaño del fragmento de preasignación en bytes. El valor predeterminado es 128MB. Cuando el motor necesita más espacio en disco, asigna 1/16 del espacio ya asignado, pero no menos de 128KB y no más del valor de DatabaseGrowthIncrement. Si DatabaseGrowthIncrement se establece en cero, la preasignación está deshabilitada. El espacio para los archivos de sombra de la base de datos no se preasigna.
Además, la preasignación está deshabilitada si la opción «Sin reserva» está configurada para la base de datos.
Nota: la preasignación también permite evitar corrupciones en condiciones de falta de espacio en disco - en tal caso, hay una alta probabilidad de que la base de datos tenga suficiente espacio preasignado para operar hasta que el administrador libere algo de espacio en disco.
Autor: Vlad Khorsun,