Desempenho insatisfatório do NFS usando vários discos

3

Eu tenho um sistema de servidor rodando o Ubuntu 12.10 com 12 discos conectados. Estou compartilhando todos esses discos na minha rede de 10 gigabits usando o NFSv4. No entanto, estou obtendo um desempenho geralmente baixo sobre o NFS em comparação com o desempenho que posso obter localmente. A solução geral que eu encontrei na minha pesquisa para baixo desempenho do NFS é usar a opção async no arquivo de exportação do servidor em vez da sincronização. No entanto, isso simplesmente não é uma opção para meus propósitos. Eu entendo que isso irá introduzir um impacto no desempenho, mas eu não esperaria na medida em que estou vendo.

Acho que quanto mais discos eu uso ativamente no cliente NFS, pior é minha taxa de transferência por disco. Por exemplo, se eu usar ativamente apenas 1 disco, posso escrever a 60MB / s. No entanto, se eu usar ativamente todos os 12 discos, só posso gravar em 12 MB / s por disco. Testes locais equivalentes podem render 200MB / s por disco sem nenhum problema. Existem alguns ajustes que podem ser feitos para otimizar o desempenho do NFS em vários discos? Não parece que a CPU ou a memória estejam sendo muito utilizadas enquanto o servidor está sendo usado ativamente.

    
por Joe Swanson 18.09.2013 / 08:16

1 resposta

2

Parece que as gravações de sincronização são as culpadas aqui, e infelizmente não há muito o que fazer quando as gravações síncronas são um requisito para o sistema.

O problema se deve ao fato de que o sistema remoto que está gravando os dados deve esperar que todo o bloco do sistema de arquivos seja gravado antes de escrever o próximo. Com blocos pequenos, isso prejudicará o desempenho, como você viu.

Não há uma boa solução para esse problema, mas aqui estão algumas opções possíveis para aliviar o gargalo:

  • Aumente o tamanho do bloco para poder gravar mais dados por operação.

  • Obtenha um dispositivo SSD ou NVRAM rápido separado para gravação em cache / registro no diário. Isso melhorará significativamente sua taxa de transferência para todas as cargas de trabalho. Isso pode ser feito com o ext4 usando o comando tune2fs (8) no Ubuntu, e adicionando um dispositivo de diário externo com o parâmetro -J .

  • Divida o compartilhamento NFS em um dedicado para gravações de sincronização e o outro com gravações assíncronas. Dessa forma, você pode colocar quaisquer dados não críticos no compartilhamento assíncrono para melhorar o rendimento dessa carga de trabalho de forma independente.

  • Tente um sistema de arquivos diferente que permita fazer o cache de gravação estável de forma nativa. Eu uso ZFS em FreeBSD em minha SAN com um log de intenção com backup de SSD (equivalente ao diário no ext4). Eu nunca tentei o ZFS no Linux , mas parece ser um projeto maduro agora. Minha taxa de transferência de leitura e gravação sobre o iSCSI melhorou significativamente após a adição de SSDs. Não tenho certeza de sua familiaridade com o ZFS, mas se você não sabe, o objetivo do ZIL (ZFS Intent Log) é fornecer um cache de gravação em um armazenamento rápido e estável, como um SSD. O registro será periodicamente confirmado no disco em grupos de transações para garantir que os dados não sejam perdidos e, no caso de uma queda de energia, as gravações podem ser reproduzidas a partir do registro para restaurar a integridade do sistema de arquivos.

Encontrei esse problema no passado e realmente não encontrei uma boa maneira de eliminar totalmente o problema. Se você descobrir outras formas de atenuar o problema, por favor me avise!

    
por 20.09.2013 / 23:37