Diferenças de desempenho ao gravar em / dev / sda e em / mnt / sda / tempfile

3

Estou testando meu novo SSD PCI-E no Linux.

Estou usando o seguinte comando para testar seu desempenho (referência: link )

(1) dd if = / dev / zero de = / dev / nvme0n1 bs = contagem de 1M = 2048 - > 2,2 GB / s

(2) dd se = / dev / zero de = / dev / nvme0n1 bs = 1M contagem = 2048 oflag = direto - > 2,2 GB / s

(3) dd if = / dev / zero de = / mnt / nvme0n1 / tempfile bs = contagem de 1M = 2048 - > 80 MB / seg

(4) dd se = / dev / zero de = / mnt / nvme0n1 / tempfile bs = 1M contagem = 2048 oflag = direto - > 800MB / seg

Meus palpites são os seguintes: (3, 4) está escrevendo sobre o sistema de arquivos (formatado como NTFS por alguns motivos).  No entanto, (1, 2) está gravando diretamente no dispositivo de bloco, o que não gera sobrecarga no sistema de arquivos.

Estou correto ou não? Você pode me dar algumas explicações sobre isso?

Obrigado

    
por syko 06.12.2015 / 09:12

1 resposta

4
  1. 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 .

  2. 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).

  3. 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.

  4. Para construir sobre o ponto 2: Primeiro de tudo, E / S de sistema de arquivos ignora em grande parte bs=anything e oflag=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 seu tempfile , 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.
por 06.12.2015 / 10:20