Что такое iPerf?
IPerf это кроссплатформенная клиент-серверная утилита которая позволяет производить замеры пропускной способности каналов. Клиент-серверная утилита подразумевает под собой, что для проверки скорости между двумя устройствами необходимо будет запустить iperf на одном в режиме «сервер», а на другом в режиме «клиент». Скорость измеряется в направлении от клиента к серверу, т.е. если вы на своем компьютере запустили iperf в режиме «клиент», то результатом будет «исходящая» скорость. Чтобы измерить входящую, небоходимо поменять местами клиент и сервер, либо воспользоваться специальным ключем к команде запуска клиента (описание ключей ниже). Важно отметить, что генерирует трафик только клиентская часть.
Зачем так сложно, если есть speedtest?
Сервис speedtest.net — измеряет ширину вашего интернет канала до некого выбранного сервера. В случае когда вы хотите измерить производительность вашей локальной сети, этот вариант не подходит, так как данный сервис измеряет всю линию до определенного сервера, и узкое горлышко может быть на любом ее участке.
Установка
Официальный сайт iPerf - http://software.es.net/iperf/, там есть только исходники, но в разделе Binary Distributions есть ссылка на отдельный сайт https://iperf.fr/, где можно скачать установочные пакеты и исполняемые файлы для всех поддерживаемых систем.
Iperf имеется в двух мажорных версиях - 2 и 3, лучше использовать последнюю. Версия 3 поддерживает все функции версии 2, за исключением двунаправленного теста (а надо ли оно?), подробно почитать о различиях между версиями можно на сайте
Для linux самый простой способ - установка из репозитория, запустив стандартную инсталляционную команду для вашего дистрибутива, например для debian/ubuntu это:
apt install iperf3
В случае отсутствия iperf в репозитории вашего дистрибуива, можно скачать пакет с сайта, в крайнем случае там же по ссылке перейти на github с исходниками и собрать самостоятельно.
Для windows скачиваем версию в соответствии с разрядностью вашей системы, распаковываем содержимое архива в папку, в которую потом будет удобно переходить в командной строке, например C:\iperf\
Для android имеется два варианта доступные в play market: Magic Iperf и пакет сетевых утилит HE.NET Network Tools (обе программы имеют в своем составе iperf версии 2 и 3)
Для iOS HE.NET Network Tools (в составе iperf версии 2 и 3)
Для macOS также имеются исполняемые файлы, скачиваем там же
Для любителей Docker также есть образ на dockerhub - networkstatic/iperf3
Использование
Параметры запуска iperf везде одинаковы, поэтому конкретные действия по запуску на всех возможных системах расписывать не буду.
Для тестирования нам нужны два устройства с установленным iperf и канал между ними.
На одном из них (не важно на каком) запускаем сервер:
iperf3 -s
На втором запускаем клиент:
iperf3 -c <ip адрес сервера>
Начнется процесс измерения, по умолчанию длительностью 10 сек c выводом промежуточных итогов 1 раз в сек. В конце будет показан усредненный результат за все время измерения.
Для увеличения длительности измерения, запускаем клиент добавив параметр -t <длительность в сек>
Для измерения в обратном направлении запускаем клиент добавив параметр -R
Примеры использования
Пример 1 - чистый Ethernet
Замер между стационарным ПК и моим файловым сервером, подключение проводной гигабит, через гигабитный свич:
Пример 2 - Ethernet - Wi-Fi
Но интересней измерить пропускную способность wi-fi сети. Лучшим способом для этого будет использование одного устройства подключенного проводом к вашему свичу/роутеру (например ПК/ноутбук с гигабитным портом или raspberry pi 3b+) и второго, подключенного по wi-fi (например ноутбук или смартфон).
В моем случае у роутера Xiaomi Mi Router3 проводные интерфейсы только 10/100BaseT, поэтому логично будет запустить сервер прям на роутере (иначе измерение упрется в скорость проводного интерфейса), на прошивке padavan установить iperf можно без проблем командой "opkg install iperf3", клиент на android смартфоне:
Пример 3 - Wi-Fi - Wi-Fi
Даже для android tv нашелся iperf, программа называется analiti, измерил скорость между приставкой Xiaomi MiBox3 и смартфоном через роутер:
Описание всех параметров
Для просмотра всех возможных параметров с описанием (на английском), достаточно запустить iperf без параметров.
В большинстве случаев вполне достаточно запуска c параметрами по умолчанию, как это указано выше в разделе "Использование", для тонкой настройки привожу описание всех параметров iPerf3:
Общие:
-p, --port # установить порт для прослушивания/подключения (по умолчанию 5001 для iperf2 и 5201 для iperf3)
-f, --format [kmgKMG] формат отчёта: Kbits, Mbits, KBytes, MBytes
-i, --interval # пауза между периодическими отчётами, в секундах
-F, --file name указывает файл который будет передаваться в качестве нагрузки вместо псевдослучайной последовательности
-A, --affinity n/n,m запуск с привязкой к конкретному ядру процессора (только для linux)
-B, --bind <host> привязка к хосту, интерфейсу или групповому адресу
-V, --verbose вывод подробной информации
-J, --json вывод в JSON формате
--logfile f вывод лога в файл
-d, --debug вывод дополнительной информации для отладки
-v, --version вывод версии
-h, --help вывод списка параметров
Только для сервера:
-s, --server запуск в режиме сервера
-D, --daemon запуск в режиме сервера как процесс (демон)
-I, --pidfile file создать PID файл
-1, --one-off закрыть сервер после отработки одного подключения
Только для клиента:
-c, --client <host> запуск в режиме клиента и подключиться к серверу по адресу <host>
-u, --udp использовать UDP, вместо TCP
-b, --bandwidth #[KMG][/#] задать пропускную способность в бит/сек (по умолчанию без ограничений для TCP и 1 Мбит/сек. для UDP)
-t, --time # длительность измерения в секундах (по умолчанию 10 сек)
-n, --bytes #[KMG] количество байт, после передачи которых остановить измерение (вместо длительности по времени -t)
-k, --blockcount #[KMG] количество блоков (пакетов), после передачи которых остановить измерение (вместо длительности -t или объема -n)
-l, --len #[KMG] размер буфера для записи/чтения (по умолчанию 128 KB для TCP и 8 KB для UDP)
--cport <port> задать локальный порт подключения (по умолчанию рандомный порт)
-P, --parallel # количество параллельных потоков
-R, --reverse запуск в обратном направлении (сервер будет отправлять, клиент принимать
-w, --window #[KMG] размер TCP window size / размер буфера
-C, --congestion <algo> выбрать алгоритм управления перегрузками TCP (только Linux и FreeBSD)
-M, --set-mss # задать максимальный размера сегмента TCP/SCTP (MTU-40 байт)
-N, --no-delay задать TCP без задержки (отключение алгоритма Нэйгла)
-4, --version4 использовать только IPv4
-6, --version6 использовать только IPv6
-S, --tos N задать "тип сервиса" IP
-L, --flowlabel N задать IPv6 flow label (только Linux)
-Z, --zerocopy использовать "zero copy" метод передачи данных (меньше загрузка CPU)
-O, --omit N не учитывать измерение первых N секунд
-T, --title str префикс для каждой выводимой строки
--get-server-output выводить результаты серверной части