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, emzed2
provavelmente 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 emzed2
grupo 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 emzed2
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.