Twój problem prawdopodobnie nie dotyczy komputera, prawdopodobnie jest w porządku. Ale ta warstwa przejściowa pamięci flash USB ma własny procesor, który musi odwzorować wszystkie twoje zapisy, aby zrekompensować coś, co może być wadliwym układem flash w 90%, kto wie? Zalewacie go, potem zalewacie bufory, zalewacie cały autobus, potem utknęliście, stary - w końcu tam są wszystkie rzeczy. Może to zabrzmieć sprzecznie z intuicją, ale tak naprawdę potrzebujesz blokowania I / O - musisz pozwolić FTL ustawić tempo, a następnie po prostu nadążyć.
(O włamywaniu mikrokontrolerów FTL: http://www.bunniestudios.com/blog/?p=3554 )
Wszystkie powyższe odpowiedzi powinny działać, więc jest to bardziej „ja też!” niż cokolwiek innego: byłem tam całkowicie, stary. Rozwiązałem swoje własne problemy z rsync - bwlimit arg (2,5 Mb / s wydawało się najlepszym miejscem na pojedynczy, bezbłędny przebieg - cokolwiek więcej i skończyłyby mnie błędy ochrony przed zapisem). rsync był szczególnie przydatny do moich celów, ponieważ pracowałem z całymi systemami plików - więc było wiele plików - a po prostu uruchomienie rsync po raz drugi naprawiłoby wszystkie problemy pierwszego uruchomienia (co było konieczne, gdy stałem się niecierpliwy i spróbowałem do rampy przekraczającej 2,5 Mb / s).
Mimo to wydaje mi się, że nie jest to tak praktyczne dla pojedynczego pliku. W twoim przypadku możesz po prostu potokować do dd i ustawić surowe zapisywanie - możesz obsługiwać dowolne dane wejściowe w ten sposób, ale tylko jeden plik docelowy na raz (choć ten pojedynczy plik może oczywiście być całym urządzeniem blokowym).
## 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
Może się okazać, że netcat jest trochę szybszy niż ssh do transportu danych, jeśli spróbujesz. Zresztą inne pomysły zostały już wykorzystane, więc dlaczego nie?
[EDYCJA]: Zauważyłem wzmianki o lftp, scp i ssh w drugim poście i pomyślałem, że mówimy o zdalnej kopii. Lokalne jest o wiele łatwiejsze:
% 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]: Kredyt tam, gdzie jest to należne: właśnie zauważyłem, że ptman pobił mnie do tego przez około pięć godzin w komentarzach.
Zdecydowanie możesz dostroić $ bs do wydajności tutaj za pomocą mnożnika - ale niektóre systemy plików mogą wymagać, aby była wielokrotnością wielkości sektora docelowego fs, więc miej to na uwadze.
ionice
można go użyć, aby zapewnić, że proces kopiowania z dysku na dysk ma zaplanowane operacje we / wy o niższym priorytecie niż zwykłe procesy.