Eu uso o dd para medir o desempenho da gravação e observei algo estranho: gravar em / data / emzed2 é mais rápido do que gravar em / data. Foi assim que medi o desempenho:
$ dd se = / dev / zero de = / data / emzed2 / testfile bs = 32
^ C4921834 + 0 registros em
4921834 + 0 registros 157498688 bytes (157 MB) copiados, 2,87329 s, 54,8 MB / s
$ dd se = / dev / zero de = / data / testfile bs = 32
^ C2487991 + 0 registros em
2487991 + 0 registra 79615712 bytes (80 MB) copiados, 2.6501 s, 30,0 MB / s
ambas as pastas estão na mesma partição em uma unidade SSD. Eu uso o Ubuntu 14.04 e repeti o experimento várias vezes com resultados semelhantes.
Alguma idéia do que está acontecendo ?
performance
io
rocksportrocker
fonte
fonte
Respostas:
Parece que você é atingido por otimizações ext4 . Alguns deles estão descritos na documentação do Ext4 Disk Layout .
Sempre que você aumenta um arquivo, por exemplo, com dd, algum lugar é alocado para os novos dados. Eventualmente, o arquivo pode ser fragmentado, ou seja, os dados podem ser espalhados em vários pedaços através do disco. A fragmentação é uma fonte bem conhecida de lentidão (ao ler e gravar) e, portanto, as implementações do sistema de arquivos geralmente tentam evitá-la. A fragmentação é muito mais cara com discos giratórios (o cabeçote precisa percorrer pedaços sucessivos) do que com o SSD, mas a maioria das implementações de sistemas de arquivos usa estratégias otimizadas com o SSD.
Uma combinação dos terceiro, quarto e quinto "truques" descritos na documentação mencionada acima pode explicar por que a gravação no subdiretório é mais rápida no seu caso.
Como resultado,
emzed2
provavelmente foi criado em um bloco vazio de 128 MB.Conseqüentemente,
/data/testfile
é criado no grupo de blocos raiz (provavelmente muito carregado), enquanto/data/emzed2/testfile
é criado noemzed2
grupo de blocos (provavelmente vazio) .Pois
/data/emzed2/testfile
, o sistema de arquivos alocará primeiro todos os blocos de dados noemzed2
grupo de blocos. Se esse bloco estava inicialmente vazio, nos primeiros 128 MB, isso significa que não há fragmentação. Pois/data/testfile
, o sistema de arquivos primeiro preencherá o grupo de blocos raiz, se ainda não estiver preenchido, e depois procurará outros locais para armazenar dados.Além disso, você está aumentando o arquivo 32 bytes por vez. Felizmente, sistemas de arquivos como o ext4 alocam mais dados do que o solicitado (em pedaços de 8kb no caso do ext4) e tentam atrasar a alocação. Você provavelmente veria um padrão semelhante com
bs=8196
, mas a diferença de velocidade pode diminuir com tamanhos de bloco maiores.fonte