Download di file multi-thread per Linux
Quando si scarica un file di grandi dimensioni da un singolo server HTTP o FTP utilizzando uno strumento tradizionale come curl o wget, viene aperta una singola connessione TCP e il file viene scaricato in sequenza. Su una rete veloce, questo può essere limitato dal limite di velocità del server per singola connessione, dal TCP Slow Start o dalla latenza di andata e ritorno. Le utilità per il download parallelo aprono contemporaneamente diverse connessioni alla stessa origine, ognuna delle quali recupera un intervallo di byte diverso, e ricompongono localmente il risultato. Questo funziona solo se il server accetta le richieste HTTP Range (rispondendo con HTTP 206 Partial Content); sui server che lo supportano, il risultato è spesso un trasferimento significativamente più veloce rispetto a quello ottenuto con uno strumento che utilizza un singolo flusso.
In questo articolo, il termine «download multithread» indica questo modello di connessioni parallele, anziché l'utilizzo di più thread all'interno del processo di download stesso.
Questo articolo tratta due utilità di questo tipo per Linux: Axel e aria2.
Axel
Axel è uno strumento leggero per il download dalla riga di comando. Apre più connessioni verso un'unica origine e scarica intervalli di byte in parallelo. Supporta HTTP, HTTPS, FTP e FTPS e può riprendere un download interrotto.
Installazione di Axel
Su Debian e Ubuntu:
sudo apt install axel
Su RHEL, CentOS Stream, AlmaLinux e Rocky Linux, abilita prima EPEL:
sudo dnf install epel-release sudo dnf install axel
Su Fedora:
sudo dnf install axel
Utilizzo di Axel
Un download di base:
axel https://nl.lg.introserv.eu/1000MB.test
L'opzione -a abilita un indicatore di avanzamento compatto:
axel -a https://nl.lg.introserv.eu/1000MB.test
Limita la velocità massima di download in byte al secondo con -s (o --max-speed). Ad esempio, per limitare il trasferimento a 500 KB/s:
axel --max-speed=512000 https://nl.lg.introserv.eu/1000MB.test
Salva il file con un nome diverso utilizzando -o:
axel -o gigabyte.test https://nl.lg.introserv.eu/1000MB.test
Imposta il numero di connessioni parallele con -n:
axel -n 10 https://nl.lg.introserv.eu/1000MB.test
Riprendi un file scaricato parzialmente con -c:
axel -c https://nl.lg.introserv.eu/1000MB.test
Con -c, se esiste già un file locale con lo stesso nome, Axel riprende il download dal punto in cui era stato interrotto invece di ricominciare da capo.
aria2
aria2 offre lo stesso tipo di download parallelo di Axel, ma dispone di un insieme più ampio di funzionalità. Supporta HTTP, HTTPS, FTP, SFTP, BitTorrent e Metalink e può scaricare lo stesso file contemporaneamente da più origini. Come Axel, divide un file in segmenti e li scarica in parallelo.
Funzionalità principali:
- numero configurabile di connessioni per server, dimensione dei segmenti e concorrenza complessiva
- ripresa automatica dei download interrotti
- verifica dell'integrità basata su checksum
- supporto per HTTPS e FTPS
- client BitTorrent e Metalink nativi
Installazione di aria2
Su Debian e Ubuntu:
sudo apt install aria2
Su RHEL, CentOS Stream, AlmaLinux e Rocky Linux:
sudo dnf install aria2
Su Fedora:
sudo dnf install aria2
Utilizzo di aria2
Un download di base:
aria2c https://nl.lg.introserv.eu/1000MB.test
Scarica lo stesso file contemporaneamente da due mirror. aria2 combina le connessioni a entrambe le origini e ricompone localmente il file:
aria2c "https://nl.lg.introserv.eu/1000MB.test" "https://uk.lg.introserv.eu/1000MB.test"
Combina origini HTTP e FTP fornendo le credenziali FTP:
aria2c --ftp-user=<USER> --ftp-passwd=<PASSWD> "ftp://<ftpserver_ip>/<file>" "https://uk.lg.introserv.eu/1000MB.test"
Apri otto connessioni parallele a un singolo server, suddividendo il file in otto segmenti:
aria2c -x8 -s8 https://nl.lg.introserv.eu/1000MB.test
L'opzione -x (o --max-connection-per-server) limita il numero di connessioni che aria2 apre verso un singolo server (valore predefinito 1). L'opzione -s (o --split) imposta il numero massimo di segmenti in cui viene suddiviso il file (valore predefinito 5). Per una singola origine, il numero effettivo di connessioni parallele è il minore dei due valori: -x8 -s5 apre 5 connessioni, mentre -x5 -s8 ne apre anch'esso 5. Per ottenere effettivamente 8 connessioni parallele verso un singolo server, è necessario aumentare entrambi i valori; per questo motivo vengono generalmente impostati sullo stesso numero.
L'opzione -k (o --min-split-size) imposta la dimensione minima del blocco in cui viene suddiviso il file. Valori più piccoli consentono un numero maggiore di segmenti paralleli, ma comportano un maggiore overhead:
aria2c -x8 -s8 -k1M https://nl.lg.introserv.eu/1000MB.test
-x, -s e -j risolvono problemi diversi. -x controlla il numero di connessioni aperte verso un singolo server durante il download di un file. -s controlla in quanti segmenti viene suddiviso un file. -j (o --max-concurrent-downloads) controlla quanti file separati aria2 scarica contemporaneamente.
Scarica due file in parallelo:
aria2c -j2 https://nl.lg.introserv.eu/1000MB.test https://uk.lg.introserv.eu/1000MB.test
Riprendi un file scaricato parzialmente con -c:
aria2c -c https://nl.lg.introserv.eu/1000MB.test
Quando viene fornito un file Metalink, aria2 può selezionare automaticamente i mirror, verificare i dati scaricati utilizzando i checksum dichiarati nel file Metalink e ritentare i mirror che hanno avuto esito negativo senza intervento manuale.
Per l'uso ripetuto, aria2 legge le opzioni predefinite da ~/.aria2/aria2.conf se il file esiste. In questo modo, valori come max-connection-per-server e split possono essere impostati una sola volta nel file invece di essere specificati a ogni esecuzione.
L'apertura di molte connessioni parallele verso un mirror pubblico o un CDN può violare le condizioni di utilizzo dell'operatore e attivare limitazioni di velocità o blocchi temporanei. Per le fonti pubbliche, mantieni un numero moderato di connessioni (da 4 a 8 è generalmente sicuro); utilizza valori superiori solo su infrastrutture per le quali è noto che siano consentiti.
Quando i download paralleli sono utili
I download paralleli sono più efficaci quando il collo di bottiglia è il limite di velocità del server per singola connessione o il limite di throughput della fonte, e non il disco locale o il collegamento di rete nel suo complesso. Su un collegamento completamente saturo, l'apertura di più connessioni non aumenta la larghezza di banda totale, ma si limita a redistribuirla. Alcuni server HTTP rifiutano inoltre le richieste Range o limitano il numero di connessioni simultanee provenienti da un singolo client; in questo caso, uno strumento a flusso singolo come wget è altrettanto veloce di Axel o aria2.