Szybki sposób na skopiowanie dużego pliku w sieci LAN

24

Mam problem z NFS i chciałbym spróbować użyć zwykłego starego protokołu TCP.

Nie mam jednak pojęcia, od czego zacząć.

Pod względem sprzętowym używam ethernetowego kabla krosowego do połączenia dwóch netbooków.

Aby je połączyć w sieć, piszę

$ sudo ifconfig eth0 192.168.1.1 up && ping -c 10 -s 10 192.168.1.2 && sudo /etc/init.d/nfs-kernel-server start

na pierwszym netbooku i

$ sudo ifconfig eth0 192.168.1.2 up
$ ping -c 10 -s 10 192.168.1.1
$ mount /mnt/network1

na drugim

gdzie /mnt/network1jest określone w / etc / fstab jako

192.168.1.1:/home /mnt/network1 nfs noauto,user,exec,soft,nfsvers=2 0 0

jak również w /etc/exports(używając składni tego pliku), na pierwszym netbooku.

Powyższe działa dobrze, ale pliki i katalogi są ogromne. Średnia wielkość plików to około pół gigabajta, a katalogi mają pojemność od 15 do 50 gigabajtów.

Używam rsyncdo ich przeniesienia, a polecenie (włączone 192.168.1.2) to

$ rsync -avxS /mnt/network1 ~/somedir

Nie jestem pewien, czy istnieje sposób na ulepszenie moich ustawień NFS, aby lepiej obsługiwać duże pliki, ale chciałbym sprawdzić, czy uruchomienie rsyncdemona na zwykłym starym TCP działa lepiej niż rsyncna NFS.

Tak więc, aby powtórzyć, jak skonfigurować podobną sieć z TCP?

AKTUALIZACJA:

Tak więc po kilku godzinach próby wyrwania się z bagna własnej ignorancji (lub, jak lubię o tym myśleć, wciągnięcia się w moje własne bootstrapy), wpadłem na kilka użytecznych faktów.

Ale przede wszystkim to, co doprowadziło mnie do tego królikowego szlaku, zamiast po prostu zaakceptować najlepszą obecnie odpowiedź, to: ncniewiarygodnie fajny program, który zdecydowanie nie działa dla mnie. Wcześniej próbowałem netcat-openbsdi netcat-traditionalpaczek bez powodzenia w ogóle.

Błąd, który 192.168.1.2pojawia się na maszynie odbierającej ( ), to:

me@netbook:~$ nc -q 1 -l -p 32934 | tar xv
Can't grab 0.0.0.0:32934 with bind
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

route daje:

me@netbook:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         dir-615         0.0.0.0         UG    0      0        0 wlan0
link-local      *               255.255.0.0     U     1000   0        0 eth0
192.168.0.0     *               255.255.255.0   U     2      0        0 wlan0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0

Ale oto dobra wiadomość: mając ustawione statyczne adresy IP /etc/network/interfaces, które zacząłem robić, próbując zacząć ncdziałać, naprawiłem wszystkie moje problemy z NFS i ożywiłem moją miłość do NFS.

Dokładna konfiguracja, której użyłem ( 192.168.1.1oczywiście dla pierwszego netbooka) to:

auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0

Przy tych ustawieniach dwa netbooki będą mogły pingować się bezpośrednio po uruchomieniu, nawet bez ifup.

W każdym razie nadal bardzo chciałbym zobaczyć ncw akcji, więc mam nadzieję, że ktoś pomoże mi w debugowaniu tego procesu.

ixtmixilix
źródło
Jeśli oba katalogi są lokalne, lepiej użyć zwykłego starego /bin/cplub w ogóle nie używać NFS
Karlson,
1
Uruchomienie rsync na pliku dostępnym przez NFS oznacza, że ​​cała zawartość pliku musi zostać skopiowana przez sieć przynajmniej raz. Nie potrzebujesz demona, aby wywołać rsync klienta / serwera - po prostu uruchom go przez ssh. (teoretycznie możliwe jest wywoływanie zdalnego końca przez telnet / rsh - ale raczej głupie jest uruchomienie takiej usługi w praktyce - ssh nie powoduje dużego obciążenia).
symcbean
NFSv2 jest dość stary. Z jakiego systemu operacyjnego korzystasz?
Nils
odpowiednio najnowszy Debian i najnowszy Ubuntu. mam wszystkie te polecenia (w tym nfsvers=2) z tego samouczka ( michaelminn.com/linux/home_network )
ixtmixilix
5
w rzeczywistości ssh dodaje całkiem duże obciążenie, krypto nie jest tanie. Przy normalnej prędkości Internetu to nie ma znaczenia, ale można to zauważyć przez sieć LAN (lub bezpośrednie połączenie krzyżowe, w tym przypadku). Ponad gigabit, z wyjątkiem najszybszych komputerów (lub tych z instrukcjami AES-NI, jeśli SSH ich używa) jestem pewien, że będzie to zauważalne.
derobert

Odpowiedzi:

43

Szybki sposób

Najszybszym sposobem przesyłania plików za pośrednictwem sieci LAN nie jest prawdopodobne, rsync, chyba że istnieje kilka zmian. rsync spędza sporo czasu na sumach kontrolnych, obliczaniu różnic itp. Jeśli wiesz, że i tak będziesz przesyłać większość danych, po prostu zrób coś takiego (uwaga: istnieje wiele implementacji netcat; sprawdź instrukcję prawidłowe opcje. W szczególności Twoja może nie chcieć -p):

user@dest:/target$ nc -q 1 -l -p 1234 | tar xv

user@source:/source$ tar cv . | nc -q 1 dest-ip 1234

To używa netcat ( nc) do wysyłania tar przez surowe połączenie TCP na porcie 1234. Nie ma szyfrowania, sprawdzania autentyczności itp., Więc jest bardzo szybki. Jeśli połączenie krzyżowe działa z prędkością gigabitową lub mniejszą, ustalisz sieć; jeśli jest więcej, zostanie ustalony dysk (chyba że masz macierz pamięci lub szybki dysk). Te vflagi smoły uczynić go wydrukować nazwy plików, jak to idzie (gadatliwy trybie). Przy dużych plikach praktycznie nie ma narzutu. Jeśli robisz mnóstwo małych plików, możesz to wyłączyć. Możesz także wstawić coś pvw rurociągu, aby uzyskać wskaźnik postępu:

user@dest:/target$ nc -q 1 -l -p 1234 | pv -pterb -s 100G | tar xv

Możesz oczywiście wstawić także inne rzeczy, takie jak gzip -1(i dodać zflagę po stronie odbierającej - zflaga po stronie wysyłającej użyłaby wyższego poziomu kompresji niż 1, chyba że oczywiście ustawisz zmienną środowiskową GZIP). Chociaż gzip prawdopodobnie będzie działał wolniej, chyba że dane naprawdę się kompresują.

Jeśli naprawdę potrzebujesz rsync

Jeśli tak naprawdę przesyłasz tylko niewielką część danych, które uległy zmianie, rsync może być szybszy. Możesz także spojrzeć na opcję -W/ --whole-file, jak w przypadku naprawdę szybkiej sieci (takiej jak połączenie krzyżowe), która może być szybsza.

Najłatwiejszym sposobem uruchomienia rsync jest ssh. Będziesz chciał poeksperymentować z szyframi ssh, aby zobaczyć, który jest najszybszy, będzie to AES, ChaCha20 lub Blowfish (choć istnieją pewne obawy związane z bezpieczeństwem 64-bitowego rozmiaru bloku Blowfish), w zależności od tego, czy twój układ ma AES Intela -NI instrukcje (i twoja OpenSSL ich używa). Na wystarczająco nowym ssh rsync-over-ssh wygląda następująco:

user@source:~$ rsync -e 'ssh -c [email protected]' -avP /source/ user@dest-ip:/target

W przypadku starszych ssh / sshd spróbuj aes128-ctrlub aes128-cbczamiast [email protected].

ChaCha20 będzie [email protected](potrzebuje również nowego ssh / sshd), a Blowfish będzie blowfish-cbc. OpenSSH nie pozwala na uruchomienie bez szyfru. Zamiast tego możesz oczywiście użyć dowolnej opcji rsync -avP. I oczywiście możesz iść w innym kierunku i uruchomić rsync z maszyny docelowej (pull) zamiast z maszyny źródłowej (push).

Przyspieszanie rsync

Jeśli uruchomisz demona rsync, możesz pozbyć się narzutu szyfrowania. Najpierw należy utworzyć plik konfiguracyjny demona ( /etc/rsyncd.conf), na przykład na maszynie źródłowej (szczegółowe informacje można znaleźć na stronie podręcznika rsyncd.conf):

[big-archive]
    path = /source
    read only = yes
    uid = someuser
    gid = somegroup

Następnie na komputerze docelowym uruchomisz:

user@dest:~$ rsync -avP source-ip::big-archive/ /target

Możesz to zrobić również na odwrót (ale oczywiście musisz ustawić opcję „tylko do odczytu” na „nie”). Dostępne są opcje uwierzytelniania itp. Szczegółowe informacje można znaleźć na stronie podręcznika.

derobert
źródło
2
To doskonała odpowiedź. Drugi też jest świetny. Czy nie ma żadnej akceptowanej odpowiedzi tylko dlatego, że pytający nie może wybrać między nimi?
sudo
Jak solidne jest to netcatpodejście? Jeśli sieć upuści pakiety, wygląda na to, że straci losowe części plików.
sudo,
1
@sudo używa TCP, który retransmituje w razie potrzeby. Powinno więc być dobrze zabezpieczone przed utratą pakietów, przypadkowym uszkodzeniem (w zakresie, w jakim łapią je sumy kontrolne TCP i Ethernet) itp. Oczywiście nie jest zabezpieczone przed atakiem, takim jak tunelowanie przez ssh.
derobert
1
@sudo możesz zrobić to wszystko na raz, wstaw niektóre teepolecenia do potoku po obu stronach, aby obliczyć sumy kontrolne.
derobert
1
@TheStoryCoder Kropka w tarczęści mówi jej o zrobieniu bieżącego katalogu. To nie jest właściwie część ncpolecenia, tar jest używane do tworzenia archiwum tar, które jest przesyłane do netcat (a po drugiej stronie netcat jest przesyłany do tar, aby wyodrębnić archiwum). Obawiam się, że komentarz nie jest wystarczający do wyjaśnienia fajek, ale mam nadzieję, że to wystarczy, aby zacząć…
derobert
17

W jaki sposób? Lub TL; DR

Najszybszy sposób znalazłem to połączenie tar, mbuffera ssh.

Na przykład:

tar zcf - bigfile.m4p | mbuffer -s 1K -m 512 | ssh otherhost "tar zxf -"

Korzystając z tego, osiągnąłem trwały transfer sieci lokalnej ponad 950 Mb / s na łączach 1 Gb. Zamień ścieżki w każdym poleceniu tar, aby były odpowiednie do tego, co przenosisz.

Czemu? mbuffer!

Największym wąskim gardłem w przesyłaniu dużych plików przez sieć jest zdecydowanie dyskowe operacje we / wy. Odpowiedź brzmi: mbufferlub buffer. Są w dużej mierze podobne, ale mbuffermają pewne zalety. Domyślny rozmiar bufora to 2 MB dla mbufferi 1 MB dla buffer. Większe bufory prawdopodobnie nigdy nie będą puste. Wybór rozmiaru bloku, który jest najmniejszą wspólną wielokrotnością rodzimego rozmiaru bloku zarówno w docelowym, jak i docelowym systemie plików, zapewni najlepszą wydajność.

Buforowanie jest rzeczą, która sprawia, że wszystkie różnica! Użyj go, jeśli go masz! Jeśli go nie masz, weź to! Używanie (m}?bufferplus cokolwiek jest lepsze niż cokolwiek innego. jest to niemal dosłownie panaceum na powolne przesyłanie plików w sieci.

Jeśli przesyłasz wiele plików, użyj ich, taraby „połączyć” je w jeden strumień danych. Jeśli jest to pojedynczy plik, którego można użyć catlub przekierowanie we / wy. Obciążenie tarvs. catjest statystycznie nieistotne, więc zawsze używam tar(lub zfs -sendtam, gdzie mogę), chyba że jest to już tarball . Żadne z nich nie gwarantuje otrzymania metadanych (w szczególności catnie będzie). Jeśli chcesz metadanych, zostawię to jako ćwiczenie dla ciebie.

Wreszcie użycie sshmechanizmu transportowego jest zarówno bezpieczne, jak i niesie za sobą bardzo niewiele kosztów. Ponownie, obciążenie ogólne sshvs. ncjest statystycznie nieistotne.

bahamat
źródło
4
openssl speedna i7-3770 daje ~ 126–146 MB / s dla blowfish CBC i ~ 138–157 MB / s dla AES CBC (ten układ ma instrukcje AES-NI). Następnie ~ 200–300 MB / s dla sha256. Więc może zaledwie zepchnąć 1 gigabit. Z OpenSSH 6.1+ możesz użyć AES GCM, który może to robić przy oślepiających szybkościach (370–1320 MB / s, w zależności od rozmiaru wiadomości). Myślę więc, że to prawda, że ​​OpenSSH ma niewielki narzut, jeśli używasz 6.1+ na układzie z AES-NI i używasz AES-GCM.
derobert
1
Ugh, w ostatniej chwili zmieniłem to na 6.1+ zamiast 6.2+, szybko sprawdziłem ponownie. Oczywiście to był błąd, to zmiany od 6.1. Tak więc OpenSSH 6.2+ jest poprawną wersją. I nie pozwoli mi już edytować tego komentarza. Komentarze starsze niż 5 minut muszą pozostać niepoprawne. Oczywiście, jeśli mniej niż OpenSSH 6.4, patrz openssh.com/txt/gcmrekey.adv jak bez łatki, w implementacji AES-GCM OpenSSH istniała luka, którą można wykorzystać.
derobert
Narzut dla ssh(lub rsync przez ssh) jest bardzo, bardzo ważny. Mam serwer NAS korzystający z procesora Intel Atom. Szyfrowanie SSH ABSOLUTNIE ZBIORNIKA szybkość transferu. Dostaję konsekwentnie <400 Mbit / s dla RSA, ręczne przesłanie go do RC4 daje mi ~ 600 Mb / s, a jeśli używam rsync jako demona, działa on z natywną prędkością łącza (> 900 MBit / s, na gigabitach połączenie).
Fałszywe imię
Chociaż prawdą jest, że w wielu sytuacjach transport nie jest krytyczny, absolutnie ważne jest, aby wziąć to pod uwagę, szczególnie jeśli nie korzystasz z bardzo wysokiej klasy sprzętu. W moim przypadku Atom (to D525, dwurdzeniowy 1,8 Ghz) tworzy całkowicie dobry NAS, z dużą prędkością dla SMB, ale szyfrowanie absolutnie go zabija.
Fałszywe imię
2
Otrzymuję błąd krytyczny z powodu parametryzacji mbuffer: „mbuffer: fatal: całkowita pamięć musi być większa niż wielkość bloku \ n Zakończona”. Aby to poprawić, podejrzewam, że powinien przeczytać coś w rodzaju „mbuffer -s 1K -m 512M” z końcowym „M” oznaczającym MByte (źródło: man mbuffer)
Peter Lustig
1

Nie musisz nawet używać TCP. AoE jest implementacją ATA w sieci Ethernet, ponieważ jako warstwa 2 jest to podejście o niższych kosztach ogólnych, bez wiedzy o stosie TCP / IP. Zapewni to najszybszy możliwy transfer przy minimalnym obciążeniu. ***

https://en.wikipedia.org/wiki/ATA_over_Ethernet

*** jeśli sieć stanowi wąskie gardło, upewnij się, że wysyłasz skompresowane dane.

William Deans
źródło
Wow, to jest twardy rdzeń! :) Zastanawiam się, czy są jakieś wzorce ...
rogerdpack