Chciałem wykonać kopię zapasową ścieżki z komputera w mojej sieci do innego komputera w tej samej sieci przez linię 100 Mbit / s. Zrobiłem to
dd if=/local/path of=/remote/path/in/local/network/backup.img
co dało mi bardzo niską prędkość przesyłu sieci około 50 do 100 kB / s, co zajęłoby wieczność. Więc go zatrzymałem i postanowiłem spróbować zgzipować go w locie, aby go znacznie zmniejszyć, aby kwota do transferu była mniejsza. Więc zrobiłem
dd if=/local/path | gzip > /remote/path/in/local/network/backup.img.gz
Ale teraz dostaję prędkość transferu sieci wynoszącą 1 MB / s, czyli 10 do 20 razy szybciej. Po zauważeniu tego przetestowałem to na kilku ścieżkach i plikach i zawsze było tak samo.
Dlaczego dd
przepuszczanie przez gzip
rurę również zwiększa szybkość przesyłania o duży czynnik, zamiast tylko zmniejszać długość strumienia o duży czynnik? Spodziewałem się nawet niewielkiego spadku szybkości transferu z powodu większego zużycia procesora podczas kompresji, ale teraz mam podwójny plus. Nie żebym nie był szczęśliwy, ale po prostu się zastanawiam. ;)
dd
wyjście z prędkością 1 MB / s ... bezpośrednio do oczekującejgzip
rury. Ma bardzo mało wspólnego z rozmiarem bloku.Odpowiedzi:
dd
domyślnie używa bardzo małego rozmiaru bloku - 512 bajtów (!!). To znaczy, wiele małych czyta i pisze. Wygląda na todd
, że naiwnie użyte w pierwszym przykładzie generowało dużą liczbę pakietów sieciowych o bardzo małej ładowności, zmniejszając w ten sposób przepustowość.Z drugiej strony
gzip
jest wystarczająco inteligentny, aby wykonywać operacje wejścia / wyjścia z większymi buforami. Oznacza to, że mniejsza liczba dużych zapisów w sieci.Czy możesz spróbować
dd
ponownie z większymbs=
parametrem i sprawdzić, czy tym razem działa lepiej?źródło
gzip
i blokowy rozmiarbs=10M
-> szybki transfer sieciowy około 3 lub 4 MB / s. Większy rozmiar +gzip
nie zmienił niczego w porównaniu do małego rozmiaru +gzip
.write(3)
do bufora.Trochę za późno, ale czy mogę dodać ...
W wywiadzie zapytano mnie kiedyś, jaka byłaby najszybsza możliwa metoda klonowania danych bit-za-bit, a odpowiedzi zgrubne przy użyciu
dd
lubdc3dd
( finansowane z DoD ). Wywiad potwierdził, że rurociągdd
nadd
bardziej wydajne, jak to po prostu pozwala na jednoczesny odczyt / zapis lub w warunkach programistastdin/stdout
, więc ultimatly podwojenie szybkości zapisu i czas transferu Halfing.źródło
dd status=progress if=/dev/zero count=100000 bs=1M of=/dev/null
było 22,5 GB / s,dd status=progress if=/dev/zero count=100000 bs=1M | dd of=/dev/null bs=1M
było 2,7 GB. Więc rura spowalnia.Cong ma rację. Przesyłasz strumieniowo bloki z dysku nieskompresowanego na zdalny host. Interfejs sieciowy, sieć i zdalny serwer są ograniczeniami. Najpierw musisz zwiększyć wydajność DD. Określenie parametru bs =, który będzie wyrównany z pamięcią bufora dysków, zapewni największą wydajność z dysku. Powiedz na przykład bs = 32 mln. Spowoduje to wypełnienie bufora gzip przy cieśninie SATA lub SAS Line Rate z bufora napędów. Dysk będzie bardziej skłonny do sekwencyjnego transferu, co zapewni lepsze przekazywanie. Gzip skompresuje dane w strumieniu i wyśle je do Twojej lokalizacji. Jeśli używasz NFS, który pozwoli na minimalną transmisję NFS. Jeśli korzystasz z SSH, ponosisz enkapsulację i narzut szyfrowania SSH. Jeśli używasz netcata, nie masz szyfrowania nad głową.
źródło
Zakładam tutaj, że zgłaszana jest „prędkość transferu”, o której mowa
dd
. To naprawdę ma sens, ponieważ wdd
rzeczywistości przesyła 10 razy więcej danych na sekundę ! Niedd
przenosi się jednak przez sieć -gzip
proces ten jest obsługiwany przez proces.Trochę kontekstu:
gzip
zużywa dane z potoku wejściowego tak szybko, jak może wyczyścić bufor wewnętrzny. Szybkośćgzip
opróżniania bufora zależy od kilku czynników:Tak więc w tym przypadku sieć może obsłużyć 100 kB / s i
gzip
kompresuje dane około 10: 1 (i nie jest wąskie gardło procesora). Oznacza to, że podczas gdy generuje 100 kB / s,gzip
może zużywać 1 MB / s, a tempo zużycia jestdd
widoczne.źródło