Wielowątkowe pobieranie plików dla systemu Linux
Gdy duży plik jest pobierany z pojedynczego serwera HTTP lub FTP za pomocą standardowego narzędzia, takiego jak curl lub wget, otwierane jest jedno połączenie TCP, a plik jest pobierany sekwencyjnie. W przypadku szybkiej sieci może to być ograniczone przez limit prędkości serwera dla pojedynczego połączenia, mechanizm TCP Slow Start lub opóźnienie RTT. Narzędzia do pobierania równoległego otwierają jednocześnie kilka połączeń do tego samego źródła, z których każde pobiera inny zakres bajtów, a następnie lokalnie składają wynik w całość. Działa to tylko wtedy, gdy serwer obsługuje żądania HTTP Range (odpowiadając kodem HTTP 206 Partial Content); na serwerach, które to obsługują, transfer jest często zauważalnie szybszy niż w przypadku narzędzia korzystającego z pojedynczego strumienia.
W tym artykule określenie „pobieranie wielowątkowe” odnosi się do tego modelu równoległych połączeń, a nie do wykorzystania wielu wątków wewnątrz samego procesu pobierania.
W tym artykule omówiono dwa takie narzędzia dla systemu Linux: Axel i aria2.
Axel
Axel to lekkie narzędzie do pobierania plików z wiersza poleceń. Otwiera wiele połączeń do jednego źródła i pobiera zakresy bajtów równolegle. Obsługuje HTTP, HTTPS, FTP i FTPS oraz umożliwia wznowienie przerwanego pobierania.
Instalowanie Axel
W systemach Debian i Ubuntu:
sudo apt install axel
W systemach RHEL, CentOS Stream, AlmaLinux i Rocky Linux najpierw włącz EPEL:
sudo dnf install epel-release sudo dnf install axel
W systemie Fedora:
sudo dnf install axel
Korzystanie z Axel
Podstawowe pobieranie:
axel https://nl.lg.introserv.eu/1000MB.test
Opcja -a włącza kompaktowy wskaźnik postępu:
axel -a https://nl.lg.introserv.eu/1000MB.test
Ogranicz maksymalną prędkość pobierania w bajtach na sekundę za pomocą -s (lub --max-speed). Na przykład, aby ograniczyć transfer do 500 KB/s:
axel --max-speed=512000 https://nl.lg.introserv.eu/1000MB.test
Zapisz plik pod inną nazwą za pomocą -o:
axel -o gigabyte.test https://nl.lg.introserv.eu/1000MB.test
Ustaw liczbę równoległych połączeń za pomocą -n:
axel -n 10 https://nl.lg.introserv.eu/1000MB.test
Wznów częściowo pobrany plik za pomocą -c:
axel -c https://nl.lg.introserv.eu/1000MB.test
W przypadku użycia -c, jeśli lokalny plik o tej samej nazwie już istnieje, Axel wznowi pobieranie od miejsca, w którym zostało przerwane, zamiast rozpoczynać je od początku.
aria2
aria2 obsługuje ten sam przypadek użycia pobierania równoległego co Axel, ale oferuje szerszy zestaw funkcji. Obsługuje HTTP, HTTPS, FTP, SFTP, BitTorrent i Metalink oraz może jednocześnie pobierać ten sam plik z wielu źródeł. Podobnie jak Axel, dzieli plik na segmenty i pobiera je równolegle.
Najważniejsze funkcje:
- konfigurowalna liczba połączeń na serwer, rozmiar segmentów i ogólna liczba jednoczesnych pobrań
- automatyczne wznawianie przerwanych pobrań
- weryfikacja integralności na podstawie sum kontrolnych
- obsługa HTTPS i FTPS
- natywne klienty BitTorrent i Metalink
Instalowanie aria2
W systemach Debian i Ubuntu:
sudo apt install aria2
W systemach RHEL, CentOS Stream, AlmaLinux i Rocky Linux:
sudo dnf install aria2
W systemie Fedora:
sudo dnf install aria2
Korzystanie z aria2
Podstawowe pobieranie:
aria2c https://nl.lg.introserv.eu/1000MB.test
Pobierz ten sam plik jednocześnie z dwóch serwerów lustrzanych. aria2 łączy połączenia z obu źródeł i lokalnie składa plik w całość:
aria2c "https://nl.lg.introserv.eu/1000MB.test" "https://uk.lg.introserv.eu/1000MB.test"
Połącz źródła HTTP i FTP, podając dane uwierzytelniające FTP:
aria2c --ftp-user=<USER> --ftp-passwd=<PASSWD> "ftp://<ftpserver_ip>/<file>" "https://uk.lg.introserv.eu/1000MB.test"
Otwórz osiem równoległych połączeń z jednym serwerem, dzieląc plik na osiem segmentów:
aria2c -x8 -s8 https://nl.lg.introserv.eu/1000MB.test
Opcja -x (lub --max-connection-per-server) ogranicza liczbę połączeń, które aria2 otwiera do jednego serwera (domyślnie 1). Opcja -s (lub --split) określa maksymalną liczbę segmentów, na które dzielony jest plik (domyślnie 5). W przypadku jednego źródła efektywna liczba równoległych połączeń jest mniejszą z tych dwóch wartości: -x8 -s5 otwiera 5 połączeń, a -x5 -s8 również otwiera 5. Aby faktycznie uzyskać 8 równoległych połączeń z jednym serwerem, należy zwiększyć obie wartości, dlatego zwykle ustawia się je na tę samą wartość.
Opcja -k (lub --min-split-size) określa najmniejszy fragment, na jaki dzielony jest plik. Mniejsze wartości umożliwiają korzystanie z większej liczby równoległych segmentów kosztem większego narzutu:
aria2c -x8 -s8 -k1M https://nl.lg.introserv.eu/1000MB.test
-x, -s i -j rozwiązują różne problemy. -x kontroluje liczbę połączeń otwieranych do jednego serwera podczas pobierania jednego pliku. -s określa, na ile segmentów dzielony jest jeden plik. -j (lub --max-concurrent-downloads) określa, ile oddzielnych plików aria2 pobiera jednocześnie.
Pobierz dwa pliki równolegle:
aria2c -j2 https://nl.lg.introserv.eu/1000MB.test https://uk.lg.introserv.eu/1000MB.test
Wznów częściowo pobrany plik za pomocą -c:
aria2c -c https://nl.lg.introserv.eu/1000MB.test
Po podaniu pliku Metalink aria2 może automatycznie wybierać serwery lustrzane, weryfikować pobrane dane za pomocą sum kontrolnych określonych w pliku Metalink oraz ponawiać próby pobierania z niedziałających serwerów lustrzanych bez ręcznej interwencji.
W przypadku wielokrotnego użycia aria2 odczytuje domyślne opcje z pliku ~/.aria2/aria2.conf, jeśli taki plik istnieje. Dzięki temu wartości takie jak max-connection-per-server i split można ustawić tam raz, zamiast podawać je przy każdym uruchomieniu.
Otwieranie wielu równoległych połączeń z publicznym serwerem lustrzanym lub CDN może naruszać zasady korzystania z usługi operatora i spowodować ograniczenie prędkości lub tymczasową blokadę. W przypadku źródeł publicznych należy utrzymywać umiarkowaną liczbę połączeń (od 4 do 8 jest zazwyczaj bezpieczne); wyższe wartości należy stosować tylko w infrastrukturze, w przypadku której wiadomo, że są one dozwolone.
Kiedy pobieranie równoległe pomaga
Pobieranie równoległe jest najbardziej skuteczne, gdy wąskim gardłem jest limit prędkości serwera dla pojedynczego połączenia lub limit przepustowości źródła, a nie lokalny dysk ani całe łącze sieciowe. W przypadku w pełni wykorzystanego łącza otwieranie większej liczby połączeń nie zwiększa całkowitej przepustowości — jedynie ją rozdziela. Niektóre serwery HTTP również odrzucają żądania Range lub ograniczają liczbę jednoczesnych połączeń z jednego klienta. W takim przypadku narzędzie korzystające z pojedynczego strumienia, takie jak wget, jest równie szybkie jak Axel lub aria2.