O Linux tem o mesmo "problema". Aqui é um trabalho um estudante meu publicado há dois anos, onde o efeito é mostrado no Linux . Os vários pedidos de veiculação podem ter várias origens:
- Pesquisa de diretório em cada nível de diretório do caminho do arquivo. Pode ser necessário ler o diretório inode e um ou mais blocos de entradas de diretório
- Inode do arquivo
No padrão normal de IO, o armazenamento em cache é realmente efetivo e inodes, diretórios e blocos de dados são alocados de maneira a reduzir buscas. No entanto, o método de pesquisa normal, que na verdade é compartilhado por todos os sistemas de arquivos, é ruim para o tráfego altamente aleatório.
Aqui estão algumas ideias:
1) Os caches relacionados ao sistema de arquivos ajudam. Um cache grande absorverá a maioria das leituras. No entanto, se você quiser colocar vários discos em uma máquina, a proporção de disco para RAM limita o quanto é armazenado em cache.
2) Não use milhões de arquivos pequenos. Agregue-os a arquivos maiores e armazene o nome do arquivo e o deslocamento dentro do arquivo.
3) Coloque ou armazene em cache os metadados em um SSD.
4) E, claro, usar um sistema de arquivos que não tenha um formato de diretório totalmente anárquico no disco. Um readdir não deve demorar mais do que o tempo linear, e direcionar o acesso a arquivos idealmente apenas no tempo logarítmico.
Manter diretórios pequenos (menos de 1000) não deve ajudar muito, porque você precisaria de mais diretórios com necessidade de armazenamento em cache.