A transferência entre discos internos fica lenta para arquivos grandes

2

Estou executando um Ubuntu Server 11.04 (amd64) em uma máquina com unidades de CPU dual-core de 1,6 GHz, 4 GB de RAM e 7200 SATA de 2 GB (ambas de 3,0 Gb / se recém-formatadas de uma nova instalação). Quando transfiro arquivos relativamente pequenos (~ 100MB) entre as duas unidades, obtenho taxas de transferência que são (melhor) que o esperado, na faixa de 300-350MB / s. No entanto, a transferência de um arquivo de 500MB atinge cerca de 50MB / seg, enquanto um arquivo de 1GB atinge cerca de 25MB / seg.

Aqui estão alguns testes que eu executei para mostrar esse comportamento:

/disk1 $ dd if=/dev/zero of=output-small.dat bs=1M count=128
 bytes (134 MB) copied, 0.388619 s, 345 MB/s
/disk1 $ dd if=/dev/zero of=output-med.dat bs=1M count=500
524288000 bytes (524 MB) copied, 20.0151 s, 26.2 MB/s
/disk1 $ dd if=/dev/zero of=output-large.dat bs=1M count=1000
1048576000 bytes (1.0 GB) copied, 45.7304 s, 22.9 MB/s

/disk2 $ dd if=/dev/zero of=output-small.dat bs=1M count=128
134217728 bytes (134 MB) copied, 0.372266 s, 361 MB/s
/disk2 $ dd if=/dev/zero of=output-med.dat bs=1M count=500
524288000 bytes (524 MB) copied, 10.0856 s, 52.0 MB/s
/disk2 $ dd if=/dev/zero of=output-large.dat bs=1M count=1000
1048576000 bytes (1.0 GB) copied, 37.1851 s, 28.2 MB/s

$ time cp /disk1/output-small.dat /disk2/test-small.dat
real    0m0.532s
user    0m0.000s
sys     0m0.410s

$ time cp output-med.dat /playpen/test-med.dat
real    0m30.879s
user    0m0.010s
sys     0m3.740s

$ time cp /disk1/output-large.dat /disk2/test-large.dat
real    0m26.643s
user    0m0.010s
sys     0m3.390s

Por fim, ao executar o comando pv < /disk1/output-large.dat > /disk2/test.dat , vejo inicialmente excelentes velocidades de transferência, mas a taxa cai para o intervalo de 1 a 10 MB / s, saltando periodicamente (muito) mais alto. Eu sei que esta não é uma medida particularmente útil do desempenho do disco, já que estou passando por pv, mas é um desempenho consistente com meus outros testes.

Eu tenho algumas perguntas:

  • O que poderia fazer com que minhas velocidades de transferência diminuíssem com arquivos maiores? Não deveria estar aumentando?
  • Que velocidades devo esperar para ver com esse tipo de configuração?
  • O tempo gasto (presumivelmente) esperando no IO (de time , real - sys ) parece suspeitamente alto para mim. É?
por Shaddi 12.06.2011 / 22:16

2 respostas

1

Arquivos pequenos cabem no cache da página, assim o teste é concluído antes que o material esteja no disco. Tente adicionar a opção conv = fsync ao dd.

Para o arquivo de 1 GB, talvez você esteja se deparando com alguns efeitos colaterais do write-back, resultando em uma taxa de transferência menor do que os discos devem ser capazes de manipular. Você poderia tentar as opções dd iflag = direct e oflag = direct para ignorar o cache da página e ver como isso afeta o resultado.

    
por 12.06.2011 / 22:34
0

Você pode estar vendo um efeito de armazenamento em cache de arquivos. Você pode definir iflag ou oflag como nocache e testar novamente, assim você verá uma velocidade bruta baseada em mídia, e não velocidades de buffer para buffer.

    
por 12.06.2011 / 22:39