O ZFS realmente distribui todos os vdev, mesmo em zpools muito grandes?

3

Eu li que o ZFS distribui os dados em um zpool em todos os vdevs de nível superior, supondo que todos os vdevs tenham sido adicionados no início da vida útil do pool. Tudo o que li parece considerar isso uma coisa boa. Mas, parece-me que para implantações com muitos discos, isso não levará a um bom desempenho geral de todos esses discos em um ambiente multiusuário (ou mesmo em vários processos).

Suponha, por exemplo, que eu tenha 96 discos, que eu uso para criar 12 vdevs de 8 discos cada, os quais eu adiciono ao meu zpool. Então eu solto para os usuários e eles preenchem todos os tipos de loucura. Alguns arquivos são dezenas de gigabytes, outros são pequenos arquivos de configuração de aplicativos do usuário, etc.

Mais tarde, o usuário A deseja copiar alguns arquivos de vários gigabytes. Ela inicia um rsync ou algo assim, e experimenta um desempenho incrível a partir das leituras seqüenciais subjacentes dos 12 vdevs distribuídos. Mas o usuário B aciona outro aplicativo que também solicita grandes quantidades de dados de cada vez. Agora, os responsáveis pelas unidades estão constantemente recebendo o rsync do usuário A para lidar com o usuário B, e embora cada aplicativo seja individualmente relativamente sequencial, os 96 discos estão envolvidos nas solicitações dos usuários e vê padrões de busca e desempenho mais consistentes O.

Nesta configuração de 12 vdevs de 8 discos, cada vdev ainda tem o desempenho de 8 discos, portanto, espero que a E / S sequencial seja muito boa, mesmo sem distribuição adicional em outros vdevs. Não seria melhor para o ZFS colocar muitos gigabytes em um vdev antes de passar para outro? (Nos meus experimentos, estou obtendo faixas em torno de 500k). Dessa forma, as leituras do usuário A teriam apenas 1/12 de chance de usar os mesmos discos que as leituras do usuário B, e ambos teriam desempenho consistente com I / A maior parte do tempo.

Existe uma maneira de obter um bom desempenho do ZFS nessa configuração / carga de trabalho?

    
por mbaynton 13.04.2014 / 04:40

1 resposta

1

O ZFS sempre distribui todos os vdevs , embora dependa de quantos blocos são necessários ao arquivo - arquivos pequenos geralmente caberão em um único bloco e, assim, serão colocados em um único vdev, a menos que pertençam a conjunto de dados configurado com copies = 2 ou copies = 3 .

Não, você não pode mudar isso ou dividir sem criar pools separados.

Para melhorar o desempenho com essa configuração distribuída, o ZFS inclui seu próprio agendador de I / O no componente ZIO (e é por isso que os agendadores de prazo de prazo ou noop são recomendados) .

Outra camada que melhora tais cargas de trabalho é o ARC que, entre outras coisas, inclui o cache de pré-busca. Você pode acelerar o ARC com o L2ARC em dispositivos rápidos separados, com o equivalente para gravações síncronas sendo SLOG (dispositivos ZIL dedicados).

    
por 05.05.2014 / 01:32

Tags