23 Novas Formas de Acelerar o Firebird
23 Novas Formas de Acelerar o Firebird
23 Novas Formas de Acelerar o Firebird
1. Definir as opções de energia para Alto desempenho, no Windows Server 2016 e 2019
Por padrão, o Windows Server tem o plano de energia definido como equilibrado, que não é indicado para servidores de banco de dados de alto
desempenho. Defina-o como «Alta Performance» e ganhe cerca de +20% de desempenho de CPU. O parâmetro pode ser alterado sem
necessidade de reiniciar o computador. A foto abaixo mostra o gráfico de CPU que demonstra a questão.
Verifique os limites para o processo do Firebird (SuperServer ou SuperClassic) com o seguinte comando:
cat /proc/<firebird_proc_id>/limits
E preste atenção na linha com o parâmetro de número máximo de arquivos abertos. O Firebird pode usar até 4 handles por conexão, e se você
encontrar algo como:
A linha acima significa que o número de conexões servidas pelo Firebird será limitado em torno de 1.000. Se você tem, por exemplo, 4 bancos de
dados no servidor, as conexões de todos eles são consideradas.
Após reiniciar o Firebird, certifique-se de checar novamente para ver se as mudanças foram aplicadas. Para o Classic, é necessário checar e
aumentar os limites para o usuário “firebird”.
Sendo assim, use o RAMMap para ver o real consumo de memória no Windows. A regra empírica para o Windows Server (usado como servidor
dedicado ao Firebird) é:
Firebird memory (Working Set) deve ser menor que 40% do total de RAM. Se o total dos working sets para todos os processos for mais que 50%,
o Windows poderá começar a fazer swap.
Caso se interesse em saber mais detalhes, existe um Webinar (em inglês) sobre gerenciamento de memória:
Parte 1. https://www.youtube.com/watch?v=ZBmLgbYt4aM
Parte 2, https://www.youtube.com/watch?v=-1_DF2FnU-A
Isso significa que nos picos de uso de memória (tanto na VM com o Firebird, como em qualquer outra rodando no mesmo host) poderá
ocorrer swap, ocasionando uma grande degradação de performance. Para VMs em servidores de banco de dados de alta performance, a
configuração de memória deve ser estática.
Verifique esses diretórios periodicamente e apague os arquivos antigos – pode haver vários gigabytes e apaga-los irá liberar espaço no drive do
sistema.
https://www.firebase.com.br/artigo.php?id=3098 2/5
17/12/2019 23 novas formas de acelerar o Firebird
Se o FileSystemCacheThreshold for menor que o DefaultDBCachePages ou que o page buffers, o cache de arquivos do sistema operacional não
será usado, levando a problemas de performance. Em 99% das vezes, é melhor que o cache de arquivos seja usado. Para ter certeza que isso
acontecerá, use a seguinte regra para configurar os parâmetros:
DefaultDBCachePages = X
FileSystemCacheThreshold = X+ N, N>1
Existem casos raros onde desativar o cache de arquivos melhora a performance – se isso acontecer com você, entre em contato comigo pois tenho
interesse em saber - [email protected]!
Então, você poderá configurar a base de segurança com Forced Writes desligado – a pequena chance de corrupção não seria um problema aqui. A
solução mais radical é tornar a base de dados de segurança ReadOnly, o que eliminaria qualquer escrita nela. Se você raramente manipula
usuários na base de segurança, é a melhor solução.
Configure no firebird.conf
ServerMode=SuperClassic
DefaultDbCachePages=1024
gfix –buff 0 <database>
Reinicie o Firebird
Configure no firebird.conf
ServerMode=SuperServer
DefaultDbCachePages=N # N*page size*databases_count < 25% RAM
FileSystemCacheThreshold = N+1
gfix –buff 0 <database>
Reinicie o Firebird
No entanto, o maior tamanho suportado é 16K (no FB 4 será de 32K). Para bases de dados com mais de 100GB, em 95% dos casos é melhor
configurar o tamanho da página para o maior valor suportado, de forma que:
Diminua a profundidade dos índices (index depth). O depth deve ser <=3. Depth >= 4 terão uma performance muito ruim.
Aumentar o consumo de RAM. O cache do Firebird é configurado em número de páginas, 1.000 páginas de cache, em uma base com
páginas de 8K, significa o uso de 8MB de memória, e 16MB com páginas de 16K.
Diminuir o número de páginas na base. Aumentará a performance de acesso a registros de tabelas enormes (menos “pulos” entre páginas
de ponteiros e de dados), e ajuda na preparação de comandos SQLs extensos.
Para mudar o tamanho da página de uma base de dados, deve ser feito um backup com o gbak, e restaura-lo com o parâmetro –page (ex: gbak –
c –page 16384).
Note que, se você tiver uma base de dados com muitos blobs pequenos, aumentar o tamanho da página poderá tanto aumentar como diminuir a
fragmentação dos dados na base.
Sendo assim, só ligue esse flag se sua base de dados for ReadOnly (somente leitura).
Verifique se o flag está ativo usando o gstat –h base_de_dados e verificando a linha “Attributes”.
https://www.firebase.com.br/artigo.php?id=3098 3/5
17/12/2019 23 novas formas de acelerar o Firebird
Desligue o flag com o comando:
Depois desse comando, novas páginas de dados serão criadas com espaço reservado. No entanto, para se beneficiar completamente da mudança,
é necessário fazer um backup/restore da base de dados com o gbak, para que todas as páginas sejam criadas com reserva de espaço.
Obviamente, o tamanho da base de dados irá aumentar após remover o flag no_reserve e fazer o backup/restore.
LockMemSize=99999999
Apenas para referência, o LockMemSize em um sistema com cerca de 1.000 usuários é geralmente menor que 200MB.
Execute o fb_lock_print –d path_para_o_BD | alias e verifique o valor de Owners – ele mostrará o número atual de conexões na base de dados.
Essencialmente, a condição do where na T2 exclui os NULLs do resultado do LEFT JOIN T2, portanto, é possível trocar o LEFT JOIN para um INNER
JOIN, sem alterar o resultado da query.
Um INNER JOIN dá mais liberdade para o otimizador do Firebird e, nas versões mais recentes, é otimizado geralmente de forma mais eficiente do
que um LEFT JOIN.
A query abaixo terá que fazer a leitura de todos os registros retornados pela condition1:
(select count(*)…. where condition1) >0
Se a condition1 retornar mais que 1 registro, a solução proposta será executada de forma muito mais rápida.
A recomendação é que se deixe os SQLs preparados apenas nos casos onde eles serão executados várias vezes, ou se o tempo de preparação for
muito grande (como em queries complexas com vários joins acessando tabelas enormes).
https://www.firebase.com.br/artigo.php?id=3098 4/5
17/12/2019 23 novas formas de acelerar o Firebird
Mesmo com um valor maior para o TempCacheLimit, as queries com maior tempo de execução e grande número de registros ordenados irão
consumir eventualmente toda a memória permitida e, como resultado, a ordenação passará a ser feita em arquivos temporários no disco,
deixando o processo mais lento. A recomendação é fechar essas queries rotineiramente.
https://www.firebase.com.br/artigo.php?id=3098 5/5