dd escreve para CF com atraso

5

Eu tenho um antigo cartão CF de 64MB que eu uso no meu laptop (kernel 2.6.38) com o adaptador CardBus. Se eu escrever uma imagem de 64MB neste cartão CF, a velocidade de gravação será superior a 200MB / s:

T42 ~ # fdisk -lu

Disk /dev/sda: 40.0 GB, 40007761920 bytes
255 heads, 63 sectors/track, 4864 cylinders, total 78140160 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00043afc

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    73947135    36972544   83  Linux
/dev/sda2        73949182    78139391     2095105    5  Extended
/dev/sda5        73949184    78139391     2095104   82  Linux swap / Solaris

Disk /dev/sdb: 64 MB, 64225280 bytes
8 heads, 32 sectors/track, 490 cylinders, total 125440 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *          32      125300       62634+   4  FAT16 <32M
Partition 1 has different physical/logical endings:
     phys=(488, 7, 32) logical=(489, 3, 21)
T42 ~ # mount | grep -i sdb
T42 ~ # time dd if=64MB of=/dev/sdb bs=10M
6+1 records in
6+1 records out
64225280 bytes (64 MB) copied, 0.320419 s, 200 MB/s

real    0m0.624s
user    0m0.000s
sys 0m0.304s
T42 ~ #

64MB dentro de 0,32s obviamente não é realista no caso de cartão CF com 10 anos de idade e se eu remover o cartão do laptop logo após o dd if=64MB of=/dev/sdb bs=10M terminar, vejo muitos erros <timestamp> end_request: I/O error, dev sdb, sector <sector number> na saída dmesg . O que pode causar esse tipo de comportamento?

    
por Martin 26.01.2015 / 10:22

2 respostas

6

Gravações de dispositivos de bloco são armazenadas em buffer pelo kernel. Isso fica claramente visível quando um sistema de arquivos é montado (quando você desmonta, os buffers precisam ser liberados, levando a um atraso às vezes muito longo antes que o umount retorne). Esse atraso está aparentemente piorando à medida que a RAM disponível está ficando maior e maior. Você pode escrever meio GB imediatamente antes que o kernel inicialize a transferência de dados. O kernel pode transparentemente gravar no dispositivo por minutos depois de ver a transferência completa.

Esse recurso é muito bom por vários motivos. Ele permite uma resposta muito mais rápida para leitura e gravação em dispositivos, os dados também podem ser transparentemente lidos no buffer após a gravação, antes que a gravação física real seja concluída. Para discos rígidos que são montados a longo prazo, os agendamentos de kernel são gravados para quando ele tem tempo, enquanto faz o dispositivo responder mais rapidamente da perspectiva do usuário. Especialmente para discos rígidos magnéticos, escrever em grandes blocos sequencialmente também é mais rápido do que escrever pequenos pedaços em vários lugares: os pedaços podem ser classificados e agrupados antes de serem empurrados para o dispositivo físico (embora os discos rígidos também façam algum buffer e classificação de dados internamente em hardware). Em suma, você não percebe muita lentidão do dispositivo e também não percebe atrasos iniciais (no caso de unidades montadas em rede ou discos rígidos que precisam sair da hibernação).

Para acesso direto a um dispositivo de bloco, o armazenamento em buffer é um tanto lamentável, porque você não chama umount e realmente não percebe quando a transferência é concluída. Você deve chamar sync em qualquer caso.

    
por 26.01.2015 / 10:47
3

O sistema operacional está armazenando os dados em cache para dd (e outros comandos), você deve fazer um sync antes de remover o CF e esperar até que a sincronização termine .

O caching / buffering é importante por razões de desempenho e também permite que o kernel / drivers reorganizem as gravações no hardware subjacente, de forma que, por exemplo. todas as gravações em uma única faixa em um HD são feitas na ordem correta de uma só vez (menos movimentos da cabeça).

    
por 26.01.2015 / 10:47

Tags