Wysłałem dużą ilość danych z jednej maszyny na drugą. Jeśli wyślę z rsync (lub inną metodą), będzie on działał ze stałą prędkością 320 kb / s. Jeśli zainicjuję dwa lub trzy transfery naraz, każdy przejdzie w 320, a jeśli zrobię cztery naraz, maksymalnie wykorzystają link.
Muszę być w stanie wysyłać dane tak szybko, jak to możliwe, więc potrzebuję narzędzia, które może wykonywać odwrotne multipleksowanie z przesyłaniem plików. Potrzebuję ogólnego rozwiązania, więc uruchamianie podziału na maszynie źródłowej i łączenie ich na drugim końcu nie jest praktyczne. Potrzebuję tego do działania w sposób zautomatyzowany.
Czy istnieje narzędzie, które to robi, czy też muszę tworzyć własne? Nadawcą jest CentOS, odbiorcą jest FreeBSD.
źródło
lftp
jest świetne, ale nie jestem w stanie zmusić go do zrobienia wieloczęściowego podczas pobierania. Używammirror --use-pget-n=20 -R
- ale wygląda na to, że--use-pget-n
działa tylko podczas pobierania.-P20
działa, aby przesłać wiele plików, ale nie mogę podzielić wielu plików na części.pget -n
.mirror
jest dwukierunkowy;pget
argument dotyczy tylko pliki są pobierane.Istnieje kilka narzędzi, które mogą działać.
LFTP - obsługuje FTP, HTTP i SFTP. Obsługuje wiele połączeń do pobrania jednego pliku. Zakładając, że chcesz przenieść plik z remoteServer do localServer, zainstaluj LFTP na localServer i uruchom:
lftp -e 'pget -n 4 sftp://[email protected]/some/dir/file.ext'
„-N 4” to liczba połączeń używanych równolegle.
Istnieje wiele narzędzi przyspieszających pobieranie, ale ogólnie obsługują one tylko HTTP lub FTP, których nie trzeba konfigurować na zdalnym serwerze. Niektóre przykłady to Axel , aria2 i ProZilla
źródło
Jeśli używasz kilku i dużych plików
lftp -e 'mirror --parallel=2 --use-pget-n=10 <remote_dir> <local_dir>' <ftp_server>
: pobierzesz 2 pliki z każdym plikiem podzielonym na 10 segmentów, z łącznymi połączeniami 20 ftp do<ftp_server>
;Jeśli masz dużą liczbę małych plików, użyj
lftp -e 'mirror --parallel=100 <remote_dir> <local_dir>' <ftp_server>
: pobierzesz 100 plików równolegle bez segmentacji. Łącznie zostanie otwartych 100 połączeń. Może to spowodować wyrzucenie dostępnych klientów na serwerze lub zablokowanie niektórych serwerów.Możesz użyć,
--continue
aby wznowić zadanie :) i-R
opcję przesyłania zamiast pobierania (następnie przełączanie kolejności argumentów na<local_dir> <remote_dir>
).źródło
Być może będziesz w stanie dostosować ustawienia TCP, aby uniknąć tego problemu, w zależności od tego, co powoduje limit 320KB / s na połączenie. Domyślam się, że nie jest to wyraźne ograniczenie szybkości połączenia przez ISP. Istnieją dwa prawdopodobne czynniki odpowiedzialne za dławienie:
W pierwszym przypadku każde połączenie TCP skutecznie konkurowałoby na równi w standardowej kontroli przeciążenia TCP. Można to również poprawić, zmieniając algorytmy kontroli przeciążenia lub zmniejszając wielkość wycofania.
W drugim przypadku utrata pakietów nie jest ograniczona. Dodanie dodatkowych połączeń jest prostym sposobem na zwiększenie całkowitego rozmiaru okna. Jeśli możesz ręcznie zwiększyć rozmiary okien, problem zniknie. (Może to wymagać skalowania okna TCP, jeśli opóźnienie połączenia jest wystarczająco duże).
Możesz powiedzieć w przybliżeniu, jak duże powinno być okno, mnożąc czas pingowania w obie strony przez całkowitą prędkość połączenia. 1280KB / s potrzebuje 1280 (1311 dla 1024 = 1K) bajtów na milisekundę w obie strony. Bufor 64K zostanie maksymalny przy opóźnieniu około 50 ms, co jest dość typowe. Bufor 16 K nasycałby wówczas około 320 KB / s.
źródło
Jaka jest struktura twoich danych? Kilka dużych plików? Kilka dużych katalogów? Możesz odradzać wiele instancji rsync w określonych gałęziach drzewa katalogów.
Wszystko zależy od struktury danych źródłowych. Istnieje mnóstwo narzędzi uniksowych do krojenia, kostkowania i ponownego składania plików.
źródło
Jeśli możesz skonfigurować logowanie ssh bez hasła, spowoduje to otwarcie 4 równoczesnych połączeń scp (-n) z każdym połączeniem obsługującym 4 pliki (-L):
Plik /tmp/scp.sh:
źródło
Spróbuj posortować wszystkie pliki na i-węzle (find / mydir -type f -print | xargs ls -i | sort -n) i przenieś je np. Cpio przez ssh. Spowoduje to maksymalne wykorzystanie dysku i spowoduje wąskie gardło w sieci. Szybciej niż to, że trudno przejść, gdy przechodzisz przez sieć.
źródło
Znam narzędzie, które może przesyłać pliki w porcjach. Narzędzie nazywa się pakietem / portem „rtorrent”, który jest dostępny na obu hostach;) Klienci BitTorrent często rezerwują miejsce na dysku przed transferem, a fragmenty są zapisywane bezpośrednio z gniazd na dysk. Dodatkowo będziesz mógł przeglądać stany WSZYSTKICH przelewów na ładnym ekranie ncurses.
Możesz tworzyć proste skrypty bash, aby zautomatyzować tworzenie pliku „* .torrent” i ssh polecenie do zdalnego komputera, aby go pobrać. Wygląda to trochę brzydko, ale nie sądzę, że znajdziesz jakieś proste rozwiązanie bez rozwijania :)
źródło
FTP pobiera wiele połączeń. Jeśli możesz skonfigurować bezpieczny kanał dla FTP przez VPN lub FTP przez SSH , powinieneś być w stanie zmaksymalizować swoje łącze sieciowe. (Należy pamiętać, że specjalne wymagania są wymagane w przypadku FTP przez SSH - patrz link).
FTPS (FTP przez SSL) może również zrobić to, czego potrzebujesz.
Możesz także użyć klienta SFTP, który obsługuje wiele połączeń, ale nie jestem pewien, czy SFTP obsługuje wiele połączeń dla jednego pliku. Powinno to robić to, czego potrzebujesz przez większość czasu, ale może nie zapewnić maksymalnej przepustowości, gdy musisz przesłać tylko jeden duży plik.
źródło
Rozwiązanie 1: Nie jestem pewien, czy jest to praktyczne w twoim przypadku, ale możesz utworzyć archiwum łączone (na przykład plik tar podzielony na porcje lub archiwum łączone 7zip), a następnie użyć wielu instancji rsync, aby wysłać je dalej sieć i zmontuj / wyodrębnij je po drugiej stronie. Możesz napisać skrypt ogólnego przeznaczenia, którego argumentami są katalog do przesłania i liczba połączeń do użycia. Oczywistym minusem jest to, że będziesz potrzebował dwa razy więcej wolnego miejsca po obu stronach i będzie miał dodatkowy koszt archiwizacji / rozpakowywania plików na obu końcach.
Rozwiązanie 2: lepszym rozwiązaniem byłoby napisanie skryptu lub programu, który dzieli duże drzewo katalogów na poddrzewa na podstawie wielkości, a następnie skopiowanie tych poddrzewa równolegle. Może to uprościć, jeśli najpierw skopiujesz całą strukturę katalogów (bez plików).
źródło
Czy dwie maszyny działają w zaufanym środowisku? Możesz spróbować netcat . Po stronie serwera:
a na kliencie:
Możesz poprosić klienta o połączenie z tunelem ssh:
W ten sposób można przenieść nawet całą partycję:
a na kliencie:
.
Uwaga
Netcat nie jest najbezpieczniejszym narzędziem transferu, ale w odpowiednim środowisku może być szybki, ponieważ ma tak niski narzut.
HowtoForge ma dobrą stronę przykładów .
źródło