Il tuo problema probabilmente non è con il tuo computer, di per sé, probabilmente va bene. Ma quel livello di transizione flash USB ha un proprio processore che deve mappare tutte le tue scritture per compensare quello che potrebbe essere un chip flash difettoso al 90%, chi lo sa? Lo allaghi, poi allaghi i tuoi buffer, quindi allaghi l'intero bus, poi sei bloccato, amico - dopo tutto, è lì che si trova tutta la tua roba. Può sembrare controintuitivo, ma ciò di cui hai davvero bisogno è bloccare l'I / O: devi lasciare che FTL stabilisca il ritmo e poi tenere il passo.
(Per hackerare i microcontrollori FTL: http://www.bunniestudios.com/blog/?p=3554 )
Tutte le risposte sopra dovrebbero funzionare, quindi questo è più un "anch'io!" di ogni altra cosa: ci sono stato totalmente, amico. Ho risolto i miei problemi con rsync's --bwlimit arg di (2,5 Mb sembrava essere il punto debole per una singola corsa senza errori - niente di più e finirei con errori di protezione da scrittura). rsync era particolarmente adatto al mio scopo perché stavo lavorando con interi filesystem - quindi c'erano molti file - e semplicemente eseguire rsync una seconda volta avrebbe risolto tutti i problemi della prima esecuzione (che era necessario quando sarei diventato impaziente e avrei provato superare 2,5 mbs).
Tuttavia, suppongo che non sia altrettanto pratico per un singolo file. Nel tuo caso potresti semplicemente pipe per dd impostato su raw-write - puoi gestire qualsiasi input in quel modo, ma solo un file di destinazione alla volta (anche se quel singolo file potrebbe essere un intero dispositivo a blocchi, ovviamente).
## OBTAIN OPTIMAL IO VALUE FOR TARGET HOST DEV ##
## IT'S IMPORTANT THAT YOUR "bs" VALUE IS A MULTIPLE ##
## OF YOUR TARGET DEV'S SECTOR SIZE (USUALLY 512b) ##
% bs=$(blockdev --getoptio /local/target/dev)
## START LISTENING; PIPE OUT ON INPUT ##
% nc -l -p $PORT | lz4 |\
## PIPE THROUGH DECOMPRESSOR TO DD ##
> dd bs=$bs of=/mnt/local/target.file \
## AND BE SURE DD'S FLAGS DECLARE RAW IO ##
> conv=fsync oflag=direct,sync,nocache
## OUR RECEIVER'S WAITING; DIAL REMOTE TO BEGIN ##
% ssh user@remote.host <<-REMOTECMD
## JUST REVERSED; NO RAW IO FLAGS NEEDED HERE, THOUGH ##
> dd if=/remote/source.file bs=$bs |\
> lz4 -9 | nc local.target.domain $PORT
> REMOTECMD
Potresti trovare netcat un po 'più veloce di ssh per il trasporto dei dati se ci dai una possibilità. Ad ogni modo, le altre idee erano già state prese, quindi perché no?
[EDIT]: ho notato le menzioni di lftp, scp e ssh nell'altro post e ho pensato che stessimo parlando di una copia remota. Il locale è molto più semplice:
% bs=$(blockdev --getoptio /local/target/dev)
% dd if=/src/fi.le bs=$bs iflag=fullblock of=/tgt/fi.le \
> conv=fsync oflag=direct,sync,nocache
[EDIT2]: Ringraziamenti dove è dovuto: ho appena notato che ptman mi ha battuto su questo per circa cinque ore nei commenti.
Sicuramente potresti mettere a punto $ bs per le prestazioni qui con un moltiplicatore, ma alcuni filesystem potrebbero richiedere che sia un multiplo della dimensione settoriale del fs di destinazione, quindi tienilo a mente.
ionice
può essere utilizzato per garantire che il processo di copia da disco a disco sia pianificato l'I / O con una priorità inferiore rispetto ai processi normali.