Escrever na subpasta é mais rápido do que escrever no pai

6

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 ?

rocksportrocker
fonte
1
Eu tenho medidas semelhantes em 13.10. Aproximadamente um aumento de velocidade de 50%.
Captain Giraffe
1
Eu acho que isso pertence ao SU. Você não mencionou o sistema de arquivos, provavelmente é o ext4. Meu palpite seria que / data é uma partição e que a transferência na raiz dessa partição é mais rápida, pois se beneficia das otimizações ext4, incluindo "O quarto truque é que todos os inodes em um diretório são colocados no mesmo grupo de blocos como o diretório, quando possível. " ( ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout )
Paul Guyot
É ext4 e / data é uma partição e esse efeito ocorre apenas nas raízes da partição! Você pode escrever uma resposta regular para que eu possa aceitá-la?
Rocksportrocker

Respostas:

4

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.

O quinto truque é que o volume do disco é dividido em grupos de blocos de 128 MB. […] Quando um diretório é criado no diretório raiz, o alocador de inode verifica os grupos de blocos e coloca esse diretório no grupo de blocos menos carregado que pode encontrar.

Como resultado, emzed2provavelmente foi criado em um bloco vazio de 128 MB.

O quarto truque é que todos os inodes em um diretório são colocados no mesmo grupo de blocos que o diretório, quando possível.

Conseqüentemente, /data/testfileé criado no grupo de blocos raiz (provavelmente muito carregado), enquanto /data/emzed2/testfileé criado no emzed2grupo de blocos (provavelmente vazio) .

O terceiro truque […] é que ele tenta manter os blocos de dados de um arquivo no mesmo grupo de blocos que seu inode.

Pois /data/emzed2/testfile, o sistema de arquivos alocará primeiro todos os blocos de dados no emzed2grupo 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.

Paul Guyot
fonte