Novo XFS: Um Sistema de Arquivos Eficiente

Existe no mercado grande preocupação com performance de aplicações. Muito investimento é feito no desenvolvimento de softwares que consigam utilizar da melhor forma possível os recursos computacionais atuais. Mais notadamente CPU, I/O e Memória. E grande êxito tem sido alcançado. No entanto, existe um detalhe que muitas vezes não é considerado de forma adequada: O sistema de arquivos. Muitos acreditam que os recentes EXT4 e BTRFS são a solução para estes problemas. Mas nem sempre. Estes FS são baseados em um conceito antigo, de uma época em que não existiam os multicores. A falha não é de implementação, mas de design. Da forma como foram concebidos, quando são executados por uma plataforma multi-processada (8 Cores ou 8 CPUs, por exemplo), sofrem pelas limitações do paralelismo, onde chegamos a um ponto onde mais passa a ser menos. É isso mesmo, eu não estou ficando louco. Vou explicar:

O custo de comunicação é alto, pois além da própria transmissão, temos o protocolo usado para isso, o que estabelece um “compromisso” entre grau de paralelismo e desempenho. Este compromisso chama-se granularidade, e é o elemento básico que será executado em paralelo. Meio confuso, certo? Na verdade não. Agora você vai captar a mensagem:

  • Granularidade Fina: Um conjunto pequeno de instruções são executadas em paralelo.
  • Granularidade Média: Funções são executadas em paralelo, através de threads.
  • Granularidade Grossa: Processos com grande quantidade de código são executados em paralelo.

Resumindo:

  • Granularidade Fina = Alta Comunicação / Menor Performance.
  • Granularidade Grossa = Pouca Comunicação / Maior Performance.

Isso me lembra da Lei de Amdahl, que rege o desempenho de aplicações paralelas, onde:

T1 é o tempo de execução serial em 1 processador, e TP é o tempo de execução paralela em “P” processadores. Com isso você calcula uma coisa chamada “speed-up”:

Sp=T1/TP
Tp=sT1+(1-s) T1/p
Sp=p/(sp+(1-s))

A essa hora você deve estar pensando: “Caramba André, que palhaçada é essa?”. Desculpe. Melhor parar antes que você me xingue…

O que eu quero mesmo que você saiba é:

  1. Um sistema é escalável quando permanece eficiente quando há aumento de recursos.
  2. Paralelismo é quando um mesmo processo pode executar em mais de um processador.

Mas o que isso tem a ver com XFS? Tudo!

Fato: A partir de 4 Cores e um certo volume de dados, a performance da grande maioria dos FS começa a degradar, em especial, com operações que geram uma grande quantidade de metadados (dados que descrevem ou geram outros dados, como por exemplo, um datawarehouse, as tabelas de um banco de dados ou ainda descompactar um arquivo).

Para resolver estes problemas, o XFS passou por um processo de upgrade que levou vários anos para ser concluído, e culminou na implementação de uma técnica chamada delayed logging (atualizações no journal são atrasadas e as escritas que seriam realizadas a um mesmo bloco, passaram a ser combinadas e aplicadas uma única vez), ao mesmo tempo em que manteve compatibilidade com as versões anteriores. Captou? Foi feito um trabalho em cima da granularidade! Imagino que estas alterações de algoritmo devem ter gerado um esforço imenso…

Só para esclarecer, um journal é como se fosse um log binário, utilizado para facilitar a vida do FS na hora de se recuperar de uma falha de escrita ou um shutdown forçado, onde os FS não são desmontados corretamente.
No passado, a performance do XFS para tratamento de metadados era bem ruim, pois imensas quantidades de journal eram geradas. Mas a partir do Kernel 3.3, este e outros problemas foram solucionados. Agora o XFS consegue escalar de forma linear por todos os cores de um CPU, aumentando cada vez mais a performance. Ou seja, em uma realidade multicore como a que vivemos, não importa a quantidade de dados/metadados: quanto mais CPU, maior a capacidade para ler e escrever de forma eficiente em um disco preparado com XFS. Ok, uma boa controladora de discos ajuda, mas não faz milagres.

Mas quão rápido ficou o XFS depois do upgrade?

Comparando com o EXT4, até 4 cores, este último tem uma performance ligeiramente maior, mas quando escalamos para 8 cores, a performance do EXT4 começa a degradar (lembra do limite do paralelismo?), ao mesmo tempo em que a performance do XFS aumenta exponencialmente. É literalmente um “perdeu, playboy!” 🙂

Vamos ilustrar de forma gráfica para facilitar o entendimento:

Rápido, não?

É provável que em um futuro próximo muitas plataformas, em especial as destinadas à execução de datawarehouses, passem a adotar o XFS como sistema de arquivos padrão.

Eu já estou homologando o novo XFS em alguns ambientes, e tem funcionado muito bem!

Quer tirar suas próprias conclusões? É simples: basta atualizar o Kernel do seu SO para versão 3.3+ e formatar algum disco com XFS. Após, use o software fs-mark para fazer os testes de performance.

Um abraço!