-
Eu iria discutir sobre o seu texto. Eu diria que os comandos (1) e (2) estão sobre - escrevendo o sistema de arquivos, caso existam; isto é, ignorando-o e destruindo-o (se houver). Eles se comportarão da mesma maneira se o dispositivo tiver um sistema de arquivos na mão antes ou não.
Enquanto isso, os comandos (3) e (4) estão gravando no sistema de arquivos, ou através dele .
-
Sim, claro, o fato de que os comandos (3) e (4) estão passando pelo código do sistema de arquivos É por isso que você obtém a diferença de desempenho. (Continuação no parágrafo 4).
-
Eu não vejo por que o fato de o sistema de arquivos ser NTFS é realmente significativo. Eu suspeito que você obteria resultados semelhantes com qualquer tipo de sistema de arquivos; por exemplo, um da família ext.
-
Para construir sobre o ponto 2: Primeiro de tudo, E / S de sistema de arquivos ignora em grande parte
bs=anything
eoflag=direct
. O código do sistema de arquivos provavelmente trata de uma gravação de 1M como 2048 escreve de 512 bytes, ou talvez 256 gravações de 4K bytes. Em segundo lugar, o código do sistema de arquivos tem o trabalho de manter a integridade do sistema de arquivos. Isso significa que, toda vez que ele estender seutempfile
, ele deve alocar blocos da lista livre e alocá-los ao arquivo. Isso significa que ele deve estar continuamente modificando a lista livre e o inode do arquivo (ou equivalente em qualquer que seja o tipo de sistema de arquivos). Isso significa não apenas (potencialmente) três gravações reais para cada gravação visível pelo usuário, mas que as gravações seriam não contíguas, e a unidade estaria procurando por todo o lugar. Além disso, se o sistema de arquivos estiver em uso por um tempo, a lista livre pode ter ficado fora de ordem, e assim os blocos alocados para o arquivo podem ser não-contíguos.
Sugestões:
- Faça os testes (3) e (4) depois de um
mkfs
, para que o sistema de arquivos esteja limpo. Em seguida, repita-os com o arquivo já existente. Isso deve diminuir a quantidade de E / S de contabilidade. - Repita todos os testes com
bs
no intervalo de 512-4K. Os resultados para os testes (3) e (4) devem estar quase inalterados, enquanto aqueles para os testes (1) e (2) devem ser muito mais baixos.