sistema de arquivos para milhões de arquivos pequenos

44

Qual sistema de arquivos Linux você escolheria para obter a melhor velocidade no seguinte cenário:

  • cem milhões de arquivos
  • ~ Tamanho de arquivo 2k em média
  • > 95% de acesso de leitura
  • acesso bastante aleatório
  • alta simultaneidade (> 100 processos)

Nota: Os arquivos são armazenados em uma árvore hierárquica profunda para evitar diretórios grandes. Cada diretório folha contém cerca de mil arquivos.

Como você avaliaria isso?

bem
fonte
3
Há algumas informações adicionais necessárias. Por exemplo, você está armazenando todos os arquivos em um diretório simples ou em diretórios aninhados (classificados)? Isso pode ter um impacto dramático no desempenho nos tempos de acesso ao arquivo. A peneiração de 100.000.000 de entradas em um arranjo "plano" implicará uma sobrecarga significativa, independentemente do tipo de FS; Na melhor das hipóteses, você está procurando algum tipo de pesquisa em árvore, que ainda exige várias pesquisas para chegar ao seu arquivo. Se você categorizar os arquivos em subdiretórios, o tempo de acesso aumentará significativamente, pois há menos entradas para pesquisar em cada nível.
Avery Payne
O arquivo é acessado em série ou simultaneamente?
Steve Schnepp

Respostas:

19

Aqui estão alguns resultados comparando todos os principais FSes do Linux com bonnie ++ que você pode usar como ponto de partida.

Em termos de buscas aleatórias, Reiser vence, seguido por EXT4, seguido por JFS. Não tenho certeza se isso se correlacionará exatamente com as pesquisas de diretório, mas parece que isso seria um indicador. Você terá que fazer seus próprios testes especificamente. O EXT2 supera tudo em termos de criação de arquivo, provavelmente devido à falta de um diário, ainda o EXT4 supera tudo, exceto o Reiser, que você pode não querer usar devido ao status atual do hans reiser.

Você pode procurar em unidades compatíveis com NCQ e garantir que sua instalação esteja configurada para usá-lo. Sob busca pesada, deve fornecer um aumento de velocidade.

Por fim, verifique se a sua máquina possui uma tonelada de RAM. Como os arquivos não são atualizados com freqüência, o linux acabará armazenando a maioria deles em cache, se houver espaço livre. Se os seus padrões de uso estiverem corretos, isso proporcionará um enorme aumento de velocidade.

Andrew Cholakian
fonte
1
o problema da bonnie ++ é que ele nem sequer aproximadamente testar o meu cenário de uso
bene
2
Você tem razão em não testar as pesquisas de diretório, mas, honestamente, se esse é seu ponto de estrangulamento, é melhor despejar seus dados em um banco de dados real. Sistemas de arquivos não funcionam tão bem nos pequenos objetos a maioria dos bancos de dados são projetados para usar
Andrew Cholakian
7
@AndrewCholakian Link agora está morto.
Don Scott
8

Eu concordo com a maioria do que Andrew disse, exceto que eu recomendaria o Reiser4 ou o ReiserFS mais antigo (mas com melhor suporte) . Como esses testes (e a documentação do ReiserFS) indicam, ele foi projetado para a situação de que você está se perguntando (grande número de arquivos ou diretórios pequenos). Eu usei o ReiserFS no passado com o Gentoo e o Ubuntu sem problemas.

Quanto ao status de Hans Reiser, não o vejo como um problema com o código ou a estabilidade do próprio sistema de arquivos. O Reiser4 é até patrocinado pela DARPA e Linspire, portanto, embora eu concorde que o desenvolvimento adicional do Sistema de Arquivos Reiser seja indeterminado, não acho que isso seja um fator decisivo para se alguém deve usá-lo ou não.

Mike
fonte
3
Eu uso o ReiserFS há muito tempo. Na verdade, ainda estou usando-o em um servidor Gentoo mais antigo que ainda não consegui reinstalar. Esta instalação tem 4 anos em maio. O que posso dizer é que diminuiu significativamente. Esse fenômeno ocorreu ao longo do tempo em todos os sistemas de arquivos usando o ReiserFS que estão em uso ativo de leitura + gravação em todas as máquinas que possuíam esses sistemas de arquivos, sem exceções - portanto, se você deseja usá-lo por um período prolongado, é algo a manter em mente. Eu me afastei dele, usando o XFS para grandes sistemas de arquivos agora.
Mihai Limbăşan
3

Sei que essa não é uma resposta direta à sua pergunta, mas nesses casos acho que um banco de dados pode ser mais adequado para hospedar isso. Arquivos pequenos podem ser armazenados em formato binário em uma tabela de banco de dados e recuperados em wil. O software que está usando esses arquivos deve ser capaz de suportar isso ...

Jeroen Landheer
fonte
1
O que é um sistema de arquivos, se não apenas um banco de dados hierárquico? Sua proposta adiciona camadas de abstração, complexidade e software que provavelmente não são garantidos. Além disso, o proprietário da pergunta está cumprindo sua tarefa com a 'filosofia UNIX', que eu suspeito que você não goste de ser mais um cara do Windows?
Stu Thompson
3
Primeiro de tudo, não tenho nada contra o Unix ou qualquer outra coisa nessa área. Existem grandes diferenças entre sistemas de arquivos e bancos de dados e é por isso que as duas tecnologias foram desenvolvidas. Os bancos de dados são projetados para funcionar com uma enorme quantidade de pequenas entidades, nas quais eles fazem um trabalho melhor do que a maioria dos sistemas de arquivos. Eu estava apenas apontando que pode haver outro caminho que você possa seguir com isso.
Jeroen Landheer
1
E é muito mais fácil "limpar / aspirar" um arquivo db do que desfragmentar um sistema de arquivos no linux. A maioria / todos os fs não fornecem essa funcionalidade, dizendo que não é necessário. Observando o comentário de Mihai acima, porém, você pode ver que não é estritamente verdade.
Gringo Suave
3

Alguém no StackExchange do Unix criou um benchmark (com origem) para testar apenas este cenário:

P: Qual é o sistema de arquivos Linux de mais alto desempenho para armazenar muitos arquivos pequenos (HDD, não SSD)?

O melhor desempenho de leitura parece vir do ReiserFS.

thenickdude
fonte
O Btrfs parece ter resultados melhores ou comparáveis ​​em tudo, exceto na exclusão. Mas, com que frequência você exclui arquivos de 300k? Eu gostei de rfs no passado, mas btrfs pode ser uma aposta melhor para o futuro.
Gringo Suave
3

Na minha experiência, o ext2 sopra o ext4 para fora da água para arquivos pequenos. Se você não se importa com a integridade da gravação, é ótimo. Por exemplo, o subversion cria muitos, muitos e muitos arquivos pequenos, nos quais o ext4 e outros sistemas de arquivos (XFS) se engasgam (execute uma tarefa cron que sincroniza os dados para o ext4 a partir do ext2 a cada meia hora, praticamente resolvendo o problema.)

A execução desses comandos torna o ext2 ainda mais rápido (embora a maioria dessas opções torne o sistema de arquivos instável após uma falha, a menos que você execute a sincronização antes de travar). Esses comandos quase não têm efeito no ext4 com arquivos pequenos.

echo 15 > /proc/sys/vm/swappiness
echo 10 > /proc/sys/vm/vfs_cache_pressure
echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio
echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs
echo "2000" > /proc/sys/vm/vfs_cache_pressure
Jason Hall
fonte
1

Eu acho que ext3 (ou ext4), talvez JFS seria uma boa solução. Eu ficaria cauteloso com ext4 e btrfs (os sistemas de arquivos são complicados - esteja preparado com backups se você quiser usar as coisas mais recentes e mais recentes).

Também existem vários parâmetros que você pode ajustar durante o tempo do mkfs para ajustar o sistema de arquivos ao seu gosto.

Eu certamente recomendaria contra o XFS. Não porque é um sistema de arquivos ruim, mas a criação / exclusão é uma operação cara.


Para evitar problemas com pesquisas de diretório, use um esquema de nomeação inteligente, por exemplo:

<first letter of id>_<last letter of id>/<id>

ou similares, esquemas mais complicados. Isso irá acelerar as pesquisas no diretório e, portanto, as velocidades gerais de acesso. (É um velho truque unix, de volta da V7, eu acho)


fonte
1
qual é a vantagem de usar a primeira e a última letra e não apenas as primeiras n letras?
11119 bene
é apenas um dos esquemas possíveis - se seria uma vantagem depende da "chave" usada para indexação. Esse esquema em particular que eu tinha visto foi referenciado a um aplicativo que armazenava dados de pessoas na organização e, dessa forma, eles obtinham melhor indexação. Como sempre, é preciso adaptá-lo aos seus dados e, em seguida perfil até encontrar respostas exatas :)
1

A maioria dos FSs engasga com mais de 65K arquivos em um diretório, acho que isso ainda é verdade no ext4. Os sistemas de arquivos Reiser não têm esse limite (o pessoal do mp3.com pagou para garantir isso). Não tenho certeza de mais nada, mas esse é um dos cenários de uso para os quais o ReiserFS foi criado.

Ronald Pottol
fonte
1
É ReiserFS, não RieserFS
Daniel Rikowski
Neste fim de semana, eu tinha um diretório no ext4 com 1000000 arquivos nele. Contanto que você não faça lsou conclua a guia, ele funciona rapidamente. Provavelmente devido ao índice.
precisa saber é o seguinte
ext4 tem uma extensão dir_index, que acelera muitos arquivos em um diretório.
Alfonx