Eu comecei tentando fazer alguns testes de desempenho simples. "Qual destes discos é mais rápido e por quanto" tipo de coisas. Não precisei de muita precisão, só queria uma ideia aproximada. Transformou-se em uma incursão estranha nos aspectos internos de How Things Work. Meio divertido, na verdade, mas um pouco estranho.
Antes de prosseguir, direi que tudo neste artigo é feito em um sistema Arch Linux, executando um kernel 3.0, com uma unidade de disco SATA Western Digital WD30EZRX 3TB removida de um gabinete MyBook Essential USB3 (esses gabinetes não coisas malvadas aos seus dados) e instaladas em um gabinete USB3 de disco único Sans Digital, conectado por meio de uma placa de 1 pista Buffalo USB3 PCIe. A unidade é o único dispositivo nessa placa USB e o sistema fica inativo durante o tempo dos testes.
Eu escrevi um programa de teste de desempenho, um programa C simples para abrir um arquivo, escrever quatro GiB de dados nele, fsync () e sair. Eu executei o teste 9 vezes (um número arbitrário, porque eu queria dígitos únicos, mas esqueci de começar no zero) em um sistema de arquivos ext4 todo em disco, e obtive 58-59 segundos por execução, cerca de 73 MB / seg. Não é o disco mais rápido do mundo, mas os resultados foram bastante consistentes.
Por razões que eu não lembro mais, não esperava nenhum problema, voltei e fiz o mesmo teste algumas horas depois, depois de desconectar o disco para testar outro, conectando o disco original de volta e refazendo o disco. mkfs. Para minha surpresa, obtive resultados muito diferentes. Desta vez, obtive resultados no intervalo de 51-52 segundos (83 MB / seg), com 2 mais perto de 48 segundos.
Horas depois, depois de fazer algumas pesquisas, incluindo fazer uma pergunta aqui sobre como descobrir quais blocos de disco são usados por um arquivo, executei outro teste no mesmo disco sem reinicializar. Acabei de criar novos arquivos no mesmo diretório (a raiz do sistema de arquivos) como o teste anterior. Dessa vez, obtive resultados no intervalo de 44 a 45 segundos (96 MB / s).
Mais tarde, executei mais três testes (refinando meu procedimento de teste, na verdade), novamente apenas colocando os arquivos ao lado dos existentes, e obtive desempenho de 44 segundos, 45 segundos e 50 segundos. Esses três grupos de corridas estavam bem próximos um do outro. Tenha em mente que ainda não estou falando sobre execuções individuais. Eu corri o programa de testes 9 vezes, todos com resultados de 44 segundos, outros 9 vezes, todos com resultados de 45 segundos, e mais 9 vezes, todos com resultados de 50 segundos.
Estas são algumas diferenças muito grandes e muito estranhamente agrupadas.
Eu usei debugfs para verificar quais blocos os arquivos estão usando, e não há nada "engraçado" acontecendo lá. Cada arquivo parece receber os próximos blocos disponíveis, em seqüência, começando do começo do disco.
A única coisa em que consigo pensar que poderia explicar isso seria se o circuito do disco estivesse de alguma forma alocando blocos de diferentes partes do disco e apresentando-os ao host como contíguos. Para os resultados que estou vendo, teria que estar percebendo o atraso entre meus testes e usando isso como uma oportunidade de mudar para uma parte diferente do disco para alocação.
Francamente, isso parece um pouco difícil para mim, mas eu não tenho muitas outras ideias.
Alguém pode esclarecer isso? Por que estou obtendo resultados tão consistentes globalmente e globalmente variáveis?