Багатопотокове завантаження файлів для Linux
Коли великий файл завантажується з одного HTTP- або FTP-сервера за допомогою звичайного інструмента, такого як curl або wget, відкривається одне TCP-з'єднання, і файл завантажується послідовно. У швидкій мережі швидкість може бути обмежена лімітом сервера на одне з'єднання, повільним стартом TCP або затримкою передавання даних туди й назад. Інструменти для паралельного завантаження одночасно відкривають кілька з'єднань до одного джерела, кожне з яких отримує окремий діапазон байтів, а потім локально об'єднують отримані частини. Це працює лише в тому випадку, якщо сервер підтримує HTTP-запити з указанням діапазону (відповідає статусом HTTP 206 Partial Content); на серверах, які це підтримують, результатом часто є помітно швидше передавання порівняно з інструментом, що використовує одне з'єднання.
У цій статті термін «багатопотокове завантаження» означає саме такий підхід із паралельними з'єднаннями, а не використання потоків усередині самого процесу завантаження.
У статті розглядаються два такі інструменти для Linux: Axel та aria2.
Axel
Axel — це легкий інструмент командного рядка для завантаження файлів. Він відкриває кілька з'єднань з одним джерелом і паралельно завантажує різні діапазони байтів. Підтримує HTTP, HTTPS, FTP та FTPS, а також дає змогу продовжити перерване завантаження.
Встановлення Axel
У Debian та Ubuntu:
sudo apt install axel
У RHEL, CentOS Stream, AlmaLinux та Rocky Linux спочатку увімкніть EPEL:
sudo dnf install epel-release sudo dnf install axel
У Fedora:
sudo dnf install axel
Використання Axel
Базове завантаження:
axel https://nl.lg.introserv.eu/1000MB.test
Прапорець -a вмикає компактний індикатор прогресу:
axel -a https://nl.lg.introserv.eu/1000MB.test
Обмежити максимальну швидкість завантаження в байтах за секунду можна за допомогою -s (або --max-speed). Наприклад, щоб обмежити швидкість до 500 КБ/с:
axel --max-speed=512000 https://nl.lg.introserv.eu/1000MB.test
Зберегти файл під іншим ім'ям можна за допомогою -o:
axel -o gigabyte.test https://nl.lg.introserv.eu/1000MB.test
Кількість паралельних з'єднань можна встановити за допомогою -n:
axel -n 10 https://nl.lg.introserv.eu/1000MB.test
Продовжити частково завантажений файл можна за допомогою -c:
axel -c https://nl.lg.introserv.eu/1000MB.test
Якщо використовується -c і локальний файл з таким самим ім'ям уже існує, Axel продовжить завантаження з місця, де воно було перерване, замість того щоб починати спочатку.
aria2
aria2 підтримує той самий сценарій паралельного завантаження, що й Axel, але пропонує ширший набір можливостей. Він підтримує HTTP, HTTPS, FTP, SFTP, BitTorrent та Metalink, а також може одночасно отримувати один і той самий файл із кількох джерел. Як і Axel, aria2 розділяє файл на сегменти та завантажує їх паралельно.
Основні можливості:
- налаштування кількості з'єднань із сервером, розміру сегментів та загальної кількості одночасних завантажень
- автоматичне продовження перерваних завантажень
- перевірка цілісності на основі контрольних сум
- підтримка HTTPS та FTPS
- вбудована підтримка клієнтів BitTorrent та Metalink
Встановлення aria2
У Debian та Ubuntu:
sudo apt install aria2
У RHEL, CentOS Stream, AlmaLinux та Rocky Linux:
sudo dnf install aria2
У Fedora:
sudo dnf install aria2
Використання aria2
Базове завантаження:
aria2c https://nl.lg.introserv.eu/1000MB.test
Завантаження одного й того самого файлу одночасно з двох дзеркал. aria2 об'єднує з'єднання з обома джерелами та локально збирає файл:
aria2c "https://nl.lg.introserv.eu/1000MB.test" "https://uk.lg.introserv.eu/1000MB.test"
Поєднання HTTP- та FTP-джерел із передаванням облікових даних FTP:
aria2c --ftp-user=<USER> --ftp-passwd=<PASSWD> "ftp://<ftpserver_ip>/<file>" "https://uk.lg.introserv.eu/1000MB.test"
Відкрити вісім паралельних з'єднань з одним сервером і розділити файл на вісім сегментів:
aria2c -x8 -s8 https://nl.lg.introserv.eu/1000MB.test
Прапорець -x (або --max-connection-per-server) обмежує кількість з'єднань, які aria2 відкриває з одним сервером (за замовчуванням — 1). Прапорець -s (або --split) визначає максимальну кількість сегментів, на які буде розділено файл (за замовчуванням — 5). Для одного джерела фактична кількість паралельних з'єднань є меншою з двох цих величин: -x8 -s5 відкриє 5 з'єднань, а -x5 -s8 також відкриє 5. Щоб отримати 8 паралельних з'єднань з одним сервером, потрібно збільшити обидва параметри, тому зазвичай їх встановлюють однаковими.
Прапорець -k (або --min-split-size) визначає мінімальний розмір частини, на яку може бути розділений файл. Менші значення дають змогу використовувати більше паралельних сегментів, але збільшують накладні витрати:
aria2c -x8 -s8 -k1M https://nl.lg.introserv.eu/1000MB.test
-x, -s та -j виконують різні функції. -x визначає кількість з'єднань з одним сервером під час завантаження одного файлу. -s визначає, на скільки сегментів буде розділено один файл. -j (або --max-concurrent-downloads) визначає, скільки окремих файлів aria2 завантажує одночасно.
Завантажити два файли паралельно:
aria2c -j2 https://nl.lg.introserv.eu/1000MB.test https://uk.lg.introserv.eu/1000MB.test
Продовжити частково завантажений файл за допомогою -c:
aria2c -c https://nl.lg.introserv.eu/1000MB.test
Якщо використовується файл Metalink, aria2 може автоматично вибирати дзеркала, перевіряти завантажені дані за контрольними сумами, зазначеними в Metalink, а також повторювати спроби завантаження з невдалих дзеркал без ручного втручання.
Для регулярного використання aria2 зчитує стандартні параметри з ~/.aria2/aria2.conf, якщо цей файл існує. Тому такі значення, як max-connection-per-server та split, можна встановити один раз у цьому файлі замість того, щоб передавати їх під час кожного запуску.
Відкриття великої кількості паралельних з'єднань із публічним дзеркалом або CDN може порушувати правила використання оператора та призвести до обмеження швидкості або тимчасового блокування. Для публічних джерел використовуйте помірну кількість з'єднань (зазвичай безпечним є значення від 4 до 8); вищі значення використовуйте лише на інфраструктурі, де відомо, що вони дозволені.
Коли паралельні завантаження ефективні
Паралельні завантаження найефективніші, коли вузьким місцем є обмеження швидкості сервера на одне з'єднання або обмеження пропускної здатності окремого джерела, а не локальний диск чи мережеве з'єднання загалом. Якщо канал уже повністю завантажений, збільшення кількості з'єднань не підвищить загальну пропускну здатність — воно лише перерозподілить її. Деякі HTTP-сервери також відхиляють запити з указанням діапазону або обмежують кількість одночасних з'єднань від одного клієнта. У такому разі інструмент з одним потоком, наприклад wget, буде таким самим швидким, як Axel або aria2.