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/network1
jest 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 rsync
do 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 rsync
demona na zwykłym starym TCP działa lepiej niż rsync
na 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: nc
niewiarygodnie fajny program, który zdecydowanie nie działa dla mnie. Wcześniej próbowałem netcat-openbsd
i netcat-traditional
paczek bez powodzenia w ogóle.
Błąd, który 192.168.1.2
pojawia 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ąć nc
dział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.1
oczywiś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ć nc
w akcji, więc mam nadzieję, że ktoś pomoże mi w debugowaniu tego procesu.
źródło
/bin/cp
lub w ogóle nie używać NFSnfsvers=2
) z tego samouczka ( michaelminn.com/linux/home_network )Odpowiedzi:
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
):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). Tev
flagi 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śpv
w rurociągu, aby uzyskać wskaźnik postępu:Możesz oczywiście wstawić także inne rzeczy, takie jak
gzip -1
(i dodaćz
flagę po stronie odbierającej -z
flaga 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:
W przypadku starszych ssh / sshd spróbuj
aes128-ctr
lubaes128-cbc
zamiast[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):Następnie na komputerze docelowym uruchomisz:
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.
źródło
netcat
podejście? Jeśli sieć upuści pakiety, wygląda na to, że straci losowe części plików.tee
polecenia do potoku po obu stronach, aby obliczyć sumy kontrolne.tar
części mówi jej o zrobieniu bieżącego katalogu. To nie jest właściwie częśćnc
polecenia, 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ąć…W jaki sposób? Lub TL; DR
Najszybszy sposób znalazłem to połączenie
tar
,mbuffer
assh
.Na przykład:
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:
mbuffer
lubbuffer
. Są w dużej mierze podobne, alembuffer
mają pewne zalety. Domyślny rozmiar bufora to 2 MB dlambuffer
i 1 MB dlabuffer
. 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}?buffer
plus 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,
tar
aby „połączyć” je w jeden strumień danych. Jeśli jest to pojedynczy plik, którego można użyćcat
lub przekierowanie we / wy. Obciążenietar
vs.cat
jest statystycznie nieistotne, więc zawsze używamtar
(lubzfs -send
tam, gdzie mogę), chyba że jest to już tarball . Żadne z nich nie gwarantuje otrzymania metadanych (w szczególnościcat
nie będzie). Jeśli chcesz metadanych, zostawię to jako ćwiczenie dla ciebie.Wreszcie użycie
ssh
mechanizmu transportowego jest zarówno bezpieczne, jak i niesie za sobą bardzo niewiele kosztów. Ponownie, obciążenie ogólnessh
vs.nc
jest statystycznie nieistotne.źródło
openssl speed
na 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.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).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.
źródło