Eu tenho um servidor de banco de dados orientado a objetos de terceiros em execução em uma máquina Windows Server 2003 x64 com 24 GB de RAM. Exceto por alguns processos do sistema e ferramentas de monitoramento, o servidor de banco de dados é a única coisa que está sendo executada nesta máquina. Eu abri dez ~ 130GB e um arquivo de banco de dados de ~ 5GB, o último dos quais é acessado com mais freqüência e é o que está me dando problemas.
Sempre que o servidor de banco de dados libera esse arquivo de banco de dados, parece demorar uma eternidade para ser concluído. Como o DBMS irá descartar seu log de transação assim que os dados forem gravados no disco, ele deverá aguardar a conclusão do flush.
Eu olhei para o arquivo IO em Process Monitor e vi que durante a operação normal antes do flushing, há muitas gravações em buffer (normalmente 128 Bytes, às vezes um pouco mais) aleatoriamente offsets no arquivo. Isso é esperado, pois pequenos pedaços de dados são adicionados e atualizados no banco de dados sem nenhum padrão previsível.
Quando o log de transações está cheio e ocorre um flush, houve cerca de 8000 gravações em múltiplos de 4K (o tamanho da página na máquina em questão), totalizando cerca de 35 MB na instância que analisei. O flush demorou cerca de 12 segundos para ser concluído, durante o qual o servidor de banco de dados parou. Nossos armazenistas me dizem que 1,5ms por gravação (12 segundos divididos por 8000 gravações) representam o desempenho normal da SAN e não há nada que eles possam fazer para acelerar isso.
Eu li sobre a maneira como o armazenamento em cache de arquivos funciona em Windows Internals 4 , e menciona que o gerenciador de cache tentará gravar páginas sujas em intervalos regulares em um thread em segundo plano mesmo quando o aplicação não requer um flush (escritor preguiçoso). Existe alguma maneira de fazer com que ele grave páginas no disco mais rápido, então quando o aplicativo chama FlushFileBuffers
, restam apenas algumas páginas sujas que o aplicativo teria que esperar para serem gravadas no disco?
O livro também menciona que há apenas uma cópia de qualquer arquivo no gerenciador de cache. Isso significa que eu poderia acionar um flush abrindo o mesmo arquivo em um processo separado e regularmente chamando FlushFileBuffers
nele, então, novamente, haveria menos para liberar quando o servidor de banco de dados solicitar um flush?
Existe algum outro parâmetro operacional ou de sistema de arquivos que eu deva investigar?
Uma recomendação que ouvi foi aumentar o tamanho da página no sistema de arquivos, pois isso aumentaria o rendimento aumentando o número de bytes gravados na SAN por IO. Já que as páginas salvas durante um flush não são consecutivas e estão longe, duvido que isso faça alguma coisa, certo?
Tags cache io windows-server-2003