Alocação de espaço no Firebird 2.1 e superior
Vlad Khorsun, 20-OUT-2010
Desde o início, o Firebird não tinha regras sobre como alocar espaço em disco para o(s) arquivo(s) de banco de dados. Ele simplesmente grava novas páginas alocadas em uma ordem não determinada (devido às dependências entre páginas para atender à estratégia de «gravação cuidadosa»).
Essa abordagem é muito simples, mas tem algumas desvantagens:
• devido à ordem não determinada das gravações, pode haver uma situação em que o cache de páginas contém muitas páginas sujas no momento em que uma nova página alocada precisa ser gravada, mas não pode por falta de espaço em disco. Nesses casos, muitas vezes todas as outras páginas sujas são perdidas porque os administradores preferem desligar o banco de dados antes de liberar espaço em disco. Isso leva a corrupções graves.
• alocar espaço em disco em blocos relativamente pequenos pode levar a uma fragmentação significativa do arquivo no nível do sistema de arquivos e reduzir o desempenho de varreduras grandes (por exemplo, durante o backup).
Usando o novo ODS 11.1, o Firebird altera seu algoritmo de alocação de espaço em disco para evitar corrupções em condições de falta de espaço em disco e para dar ao sistema de arquivos a chance de evitar fragmentação. Essas alterações são descritas abaixo.
a) Toda página recém-alocada é gravada no disco imediatamente antes de retornar ao mecanismo. Se a página não puder ser gravada, a alocação não ocorre, o bit do PIP não é limpo e um erro de E/S apropriado é gerado. Esse erro não pode levar a corrupções, pois temos a garantia de que todas as páginas sujas no cache têm espaço em disco alocado e podem ser gravadas com segurança.
Essa alteração adiciona uma gravação extra de cada página recém-alocada em comparação com o comportamento antigo. Portanto, espera-se uma penalidade de desempenho durante o crescimento do arquivo do banco de dados. Para reduzir essa penalidade, o Firebird agrupa gravações de páginas recém-alocadas em até 128KB por vez e rastreia o número de páginas «inicializadas» no cabeçalho do PIP.
Nota: uma página recém-alocada será gravada no disco duas vezes somente se essa página for alocada pela primeira vez. Ou seja, se uma página foi alocada, liberada e alocada novamente, ela não será gravada duas vezes na segunda alocação.
b) Para evitar fragmentação de arquivos, o Firebird usou a API apropriada do sistema de arquivos para pré-alocar espaço em disco em blocos relativamente grandes. Atualmente, essa API existe apenas no Windows, mas foi recentemente adicionada à API do Linux e pode ser implementada em sistemas de arquivos populares como ext2, etc., no futuro. Portanto, esse recurso está atualmente implementado apenas nas versões do Firebird para Windows e pode ser implementado nas versões para Linux no futuro.
Para melhor controle da pré-alocação de espaço em disco, uma nova configuração foi introduzida no Firebird.conf: DatabaseGrowthIncrement. Este é o limite superior do tamanho do bloco de pré-alocação em bytes. O valor padrão é 128MB. Quando o mecanismo precisa de mais espaço em disco, ele aloca 1/16 do espaço já alocado, mas não menos que 128KB e não mais que o valor de DatabaseGrowthIncrement. Se DatabaseGrowthIncrement for definido como zero, a pré-alocação será desabilitada. O espaço para arquivos de sombra do banco de dados não é pré-alocado.
Além disso, a pré-alocação é desabilitada se a opção «No reserve» estiver definida para o banco de dados.
Nota: a pré-alocação também permite evitar corrupções em condições de falta de espaço em disco - nesse caso, há uma grande chance de o banco de dados ter espaço pré-alocado suficiente para operar até que o administrador libere espaço em disco.
Autor: Vlad Khorsun,