O que é forced-writes?

O termo forced-writes vem do inglês e significa forçar-escritas.

Vamos pensar no que acontece quando executamos um comando qualquer que adiciona, altera ou apaga dados do banco de dados. Por exemplo:

insert into clientes(codigo, nome) values (1, "João")

Forced-Writes Ligado

O comportamento padrão do Firebird é gravar estes dados imediatamente no disco. Isto é o Forced-Writes. O Firebird grava tudo no disco assim que recebe o comando.

Firebird Server SQL Database Forced Writes ON Diagram

Com o Forced-Writes ligado cada escrita vai diretamente
para o armazenamento persistente.

(Você está familiarizado com o termo páginas de dados? Este é o termo que usarei daqui em diante.)

Forced-Writes Desligado

Quando o Forced-Writes está desligado, o Firebird não grava tudo imediatamente no disco. Ao invés disto, ele deixa estas páginas em memória por um tempo. Durante este tempo ele acumula em memória outras páginas que também deverão ser escritas no disco.

Por exemplo, se logo em seguida você emitir outro comando:

insert into clientes(codigo, nome) values (2, "Maria”)

Estas novas páginas não vão diretamente para o disco e sim para a memória, junto com as páginas geradas pelo primeiro comando. Quando esta memória estiver completa ou quando o tempo de permanência nela expirar, todas as páginas serão escritas no disco de uma só vez.

Isto torna a escrita mais eficiente e muito mais rápida.

Firebird Server SQL Database Forced Writes OFF Diagram

Com o Forced-Writes desligado as escritas são acumuladas
em memória e gravadas de uma só vez no disco após algum tempo.

Perigo real

Apesar de mais eficiente, desligar Forced-Writes é extremamente perigoso. Aquelas páginas em memória já fazem parte oficialmente do seu banco de dados. Se o Firebird for terminado de forma inesperada, o arquivo do banco de dados ficará num estado inválido conhecido como corrupção. É também provável que você perca dados no processo de recuperação .

Este perigo é justamente o que deve te manter longe de desligar o Forced-Writes. Alguns exemplos de casos em que o servidor termina de forma inesperada:

  • Queda de energia. Mesmo que você tenha um no-break, ele pode apresentar problemas. Ou a ausência de energia pode durar muito tempo e acabar a bateria num momento em que ninguém está acompanhando. (ex.: num fim de semana)
  • Problemas com o hardware do servidor
  • Problemas com o sistema operacional
  • Problemas com o Firebird

Firebird Server SQL Database Missing Pages Corruption

Exemplo simples de corrupção: Índices apontando para páginas de dados que não existem.

Excesso de I/O

Ligar o Forced-Writes sem dúvida aumenta muito a carga de I/O no seu servidor. É o custo da segurança dos seus dados. Desligá-lo indefinidamente apenas para diminuir esta carga é uma escolha da qual você poderá se arrepender mais cedo do que imagina.

Para manter esta segurança e não sentir tanto os efeitos da carga de I/O, considere as seguintes opções:

  • Melhore o subsistema de disco do seu servidor. Não importa qual o modelo atual, sempre há um modelo com maior capacidade de I/O. Consulte seu revendedor de hardware.
  • Diminua a quantidade de leituras em disco. Isto pode ser possível ajustando os parâmetros do seu cache de páginas. A carga total de I/O cairá e você terá melhor resposta do servidor.
  • Reavalie a arquitetura de servidor que está usando. Por exemplo o ClassicServer naturalmente consome muito mais I/O que o SuperServer. Saiba mais.

Exceções

Existem certos cenários onde o Forced-Writes desligado é muito útil.

Por exemplo numa grande carga de dados. É muito mais rápido desligar o Forced-Writes para executar a carga e depois ligá-lo novamente para colocar o banco de dados em produção. Você só precisa ter em mente que os perigos continuam existindo durante aquele período da carga.

Conclusão

Desligar o Forced-Writes pode ser útil em alguns casos isolados. Para o dia-a-dia de um banco de dados em produção o ideal é deixá-lo ligado e encontrar outras maneiras de diminuir a carga de I/O do servidor.

 


mais artigos Firebird

Blog Sinática