Iperf3: утилита для замера пропускной способности сети

Multicast

To test multicast, run several servers with the bind option (-B, –bind) set
to the multicast group address. Run the client, connecting to the multicast
group address and setting the TTL (-T, –ttl) as needed. Unlike normal TCP and
UDP tests, multicast servers may be started after the client. In that case,
datagrams sent before the server started show up as losses in the first periodic
report (61 datagrams on arno below).

Start multiple clients or servers as explained above, sending data to the same multicast server.
(If you have multiple servers listening on the multicast address, each of the servers will be getting the data)

Описание всех параметров

Для просмотра всех возможных параметров с описанием (на английском), достаточно запустить iperf без параметров.

В большинстве случаев вполне достаточно запуска c параметрами по умолчанию, как это указано выше в разделе «Использование», для тонкой настройки привожу описание всех параметров iPerf3:

Общие:

-p, —port #  установить порт для прослушивания/подключения (по умолчанию 5001 для iperf2 и 5201 для iperf3)

-f, —format   формат отчёта: 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 #  задать пропускную способность в бит/сек (по умолчанию без ограничений для TCP и 1 Мбит/сек. для UDP)

 -t, —time #  длительность измерения в секундах (по умолчанию 10 сек)

 -n, —bytes #  количество байт, после передачи которых остановить измерение (вместо длительности по времени -t)

 -k, —blockcount #  количество блоков (пакетов), после передачи которых остановить измерение (вместо длительности -t или объема -n)

 -l, —len #  размер буфера для записи/чтения (по умолчанию 128 KB для TCP и 8 KB для UDP)

 —cport <port>  задать локальный порт подключения (по умолчанию рандомный порт)

 -P, —parallel #  количество параллельных потоков

 -R, —reverse запуск в обратном направлении (сервер будет отправлять, клиент принимать

 -w, —window #  размер 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  выводить результаты серверной части

TCP window size: 92.6 KByte (default)

local 192.168.110.136 port 53855 connected with 192.168.110.135 port 5001
local 192.168.110.136 port 53854 connected with 192.168.110.135 port 5001
local 192.168.110.136 port 53856 connected with 192.168.110.135 port 5001
local 192.168.110.136 port 53857 connected with 192.168.110.135 port 5001
Interval Transfer Bandwidth
0.0-10.0 sec 7.99 GBytes 6.86 Gbits/sec
0.0-10.0 sec 10.9 GBytes 9.34 Gbits/sec
0.0-10.0 sec 14.7 GBytes 12.6 Gbits/sec
0.0-10.0 sec 12.1 GBytes 10.4 Gbits/sec
0.0-10.0 sec 45.6 GBytes 39.2 Gbits/sec

So here iperf reports 39.2 Gbits/sec which is closer to 40Gbits but on otherhand iperf3 reports only 20.9 Gbits/sec.

Code Authors

The main authors of iPerf3 are (in alphabetical order): Jon Dugan, Seth Elliott, Bruce A. Mah, Jeff Poskanzer, Kaustubh Prabhu.
Additional code contributions have come from (also in alphabetical order): Mark Ashley, Aaron Brown, Aeneas Jaißle, Susant Sahani, Bruce Simpson, Brian Tierney.

iPerf3 contains some original code from iPerf2. The authors of iPerf2 are (in alphabetical order):
Jon Dugan, John Estabrook, Jim Ferbuson, Andrew Gallatin, Mark Gates, Kevin Gibbs,
Stephen Hemminger, Nathan Jones, Feng Qin, Gerrit Renker, Ajay Tirumala, Alex Warshavsky.

Acknowledgements for iPerf1: Thanks to Mark Gates (NLANR), Alex Warshavsky (NLANR) and Justin Pietsch (University of Washington)
who were responsible for the 1.1.x releases of Iperf.
For iPerf 1.7, we would like to thank Bill Cerveny (Internet2), Micheal Lambert (PSC), Dale Finkelson (UNL)
and Matthew Zekauskas (Internet2) for help in getting access to IPv6 networks / machines.
Special thanks to Matthew Zekauskas (Internet2) for helping out in the FreeBSD implementation.
Also, thanks to Kraemer Oliver (Sony) for providing an independent implementation of IPv6
version of Iperf, which provided a useful comparison for testing our features.

Thanks to ESnet for re-rolling iperf from the ground up. iPerf3 is a killer piece of software.

Thanks to
for hosting iPerf.fr.

Iperf – утилита для тестирования пропускной способности сети.

Наткнулся на интересную статью про утилитку для тестирования пропускной способности сети. Имеется одно приложение, крайне зависимое от всё этой фигни, и каким то образом надо протестить и найти слабое место. Для начала просто опубликую статью, а потом сам напишу небольшой обзор, с тестом. Понеслась.

Как поступить, если необходимо произвести нагрузочное тестирование канала связи, маршрутизатора и при этом остаться при своих деньгах? Не знаете? Спросите меня :). Выход есть.
Заходим на сайт http://dast.nlanr.net/projects/Iperf/ (для линуксоидов http://www.netperf.org/) и скачиваем утилиту iperf (для Linux качаем netperf). Сразу замечу, что обе утилиты используют один и тот же протокол связи, и поэтому вполне возможно запустив сервер под Linux, генерировать трафик клиентом под Windows.

Внимание! Утилита работает под Windows 2000 и выше. Возможно, она запустится и под NT, но достоверных сведений об этом не обнаружено, а сам я не проверял ввиду отсутствия доступа к последней. В комплект утилиты входит документация, в которой расписаны ключики для запуска исполняемого файла

Всё довольно подробно, поэтому я здесь расскажу о примерах использования iperf и особенностях работы с ним

В комплект утилиты входит документация, в которой расписаны ключики для запуска исполняемого файла. Всё довольно подробно, поэтому я здесь расскажу о примерах использования iperf и особенностях работы с ним.

Прежде всего, нам необходимы два компьютера. Одини из них будет генерировать трафик, он называется клиентом, а другой – принимать пакеты и вести подсчёт статистики, он называется сервером. На обоих машинах запускается один и тот же исполняемый файл, но с разными ключами.

Теперь примеры.

Проверка на TCP трафике.

Сервер

Клиент

Здесь server_host – адрес машины, на которой запущен iperf в режиме сервера. Вот, собственно и всё. Сначала запускаем сервер, затем клиент, и в течение 10 секунд между ними будет идти трафик, после чего соединение будет разорвано и выведена статистика.

Чтобы увеличить продолжительность соединения, необходимо добавить в строку запуска клиента параметр -t nsec, где nsec – продолжительность соединения в секундах.

Не менее полезным будет ключик -i nsec. Здесь nsec соответствует периоду (в секундах, естественно), через который будет выводиться статистика.

Проверка на UDP трафике.

Для запуска iperf в режиме UDP необходимо добавить и клиенту и серверу ключи -u.

Протокол UDP более “тупой”, что даёт нам как некоторые преимущества, так и недостатки. Впрочем, для целей тестирования, недостатки опять-таки превращаются в преимущества.

Итак, что мы можем:

  • менять длину передаваемых пакетов
  • менять полосу передаваемого трафика
  • работать на односторонних каналах
  • использовать iperf без запуска сервера, если канал не сквозной, а необходимо просто генерировать заданный трафик для нагрузки

Для изменения длины пакета используется ключ -l length. Следует только помнить, что при length=0 реальная длина Ethernet-фрейма будет составлять 54 байта и делать в своих расчётах соответствующую поправку.

Для изменения полосы трафика используется ключ -b bandwidth. Параметр bandwidth выражается в битах в секунду и может содержать десятичную точку и суффиксы k и M, соответствующие приставкам кило- и мега-.

При работе на односторонних каналах следует помнить, что клиент в таких случаях статистику не отображает и при завершении сессии выводит сообщение об ошибке, которое можно с покойно проигнорировать.

Запуск нескольких потоков трафика.

Мы можем запустить несколько экземпляров клиентов и серверов на одной и той же машине. Для развязки трафика используется назначение разных портов при помощи параметра -p port его значение на клиенте и соответствую щем сервере должно быть одинаковым (по умолчанию, он имеет значение 5001).

Практика показала, что при запуске нескольких клиентов на одной машине, iperf захватывает практически все ресурсы ЦП, из-за чего в некоторых потоках возможно пропадание пакетов. Здесь, видимо, имеется некая ошибка в коде, вызывающая некорректную работу при context switching. Всё вышеуказанное справедливо для iperf. Netperf работает под Linux вполне корректно.

В файлах помощи вы найдёте ещё параметр -S, позволяющий устанавливать значение Type Of Servise (TOS) в IP заголовке. Вынужден вас разочаровать, под Windows это не работает. (Что характерно, я не смог установить это поле и в стандартном ping для Windows).

Взято с берлоги инженера

Summary

iperf is a tool for active measurements of the maximum achievable
bandwidth on IP networks. It supports tuning of various parameters
related to timing, protocols, and buffers. For each test it reports
the measured throughput / bitrate, loss, and other parameters.

This version, sometimes referred to as iperf3, is a redesign of an
original version developed at NLANR/DAST. iperf3 is a new
implementation from scratch, with the goal of a smaller, simpler code
base, and a library version of the functionality that can be used in
other programs. iperf3 also has a number of features found in other tools
such as nuttcp and netperf, but were missing from the original iperf.
These include, for example, a zero-copy mode and optional JSON output.
Note that iperf3 is not backwards compatible with the original iperf.

Primary development for iperf3 takes place on CentOS Linux, FreeBSD,
and macOS. At this time, these are the only officially supported
platforms, however there have been some reports of success with
OpenBSD, NetBSD, Android, Solaris, and other Linux distributions.

iperf3 is principally developed by ESnet / Lawrence Berkeley National
Laboratory. It is released under a three-clause BSD license.

Source code and issue tracker: https://github.com/esnet/iperf

Bug Report for iPerf3

Before submitting a bug report, try checking out the latest version of the code, and confirm that it’s not already fixed.
Then submit to the iPerf3 issue tracker on GitHub: https://github.com/esnet/iperf/issues

Known Issues

The following problems are notable known issues, which are probably of interest to a large fraction of users or have high impact for some users, and for which issues have already been filed in the issue tracker. These issues are either open (indicating no solution currently exists) or closed with the notation that no further attempts to solve the problem are currently being made:

  • UDP performance: Some problems have been noticed with iperf3 on the ESnet 100G testbed at high UDP rates (above 10Gbps). The symptom is that on any particular run of iperf3 the receiver reports a loss rate of about 20%, regardless of the «-b« option used on the client side. This problem appears not to be iperf3-specific, and may be due to the placement of the iperf3 process on a CPU and its relation to the inbound NIC. In some cases this problem can be mitigated by an appropriate use of the CPU affinity («-A«) option. (Issue #55)
  • Interval reports on high-loss networks: The way iperf3 is currently implemented, the sender write command will block until the entire block has been written. This means that it might take several seconds to send a full block if the network has high loss, and the interval reports will have widely varying interval times. A solution is being discussed, but in the meantime a work around is to try using a small block size, for example «-l 4K«. (Issue #125, a fix will be released in iperf 3.1)
  • The «-Z« flag sometimes causes the iperf3 client to hang on OSX. (Issue #129)
  • When specifying the TCP buffer size using the «-w« flag on Linux, the Linux kernel automatically doubles the value passed in to compensate for overheads. (This can be observed by using iperf3’s «—debug« flag.) However, CWND does not actually ramp up to the doubled value, but only to about 75% of the doubled value. Some part of this behavior is documented in the tcp(7) manual page. (Issue #145)

Примеры

Проще всего понять работу приложения на конкретном примере. Тогда станет понятно, что происходит в iperf. А также, что именно, как там измеряется. Для упрощения ситуации используем сервер с конкретным адресом, 192.168.0.101. Клиентский адрес может быть каким угодно. Начинаем с запуска серверного ПК.

Используем версию iperf3, но допускается и другая. Алгоритм действий следующий:

  1. Ввести «iperf3 –s». Чтобы определить единицы измерения скорости, задается команда «-f». Среди наиболее часто используемых – кило, мега, гигабиты. Обозначаются, соответственно, литерами «k», «m», «g». Доступны также кило, мега, гига и терабайты. Для них выбраны символы «K», «M», «G», «T». Сочетание «iperf3 -s -f K» означает отображение скорости в килобайтах.
  2. Настроить порт. В базовых установках задан порт 5201. Чтобы сменить адрес, используется команда «-p». Для перехода на другой порт нужно ввести «ipref3 -s -p 4000».
  3. Настроить брандмауэр. Для версии ufw набирается сочетание «sudo ufw allow 5201». Соответственно, для firewalld оно будет «sudo firewall-cmd —permanent —add-port=5201/tcp» (при TCP протоколе). Для UDP меняются последние 3 символа.
  4. Запуск в фоне. С этим справляется назначенная литера «-D». В таком случае данные записываются в архив. Что нужно сделать: «iperf3 -s -D —logfile /var/log/ipref.log».
  5. Проверка работы сервера. Проводится вводом «ss». Полностью команда выглядит так: «ss -tulpn | grep 5201».
  6. Назначение айпи. Для IPv4 ставим символ «4». Для IPv6 – «6». Задание конкретно подключаемых айпи производится командой «iperf3 -s -4 -D —logfile /var/log/ipref.log».

Не забываем, что продолжительность теста (в секундах) выставляется командой «-t». Пропускная способность выводится в разделе «Bitrate».

Команда «iperf3 -c 192.168.0.101 -f M -i 5 -t 30» означает, что сервер работает на адресе 192.168.0.101, выдавая промежуточные значения каждые 5 секунд. Общая длительность теста равна при этом 30 секундам. Кстати, iperf работает не только под Windows, но и с другими ОС. Но об этом поговорим в следующий раз.

Bug Reports

Before submitting a bug report, please make sure you’re running the
latest version of the code, and confirm that your issue has not
already been fixed. Then submit to the iperf3 issue tracker on
GitHub:

In your issue submission, please indicate the version of iperf3 and
what platform you’re trying to run on (provide the platform
information even if you’re not using a supported platform, we
might be able to help anyway). Exact command-line arguments will
help us recreate your problem. If you’re getting error messages,
please include them verbatim if possible, but remember to sanitize any
sensitive information.

Known Issues

  • UDP performance: Some problems have been noticed with iperf3 on the
    ESnet 100G testbed at high UDP rates (above 10Gbps). The symptom is
    that on any particular run of iperf3 the receiver reports a loss rate
    of about 20%, regardless of the -b option used on the client side.
    This problem appears not to be iperf3-specific, and may be due to the
    placement of the iperf3 process on a CPU and its relation to the
    inbound NIC. In some cases this problem can be mitigated by an
    appropriate use of the CPU affinity (-A) option. (Issue #55)

  • The -Z flag sometimes causes the iperf3 client to hang on OSX.
    (Issue #129)

  • When specifying the TCP buffer size using the “-w” flag on Linux, Linux
    doubles the value you pass in. (You can see this using iperf3’s debug flag).
    But then the CWND does not actually ramp up to the doubled value, but only
    to about 75% of the doubled value. This appears to be by design.

  • On some platforms, it might be necessary to invoke “ldconfig”
    manually after doing a “make install” before the iperf3 executable can
    find its shared library. (Issue #153)

Синтаксис и опции

Применительно к синтаксису ПО iperf следует понимать, что клиентская и серверная части существуют независимо друг от друга. И значит, запускаются различными командами. Вот как нужно действовать применительно к каждой ситуации:

  • для сервера – $ iperf3 -s опции;
  • для клиента – $ iperf3 -c адрес_сервера опции;

Когда разобрались с запуском, можно переходить к командам, опциям программы. Их перечень обширен, но и здесь не так сложно вникнуть, если захотеть. Начнем с общих.

Ввод «-p» определяет порт для подключения. «-f» означает формат данных для отображения на дисплее. Доступны килобиты, мегабиты, килобайты, мегабайты в секунду. Остальные команды перечислены ниже:

  • «-i» означает интервал в демонстрации данных теста iperf;
  • «-F» задает использование информации из файла (а не генерации случайных показателей);
  • «-l» позволяет определить размер буфера (изначально установлено 8 килобайт);
  • «-m» отсылает к сегменту, его величине;
  • «-o» выводит результаты для записи в файл;
  • «-p» устанавливает порт привязки (5201 в пресете);
  • «-u» задает UDP сетевой протокол;
  • «-w» управляет размером окна;
  • «-B» привязывает к интерфейсу, хосту;
  • «-J» запускает переход к JSON-формату.

Это были базовые команды. Далее перейдем к серверным.

Опции для сервера

Данные действия предназначены для управления приложением ipref на серверном компьютере. Вот что приготовили разработчики:

  • «-s» задает работу в режиме сервера;
  • «-D» активирует фоновый запуск;
  • «-I» устанавливает путь сохранения PID-файла;
  • «-1» назначает однократное клиентское подключение с последующим выходом.

Не так много, как бы хотелось. Для режима «клиент» выбор побогаче.

Опции для клиента

Как уже известно, приложение iperf может работать в 2 базовых режимах. Вот что доступно для ПК клиента:

  • «—sctp» включает замену сетевого протокола TCP на SCTP;
  • «-u» переключает на протокол UDP;
  • «—connect-timeout» позволяет задать время начального подключения к серверу (измеряется в миллисекундах);
  • «-b» означает скорость, битрейт. В режиме TCP ничем не ограничен, для UDP протокола задан от 1 мегабита в секунду;
  • «-t» устанавливает время на прогонку теста. Измеряется в секундах. Изначально параметр задан в 10 секунд;
  • «-R» запускает реверс. То есть измерение производится не от клиента к серверному ПК, а в обратном направлении;
  • «-P» определяет число действующих потоков;
  • «-w» регулирует размеры окна TCP.

Кроме того, доступно принудительное переключение на настройки протокола IPv4 (ввести «-4»), IPv6 («-6»).

Public iPerf3 servers

iPerf3 servers will only allow one iPerf connection at a time. Multiple tests at the same time is not supported.
If a test is in progress, the following message is displayed: «iperf3: error — the server is busy running a test. try again later»

iPerf3 server Localization Data center Hosting Speed Port IP version Contact
iperf.par2.as49434.net FranceÎle-de-France DC Harmony Hosting 40 Gbit/s 9200 TCP/UDPto9240 TCP/UDP IPv4 and IPv6 @g_marsot
paris.testdebit.infolille.testdebit.infolyon.testdebit.infoaix-marseille.testdebit.infobordeaux.testdebit.info France ParisFrance LilleFrance LyonFrance Aix-en-ProvenceFrance Bordeaux Data centersBouyguesTelecom 10 Gbit/s10 Gbit/s10 Gbit/s10 Gbit/s10 Gbit/s 9200 TCP/UDPto9240 TCP/UDP IPv4 and IPv6 @lafibreinfo
speed.as208196.net FranceÎle-de-France Moji1Nanterre 10 Gbit/s 5200 TCP/UDPto5209 TCP/UDP IPv4 or IPv6 @DorianGaliana
ping.online.netping6.online.netping-90ms.online.netping6-90ms.online.net FranceÎle-de-France ScalewayVitry DC3 10 Gbit/s 5200 TCP/UDPto5209 TCP/UDP IPv4 or IPv6
speedtest.serverius.net(Port 5002: add -p 5002) Netherlands Serveriusdata center 10 Gbit/s 5002 TCP/UDP IPv4 and IPv6 @serveriusbv
ch.iperf.014.fr SwitzerlandZurich HostHatchdata center 1 Gbit/s 18815 TCP/UDPto18820 TCP/UDP IPv4 only @014_fr
iperf.eenet.ee Estonia EENet Tartu 5201 TCP/UDP IPv4 only @EENet_HITSA
iperf.astra.in.ua UkraineLviv Astra Lviv 10 Gbit/s 5201 TCP/UDPto5206 TCP/UDP IPv4 and IPv6 noc@astra.in.ua
iperf.volia.net Ukraine Volia Kiev 5201 TCP/UDP IPv4 only @voliaofficial
iPerf3 server Localization Data center Hosting Speed Port IP version Contact
speedtest.uztelecom.uz UzbekistanTashkent Infosystems 10 Gbit/s 5200 TCP/UDPto5209 TCP/UDP IPv4 and IPv6 @KhurshidSuyunov
iperf.it-north.net Kazakhstan Petropavl 1 Gbit/s 5200 TCP/UDPto5209 TCP/UDP IPv4 only Brauninger A.F.
iperf.biznetnetworks.com Indonesia Biznet — MidplazaCimanggis 1 Gbit/s 5201 TCPto5203 TCP IPv4 and IPv6 Biznet Networks
iPerf3 server Localization Data center Hosting Speed Port IP version Contact
speedtest-iperf-akl.vetta.online New ZealandAuckland Vetta OnlineAuckland 10 Gbit/s 5200 TCPto 5209 TCP IPv4 only contact
iPerf3 server Localization Data center Hosting Speed Port IP version Contact
iperf.scottlinux.com USACalifornia HurricaneFremont 2 1 Gbit/s 5201 TCP/UDP IPv4 and IPv6 @scottlinux
iperf.he.net USACalifornia HurricaneFremont 1 5201 TCP/UDP IPv4 and IPv6 HE forums

To add / remove a public iPerf3 server, please report them to @lafibreinfo

Summary

iperf is a tool for active measurements of the maximum achievable
bandwidth on IP networks. It supports tuning of various parameters
related to timing, protocols, and buffers. For each test it reports
the measured throughput / bitrate, loss, and other parameters.

This version, sometimes referred to as iperf3, is a redesign of an
original version developed at NLANR/DAST. iperf3 is a new
implementation from scratch, with the goal of a smaller, simpler code
base, and a library version of the functionality that can be used in
other programs. iperf3 also has a number of features found in other tools
such as nuttcp and netperf, but were missing from the original iperf.
These include, for example, a zero-copy mode and optional JSON output.
Note that iperf3 is not backwards compatible with the original iperf.

Primary development for iperf3 takes place on CentOS Linux, FreeBSD,
and macOS. At this time, these are the only officially supported
platforms, however there have been some reports of success with
OpenBSD, NetBSD, Android, Solaris, and other Linux distributions.

iperf3 is principally developed by ESnet / Lawrence Berkeley National
Laboratory. It is released under a three-clause BSD license.

Source code and issue tracker: https://github.com/esnet/iperf

Change between iPerf 2.0.6, iPerf 2.0.7 and iPerf 2.0.8

  • 2.0.6 change set (rjmcmahon@rjmcmahon.com) March 2014 :

    Increase the shared memory for report headers reducing mutex contention. Needed to increase performance. Minor code change that should be platform/os independent

  • 2.0.7 change set (rjmcmahon@rjmcmahon.com) August 2014 :

    • Linux only version which supports end/end latency (assumes clocks synched)
    • Support for smaller report interval (5 milliseconds or greater)
    • End/end latency with UDP (mean/min/max), display in milliseconds with resolution of microseconds
    • Socket read timeouts (server only) so iperf reports occur regardless of no received packets
    • Report timestamps now display millisecond resolution
    • Local bind supports port value using colon as delimeter (-B 10.10.10.1:60001)
    • Use linux realtime scheduler and packet level timestamps for improved latency accuracy
    • Suggest PTP on client and server to synch clocks to microsecond
    • Suggest a quality reference for the PTP grandmaster such as a GPS disciplined oscillator from companies like Spectracom
  • 2.0.8 change set (as of 12 january 2015) :

    • Fix portability, compile and test with Linux, Win10, Win7, WinXP, MacOS and Android
    • Client now requires -u for UDP (no longer defaults to UDP with -b)
    • Maintain legacy report formats
    • Support for -e to get enhanced reports
    • Support TCP rate limited streams (via the -b) using token bucket
    • Support packets per second (UDP) via pps as units, (e.g. -b 1000pps)
    • Display PPS in both client and server reports (UDP)
    • Support realtime scheduler as a command line option (—realtime or -z)
    • Improve client tx code path so actual tx offerred rate will converge to the -b value
    • Improve accuracy of microsecond delay calls (in platform independent manner)
    • (Use of Kalman filter to predict delay errors and adjust delays per predicted error)
    • Display target loop time in initial client header (UDP)
    • Fix final latency report sent from server to client (UDP)
    • Include standard deviation in latency output
    • Suppress unrealistic latency output (-/-/-/-)
    • Support SO_SNDTIMEO on send so socket write won’t block beyond -t (TCP)
    • Use clock_gettime if available (preferred over gettimeofday())
    • TCP write and error counts (TCP retries and CWND for linux)
    • TCP read count, TCP read histogram (8 bins)
    • Server will close the socket after -t seconds of no traffic

See also https://sourceforge.net/projects/iperf2/

Свой публичный сервер

Сервер iPerf может обрабатывать только одно подключение одновременно на порту. Поэтому, в условиях публичного использования необходим его запуск на множестве портов одновременно.

В официальной документации это предлагается делать скриптом:

#!/bin/dash
/bin/sleep 10
/usr/bin/killall iperf3
/bin/sleep 0.1
/usr/bin/killall -9 iperf3
/bin/sleep 0.1
if
then
  /usr/bin/sudo -u nobody /usr/bin/iperf3 -s -p 5200 -D >/dev/null 2>&1
  /usr/bin/sudo -u nobody /usr/bin/iperf3 -s -p 5201 -D >/dev/null 2>&1
  /usr/bin/sudo -u nobody /usr/bin/iperf3 -s -p 5202 -D >/dev/null 2>&1
  /usr/bin/sudo -u nobody /usr/bin/iperf3 -s -p 5203 -D >/dev/null 2>&1
  /usr/bin/sudo -u nobody /usr/bin/iperf3 -s -p 5204 -D >/dev/null 2>&1
  /usr/bin/sudo -u nobody /usr/bin/iperf3 -s -p 5205 -D >/dev/null 2>&1
  /usr/bin/sudo -u nobody /usr/bin/iperf3 -s -p 5206 -D >/dev/null 2>&1
  /usr/bin/sudo -u nobody /usr/bin/iperf3 -s -p 5207 -D >/dev/null 2>&1
  /usr/bin/sudo -u nobody /usr/bin/iperf3 -s -p 5208 -D >/dev/null 2>&1
  /usr/bin/sudo -u nobody /usr/bin/iperf3 -s -p 5209 -D >/dev/null 2>&1
fi

* пример данного скрипта будет работать не на всех системах. При его использовании необходимо внести в него корректировки.

Мы же настроим сервер при помощи systemd. Ранее мы уже создавали один юнит для запуска iperf. Повторяем процедуру с небольшими изменениями.

Создаем юнит со следующим содержимым:

vi /etc/systemd/system/iperfd5205.service

Description=iPerfService
After=network.target
 

Type=forking
PIDFile=/var/run/iperf3.5205.pid
ExecStart=-/bin/iperf3 -s -p 5205 -D -I /var/run/iperf3.5205.pid
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
 

WantedBy=multi-user.target

* если сравнить с ранее созданным юнитом, мы добавили запуск сервера на порту 5205.

Перезапускаем systemd:

systemctl daemon-reload

Разрешаем юнит и запускаем сервис:

systemctl enable iperfd5205

systemctl start iperfd5205

Повторяем шаги для других портов — создаем для каждого отдельный юнит в systemd. Для публичного сервера лучше создать побольше. 

Виды и версии Iperf

Сама утилита работает по умолчанию в режиме командной строки, но у нее так же есть надстройка на Java, для графического интерфейса. Так же есть две независимых ветки у данного инструмента по тестированию сети. Первая ветка, это Iperf2, вторая Iperf3.

Какова история iperf3 и в чем разница между iperf2 и iperf3?

iperf2 был заброшен в конце 2000-х годов на версии 2.0.5, несмотря на некоторые известные ошибки и проблемы. Потратив некоторое время на решение проблем с iperf2, ESnet к 2010 году решила, что нужен новый, более простой инструмент, и приступила к разработке iperf3. Цель состояла в том, чтобы сделать инструмент как можно более простым, чтобы другие могли внести свой вклад в код. По этой причине было решено сделать инструмент однопоточным и не беспокоиться о обратной совместимости с iperf2.Многие запросы функций для iperf3 поступили из проекта perfSONAR ( http://www.perfsonar.net).

Затем в 2014 году Боб (Роберт) МакМахон из компании Broadcom возобновил разработку iperf2. Он исправил многие проблемы с iperf2 и добавил ряд новых функций, похожих на iperf3. iperf2.0.8, выпущенный в 2015 году, сделал iperf2 полезным инструментом. Текущее развитие iperf2 сосредоточено на использовании UDP для тестирования задержки, а также на широкой поддержке платформ.

На момент написания статьи (2019), iperf2 и iperf3 активно (хотя и независимо) разрабатываются. Я рекомендуем ознакомиться с обоими инструментами и использовать те функции, которые лучше всего соответствуют вашим потребностям.

Tuning a UDP connection

iPerf creates a constant bit rate UDP stream. This is a very artificial stream, similar to voice communication but not much else.

You will want to adjust the datagram size (-l) to the size your application uses.

The server detects UDP datagram loss by ID numbers in the datagrams.
Usually a UDP datagram becomes several IP packets. Losing a single IP packet will lose the entire datagram.
To measure packet loss instead of datagram loss, make the datagrams small enough to fit into a single packet, using the -l option.
The default size of 1470 bytes works for ethernet. Out-of-order packets are also detected.
(Out-of-order packets cause some ambiguity in the lost packet count;
iPerf assumes they are not duplicate packets, so they are excluded from the lost packet count.)
Since TCP does not report loss to the user, I find UDP tests helpful to see packet loss along a path.

iperf3 Omit Flag

The «omit» flag (-O) allows a specified number of seconds to be removed from a test result.  This was created to remove the ‘slow start’ portion of a TCP test, and focus on the steady state period that occurs.  For example, a normal TCP based iperf3 test  looks like the following:

$ iperf3 -c hostnameSENDER STARTConnecting to host REMOTE, port 5207 local LOCAL port 44605 connected to REMOTE port 5207 Interval           Transfer     Bandwidth       Retr  Cwnd   0.00-1.00   sec  6.28 MBytes  52.6 Mbits/sec    0   1.32 MBytes          1.00-2.00   sec   456 MBytes  3826 Mbits/sec    0   72.1 MBytes          2.00-3.00   sec  1.12 GBytes  9658 Mbits/sec    0   72.1 MBytes          3.00-4.00   sec  1.12 GBytes  9658 Mbits/sec    0   72.1 MBytes          4.00-5.00   sec  1.12 GBytes  9657 Mbits/sec    0   72.1 MBytes          5.00-6.00   sec  1.12 GBytes  9658 Mbits/sec    0   72.1 MBytes          6.00-7.00   sec  1.12 GBytes  9655 Mbits/sec    0   72.1 MBytes          7.00-8.00   sec  1.12 GBytes  9659 Mbits/sec    0   72.1 MBytes          8.00-9.00   sec  1.12 GBytes  9658 Mbits/sec    0   72.1 MBytes          9.00-10.00  sec  1.12 GBytes  9657 Mbits/sec    0   72.1 MBytes       - - - - - - - - - - - - - - - - - - - - - - - - - Interval           Transfer     Bandwidth       Retr   0.00-10.00  sec  9.45 GBytes  8114 Mbits/sec    0             sender   0.00-10.00  sec  9.43 GBytes  8103 Mbits/sec                  receiveriperf Done.SENDER END

The average will be reported as 8.1 Gbps, even though the majority of the time was spent at 9.6 Gbps. Using the Omit flag, we see the following happen in the data, and final reported average:

$ iperf3 -O 3 -c hostname SENDER STARTConnecting to host REMOTE, port 5208 local LOCAL port 37535 connected to REMOTE port 5208 Interval           Transfer     Bandwidth       Retr  Cwnd   0.00-1.00   sec  4.96 MBytes  41.6 Mbits/sec    0    987 KBytes       (omitted)   1.00-2.00   sec   332 MBytes  2786 Mbits/sec    0   65.4 MBytes       (omitted)   2.00-3.00   sec  1.12 GBytes  9636 Mbits/sec    0   72.1 MBytes       (omitted)   0.00-1.00   sec  1.12 GBytes  9657 Mbits/sec    0   72.1 MBytes          1.00-2.00   sec  1.12 GBytes  9657 Mbits/sec    0   72.1 MBytes          2.00-3.00   sec  1.12 GBytes  9657 Mbits/sec    0   72.1 MBytes          3.00-4.00   sec  1.12 GBytes  9657 Mbits/sec    0   72.1 MBytes          4.00-5.00   sec  1.12 GBytes  9657 Mbits/sec    0   72.1 MBytes          5.00-6.00   sec  1.12 GBytes  9657 Mbits/sec    0   72.1 MBytes          6.00-7.00   sec  1.13 GBytes  9666 Mbits/sec    0   72.1 MBytes          7.00-8.00   sec  1.12 GBytes  9658 Mbits/sec    0   72.1 MBytes          8.00-9.00   sec  1.12 GBytes  9657 Mbits/sec    0   72.1 MBytes          9.00-10.00  sec  1.12 GBytes  9660 Mbits/sec    0   72.1 MBytes       - - - - - - - - - - - - - - - - - - - - - - - - - Interval           Transfer     Bandwidth       Retr   0.00-10.00  sec  11.2 GBytes  9659 Mbits/sec    0             sender   0.00-10.00  sec  11.3 GBytes  9719 Mbits/sec                  receiveriperf Done.SENDER END

Bug Reports

Before submitting a bug report, please make sure you’re running the
latest version of the code, and confirm that your issue has not
already been fixed. Then submit to the iperf3 issue tracker on
GitHub:

In your issue submission, please indicate the version of iperf3 and
what platform you’re trying to run on (provide the platform
information even if you’re not using a supported platform, we
might be able to help anyway). Exact command-line arguments will
help us recreate your problem. If you’re getting error messages,
please include them verbatim if possible, but remember to sanitize any
sensitive information.

Как установить Iperf в CentOS 7

Хочу отметить, что в CentOS 7 и CentOS 8, придется делать слегка иначе. Производить инсталляцию я буду в последней версии CentOS 7, которую поставил ранее.

Начнем с установки Iperf2, для этого выполните команду:

yum install iperf

У вас должна выскочить ошибка

Failed to synchronize cache for repo ‘AppStream’, ignoring this repo. Failed to synchronize cache for repo ‘BaseOS’, ignoring this repo. Failed to synchronize cache for repo ‘extras’, ignoring this repo. No match for argument: iperf Error: Unable to find a match

Давайте посмотрим список репозиториев, делается это командой:

yum repolist

Как видим, список будет вот такой:

CentOS-7 – AppStream CentOS-7 – Base CentOS-7 – Extras

Напоминаю, что утилита Iperf является дополнительным пакетом, который не входит в основные репозитории, это прекрасно описано в Вики http://fedoraproject.org/wiki/EPEL. Дополнительные пакеты для Enterprise Linux (EPEL) – это одобренный сообществом репозиторий, который указан в вики CentOS в разделе “Доступные репозитории для Linux”, в котором отмечается, что хотя репозитории сообщества не связаны с проектом CentOS, эти репозитории часто рекомендованы сообществом. Выполните команду:

ls /etc/yum.repos.d

Как видите в файле yum.repos.d прописаны подключенные репозитории, и тут не хватает репозитория epel-release.

Давайте установим epel-release, для этого выполните:

yum install epel-release

или командой

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y

Пробуем теперь посмотреть список репозиториев в файле yum.repos.d и видим, что epel появился.

Произведем установку Iperf

yum install iperf

Все успешно выполнено. Конечно вам никто не запрещает подключить репозиторий от седьмой версии CentOS в восьмую, но они могут конфликтовать в будущем по зависимостям. Поэтому, если у вас CentOS 8, то я рекомендую сделать вот так.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector