Iperf — the ultimate speed test tool for tcp, udp and sctptest the limits of your network + internet neutrality test

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

Виды и версии 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 активно (хотя и независимо) разрабатываются. Я рекомендуем ознакомиться с обоими инструментами и использовать те функции, которые лучше всего соответствуют вашим потребностям.

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

Для просмотра всех возможных параметров с описанием (на английском), достаточно запустить 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  выводить результаты серверной части

How to use iperf

Once we have iperf, we need to learn how to use it. As we mentioned above, we need to run both server and client. The server will keep listening, accepting client connections. Thus, this is the first thing we need to do. Running the server is as simple as writing in the prompt ( stands for server). The first time you do that, on Windows, it will ask you network permission. Of course, flag the permissions and click Allow access.

Enable network access for iperf.

Once you enable the access, a simple message will appear on the prompt, telling you that the server is ready to accept connections. By default, iperf3 listens on port 5201.

The iperf server ready to accept connections.

Now, we will leave the server be. This server will accept all our connections. However, we will be able to tweak the tests and even pilot the server from the iperf client. That’s where the real deal is.

A simple speed test with iperf

Now, how to use iperf3 to run a simple speed test? You can simply use the command, of course replacing “<server IP>” with the IP of your server. However, we want to have a better test. Thus, we want to give TCP all the time it needs to expand the window size: better to run a test for some more seconds. We can do that with the option, followed by the number of seconds. This will tell iperf3 how long to run the test. Generally, one to two minutes are enough (just to show, we will use 5 seconds). Since our server is running on the same PC, the target IP will be localhost at , but that’s just the case of this demonstration.

If we want to know how to use iperf, we need to know how analyze the output. The standard output is a table with four columns. Furthermore, the last two rows of the table (after the dash line) represent the totals.

  • ID is the ID of the iperf operation
  • Interval is the time span  the row refers to
  • Transfer is the amount of data exchanged between client and server. In the end, speed test is about transferring files and measuring how long it took.
  • Bandwidth is the measured bandwidth

Why don’t we have a single total/summary row? Because we want to see the different performances between sending and receiving. In fact, on the far right of the summary rows, you will see sender and receiver bandwidth. In our case, the sender is the client so it means the upload speed. Instead, receiver means download speed. The two might not be always the same, in case of asymmetric bandwidth.

Other cool options

So far so good. In fact, you know how to use iperf by simply using the commands above. However, you may want to use some options to tweak the measurement at your liking. If you want to know all options, use . Here, we will see the most useful ones.

  • creates N parallel connections, useful to push links to their limit
  • runs in reverse mode: the server will send and the client will receive
  • indicate a limit bandwidth (for example 10k, 5mb, 1gb). The test won’t go much beyond this value, even if the link has higher capacity.
  • generates the output in JSON once the operation finishes, useful if you want to use iperf in scripts.

Try to experiment combining all the options you’d like together. You will achieve enterprise-grade professional bandwidth testing.

Установка ipref

Для начала утилиту iperf следует скачать. Она не входит в сборки Windows, не является частью ОС. Загружают iperf отдельно. Можно скачать здесь, предварительно выбрав требуемую разрядность ОС:

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

Алгоритм следующий:

Запустить Командную строку (в Windows 10 ввести «cmd» в поиске).

Ввести «cd c:/» (если утилита находится на данном диске).

Далее, для использования в качестве клиента, вводится сочетание: «iperf -c -t 30 -i 10». Здесь «t» задает время теста, а «i» – периодичность обновления данных.

Если будет архивный файл дистрибутива iperf, то его перед установкой потребуется распаковать. Иногда необходимо запускать утилиту под учетной записью Администратора. Список доступных команд появится после ввода «dir». Обязательно скачивается наиболее свежая версия ПО. Выбрать «двойку» или «тройку» 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 на CentOS 8

Ранее, я так же установил CentOS 8 в тестовой среде. Хочу отметить, что если вы попытаетесь добавить репозиторий epel-release командой:

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

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

dnf repository-packages epel list | grep -i iperf

Как я и писал выше не желательно устанавливать epel 7 и 8 версии репозитория, я лично в такой ситуации просто выхожу подобным образом. Я открываю сайт https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/ и ищу нужный мне пакет, копирую на нужный мне прямую ссылку.

Далее я устанавливаю в CentOS 8 пакет wget, для этого выполняем:

yum install wget -y

Далее скачиваем пакет, ссылку на который мы заранее выяснили.

wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/i/iperf-2.0.13-1.el7.x86_64.rpm

Далее производим установку iperf2 в системе, через выполнение команды:

rpm -ivh iperf-2.0.13-1.el7.x86_64.rpm

Так же для CentOS 8 рекомендуется включить репозиторий PowerTools, поскольку пакеты EPEL могут зависеть от пакетов из него

dnf config-manager —set-enabled PowerTools

Emulating wide area network delays with Linux

NetEm (already enabled in the Linux kernel) provides Network Emulation functionality for testing protocols by emulating the properties of wide area networks.
To simulate an additional latency of 80 ms, just type sudo tc qdisc add dev eth0 root netem delay 80ms
It just adds a fixed amount of delay to all packets going out of the local Ethernet.
To stop the additional latency, just type sudo tc qdisc change dev eth0 root netem delay 0ms
Lines to add to the file /etc/rc.local before exit 0, to add 40ms of latency :

Note: If your network interface is not eth0, replace eth0 with the name of your network interface

Пример 1

Сервер:

 
iperf -s
  ------------------------------------------------------------
  Server listening on TCP port 5001
  TCP window size: 85.3 KByte (default)
  ------------------------------------------------------------

Клиент:

  
  iperf -c 95.169.186.76
------------------------------------------------------------
Client connecting to 95.169.186.76, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
 local 77.72.128.66 port 38250 connected with 95.169.186.76 port 5001
 Interval       Transfer     Bandwidth
  0.0-10.0 sec  96.3 MBytes  80.5 Mbits/sec

TCP window size: 325 KByte (default)

local 10.10.10.2 port 44030 connected with 10.10.10.3 port 5001
local 10.10.10.2 port 44018 connected with 10.10.10.3 port 5001
local 10.10.10.2 port 44020 connected with 10.10.10.3 port 5001
local 10.10.10.2 port 44024 connected with 10.10.10.3 port 5001
local 10.10.10.2 port 44022 connected with 10.10.10.3 port 5001
local 10.10.10.2 port 44026 connected with 10.10.10.3 port 5001
local 10.10.10.2 port 44028 connected with 10.10.10.3 port 5001
local 10.10.10.2 port 44016 connected with 10.10.10.3 port 5001
Interval Transfer Bandwidth
0.0-10.0 sec 4.82 GBytes 4.14 Gbits/sec
0.0-10.0 sec 2.28 GBytes 1.96 Gbits/sec
0.0-10.0 sec 2.47 GBytes 2.12 Gbits/sec
0.0-10.0 sec 5.16 GBytes 4.43 Gbits/sec
0.0-10.0 sec 4.81 GBytes 4.13 Gbits/sec
0.0-10.0 sec 4.92 GBytes 4.23 Gbits/sec
0.0-10.0 sec 2.33 GBytes 2.00 Gbits/sec
0.0-10.0 sec 2.32 GBytes 1.99 Gbits/sec
0.0-10.0 sec 29.1 GBytes 25.0 Gbits/sec

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)

Script pour héberger un serveur iPerf3 avec Linux (Ubuntu / Debian)

Краткое содержание

iPerf3 ne permet pas de multiples clients sur un serveur => il est nécessaire de lancer plusieurs processus iperf pour ne pas avoir le message iperf3: error – the server is busy running a test. try again laterScript bash restart_iperf.sh pour démarrer 10 serveurs iPerf3 (du port TCP 5200 au port TCP 5209) :

Lignes à ajouter au fichier /etc/rc.local avant exit 0, pour lancer iPerf3 automatiquement, lorsque vous démarrez le serveur.
le trafic UDP est bloqué avec iptables (IPv4) et ip6tables (IPv6) pour prévenir les attaques DDOS :

Lignes à ajouter à la crontab, pour redémarrer iPerf3 toutes les heures (Utilisez crontab -e pour modifier le crontab).
Le redémarrage régulier est nécessaire, car le processus peut se bloquer ou crasher.

Reverse Option: iPerf Version 2 vs 3

iPerf version 2 and 3 are currently maintained in parallel from two different teams. iPerf has been around for more than 15 years; iPerf 3 was created with the goal of a smaller and simpler code base, as well as offering a library for integrating with other code.

The two versions are incompatible with each other, and there are only a few differences in terms of the options and functionalities that they offer. In this post, I wanted to focus on a subtle difference that I often have to explain, even to network engineers that have been using iPerf for a while.

Regular iPerf Test

The client of an iPerf test is the host that sends data to the server, as depicted  in this image:

The sequence of events is as follows:

  1. The server iperf.netbeez.net starts listening on port 5000 (iperf -s -p 5000)
  2. The client starts the test towards the server (iperf -c iperf.netbeez.net -p 5000)
  3. The server accepts the connection
  4. The client detects that the connection with the server is successful
  5. The client starts uploading data to the server
  6. The client finishes the data upload prints the results and exits

This sequence is common on both versions.

This setup measures upload speed from the client to the server. Both iPerf versions have the option to measure download speed by setting the appropriate flag.

On version 2 the flag is “-r” and on version 3 it’s “-R”. However, the name of the option is not the only difference – let’s see how they differ.

Reverse iPerf Version 2

When you give the “-r” option there are two steps for the test:

Step 1: The client runs an upload speed exactly as described in the previous section:

Step 2: The server initiates a connection towards the client and uploads the test data

Cut down troubleshooting time and prove it’s not the network.

Request 15-day trial!

The problem with this implementation is that the host that initiates the test (iPerf client) needs to be accessible from the server in order to accept the new connection and receive the traffic. In many cases, this may not be possible. For example, if the client is NAT’ed or, if there are firewall rules that prevent incoming connections, then the reverse iPerf version 2 test fails.

Reverse iPerf Version 3

When you give the “-R” option to iPerf 3 then the test runs as follows:

The sequence of events is as follows:

  1. The server iperf.netbeez.net starts listening on port 5000 (iperf3 -s -p 5000)
  2. The client starts the test towards the server (iperf3 -c iperf.netbeez.net -p 5000 -R)
  3. The server accepts the connection
  4. The server starts uploading data to the client
  5. The server finishes the data upload and the client prints the results and exits

The subtle difference here is that the server uses the already established connection from the client to upload the data. This setup doesn’t have the problem that version 2 has, where the test fails if the client can’t accept the connection from the server.

Obviously, the version 3 reverse option is preferable for this reason. This gives you the option to run an upload and download test from and to the client without any restrictions.

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.

Changes from iperf 2.x¶

New options (not necessarily complete, please refer to the manual page
for a complete list of iperf3 options):

-V, --verbose             more detailed output than before
-J, --json                output in JSON format
-Z, --zerocopy            use a 'zero copy' sendfile() method of sending data
-O, --omit N              omit the first n seconds (to ignore slowstart)
-T, --title str           prefix every output line with this string
-F, --file name           xmitrecv the specified file
-A, --affinity nn,m      set CPU affinity (Linux and FreeBSD only)
-k, --blockcount #   number of blocks (packets) to transmit (instead
                          of -t or -n)
-L, --flowlabel           set IPv6 flow label (Linux only)

Changed flags:

-C, --linux-congestion    set congestion control algorithm (Linux only)
                          (-Z in iperf2)

Deprecated flags (currently no plans to support):

-d, --dualtest           Do a bidirectional test simultaneously
-r, --tradeoff           Do a bidirectional test individually
-T, --ttl                time-to-live, for multicast (default 1)
-x, --reportexclude CDMSV   exclude C(connection) D(data) M(multicast)
                              S(settings) V(server) reports
-y, --reportstyle C      report as a Comma-Separated Values

iPerf features

  • TCP and SCTP
    • Measure bandwidth
    • Report MSS/MTU size and observed read sizes.
    • Support for TCP window size via socket buffers.
  • UDP
    • Client can create UDP streams of specified bandwidth.
    • Measure packet loss
    • Measure delay jitter
    • Multicast capable
  • Cross-platform: Windows, Linux, Android, MacOS X, FreeBSD, OpenBSD, NetBSD, VxWorks, Solaris,…
  • Client and server can have multiple simultaneous connections (-P option).
  • Server handles multiple connections, rather than quitting after a single test.
  • Can run for specified time (-t option), rather than a set amount of data to transfer (-n or -k option).
  • Print periodic, intermediate bandwidth, jitter, and loss reports at specified intervals (-i option).
  • Run the server as a daemon (-D option)
  • Use representative streams to test out how link layer compression affects your achievable bandwidth (-F option).
  • A server accepts a single client simultaneously (iPerf3) multiple clients simultaneously (iPerf2)
  • New: Ignore TCP slowstart (-O option).
  • New: Set target bandwidth for UDP and (new) TCP (-b option).
  • New: Set IPv6 flow label (-L option)
  • New: Set congestion control algorithm (-C option)
  • New: Use SCTP rather than TCP (–sctp option)
  • New: Output in JSON format (-J option).
  • New: Disk read test (server: iperf3 -s / client: iperf3 -c testhost -i1 -F filename)
  • New: Disk write tests (server: iperf3 -s -F filename / client: iperf3 -c testhost -i1)

Основные отличия Iperf2 и Iperf3

Каждый из этих инструментов имеет несколько разные функции и немного другую архитектуру, поэтому не стоит ожидать, что какой-то один инструмент будет иметь все необходимое. Лучше быть знакомым с несколькими инструментами и использовать правильный инструмент для вашего конкретного случая использования. Одно ключевое отличие заключается в том, является ли инструмент однопоточным или многопоточным. Если вы хотите протестировать производительность параллельного потока, вы должны использовать многопоточный инструмент, такой как iperf2, хотя в iperf3 так же можно сделать костыль.

Обратите внимание, что по умолчанию Iperf3 официально не поддерживается в Windows, но это не означает, что он там не будет работать, могут быть нюансы и глюки

Обратите внимание, что все три из этих инструментов находятся в активной разработке, и список уникальных функций для данного инструмента, вероятно, со временем изменится. Исходя из моего опыта, я рекомендуем следующее:

  • Используйте iperf2 для параллельных потоков, двунаправленных тестов или тестов на базе MS Windows.
  • Используйте nuttcp или iperf3 для высокоскоростного тестирования UDP

Примеры использования iPerf

Рассмотрим некоторые команды запросов к серверу для проверки скорости соединения.

Использование UDP

iperf3 -c 192.168.0.15 -u

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

Альтернативные порты

Для этого необходимо сначала запустить сервер на нужном порту:

iperf3 -s -p 443

* кстати, можно запустить несколько процессов iperf одновременно, которые будут слушать на разных портах.
* стоит не забывать по настройки брандмауэра. В данном примере понадобиться ввести команды firewall-cmd —permanent —add-port=443/tcp и firewall-cmd —reload.

Теперь можно запускать клиента:

iperf3 -c 192.168.0.15 -p 443

Проверка скорости в течение 30 секунд с интервалами по 2 секунды

iperf3 -c 192.168.0.15 -t 30 -i 2

Несколько параллельных запросов

iperf3 -c 192.168.0.15 -P 3

Отправляем на проверку 3 Гб данных

iperf3 -c 192.168.0.15 -n 3G

Emulating wide area network delays with Linux

NetEm (already enabled in the Linux kernel) provides Network Emulation functionality for testing protocols by emulating the properties of wide area networks.
To simulate an additional latency of 80 ms, just type sudo tc qdisc add dev eth0 root netem delay 80ms
It just adds a fixed amount of delay to all packets going out of the local Ethernet.
To stop the additional latency, just type sudo tc qdisc change dev eth0 root netem delay 0ms
Lines to add to the file /etc/rc.local before exit 0, to add 40ms of latency :

Note: If your network interface is not eth0, replace eth0 with the name of your network interface

Tuning a TCP connection

bandwidth delay product

Note that many OSes and hosts have upper limits on the TCP window size.
These may be as low as 64 KB, or as high as several MB. iPerf tries to detect when these occur and give a warning that the actual and requested window sizes are
not equal (as below, though that is due to rounding in IRIX).
For more information on TCP window sizes, see the LaFibre.info.
Here is an example session, between node1 in Illinois and node2 in North Carolina. These are connected via the vBNS backbone and a 45 Mbit/sec DS3 link.
Notice we improve bandwidth performance by a factor of 3 using proper TCP window sizes.
Use the adaptive window sizes feature on platforms which allow setting window sizes in the granularity of bytes.

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 Comparison with JPerf

Fresh JPerf 2.0.2 installation from Google Code was used for comparison with IPERF for Windows. There is a confusion right from the beginning: don’t think you use iPerf 2.0.2! That’s JPerf 2.0.2, which in turn uses iPerf 1.7.0 from year 2003 — please go to /bin folder and check yourself, or click the screenshot below.

Let’s configure moderate traffic: 5 UDP streams of 5 Mbps each, to my default gateway — DSL router, where it will be dropped. Apparently each stream runs only ~3.3 Mbps not 5 Mbps as requested! Run Windows Task Manager as an independent arbiter — it shows total bandwidth of 16 Mbps, not requested 25 Mbps. It shows the problem as well: CPU load goes 100%! Obviously JPerf consumes all CPU cycles so can’t run requested 25 Mbps of traffic — what about 1G?

Let’s run IPERF for Windows with the same 5 UDP streams of 5 Mbps each. IPERF Charts displays per stream traffic of exactly 5 Mbps, with total traffic 25 Mbps, as requested. Task Manager confirms the same 25 Mbps of total traffic. Also Task Manager and IPERF show, that CPU load is negligible during IPERF test. It gives enough room to run much heavier bandwidth tests. All that was achieved by recent win32 update of original linux iPerf 2.0.5 code and compilation in Visual Studio 2013.

There is no QoS on Windows in JPerf (iPerf 1.7.0 — ‘Type of Service’), because Microsoft QoS code is different from linux code.

Comparative results are summarised below and on this screenshot, click it to enlarge:

Apparently, high CPU load is produced not by JPerf code itself, but by iPerf 1.7.0. Try to run it without UI in command line with the same parameters — still CPU 100%:

Conclusion:
— JPerf 2.0.2 is unusable in default package, because of high CPU usage by outdated iPerf 1.7.0 from year 2003
— JPerf does not show CPU usage on the same chart like IPERF for Windows does, which is vital for modern high-bandwidth tests
— JPerf User Interface can be used if iperf.exe is replaced with newer binary, for example command-line version of IPERF for Windows (it works!)
— JPerf ‘Type of Service’ doesn’t work the way how QoS shoud work in Windows — DSCP set in IPERF for Windows
— JPerf User Interface has less controls compare to IPERF for Windows, and doesn’t have TestHistory drop-down list — which is very handy feature
— JPerf Chart doesn’t display total but only per stream values
    It can not move charts left and right with a mouse
    can not stretch/compress vertical axes with a mouse
    does not have Full Time History mode in addition to Sliding Time Window
    can not turn On/Off individual charts and axis
    can not provide screenshots or HTML reports

Как пользоваться iperf

Для примеров я буду использовать сервер с адресом 192.168.0.101. Адрес клиента не имеет значения. Сначала необходимо запустить серверную часть программы. Для этого выполните:

Вы можете сразу указать в каких единицах измерения хотите видеть результаты. Для этого используется опция -f. Доступны такие варианты:

  • k – килобиты;
  • m – мегабиты;
  • g – гигабиты;
  • K – килобайты;
  • M – мегабайты;
  • G – гигабайты;
  • T – терабайты.

Аналогично для сервера можно задать порт с помощью опции -p. По умолчанию он работает на порту 5201:

В любом случае, если на сервере установлен брандмауэр, то вам надо разрешить в нём подключение к порту 5201 или тому, который вы выбрали. Например, для ufw команда будет выглядеть так:

sudo ufw allow 5201

sudo firewall-cmd –permanent –add-port=5201/tcp sudo firewall-cmd –permanent –add-port=5201/udp sudo firewall-cmd –reload

И если вы хотите запустить программу в фоновом режиме, можете использовать опцию -D и перенаправить вывод в лог файл:

iperf3 -s -D –logfile /var/log/ipref.log

Убедится, что сервер запущен можно с помощью команды ss:

ss -tulpn | grep 5201

Обратите внимание на IP адрес, на котором слушает сервер, звездочка означает IPv4 соединения, а – IPv6. Поэтому, возможно вам придется вручную указать откуда надо ждать подключений:

iperf3 -s -4 -D –logfile /var/log/ipref.log

iperf3 -s -4 -D –logfile /var/log/ipref.log

Теперь к серверу можно подключаться. Для этого используйте опцию -c. Если вы меняли порт сервера, то здесь его надо указать с помощью опции -p:

iperf3 -c 192.168.0.101 -f K

В данном примере тест выполняется 10 секунд. Чтобы понять какая сейчас у вас пропускная способность сети следует смотреть на колонку Bitrate

Обращайте внимание на строки под чертой, они отображают среднее значение. В данном примере было передано 113 мебабайт со скоростью 11534 килобайт в секунду. По умолчанию утилита выводит промежуточный результат каждую секунду, вы можете изменить это поведение с помощью опции -i

Например, 5 секунд:

По умолчанию утилита выводит промежуточный результат каждую секунду, вы можете изменить это поведение с помощью опции -i. Например, 5 секунд:

iperf3 -c 192.168.0.101 -f M -i 5

А общую продолжительность теста можно задать с помощью опции -t. Например, 30 секунд:

iperf3 -c 192.168.0.101 -f M -i 5 -t 30

По умолчанию клиент отправляет данные серверу. Вы можете использовать опцию -R, чтобы сервер отправлял данные клиенту:

iperf3 -c 192.168.0.101 -f K -R

Если вы хотите видеть вывод сервера на клиенте, достаточно использовать опцию –get-server-output:

iperf3 -c 192.168.0.101 -f K –get-server-output

С помощью опции -P можно указать количество параллельных потоков тестирования, например, два:

iperf3 -c 192.168.0.101 -f K -P 2

Чтобы использовать UDP пакеты вместо TCP используйте опцию -u:

iperf3 -c 192.168.0.101 -f K -u

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

iperf3 -c iperf.volia.net

Script to host a iPerf3 server with Linux (Ubuntu / Debian)

iPerf3 not allow multiple tests to a server => it is necessary to start several iPerf processes for not having the message iperf3: error — the server is busy running a test. try again later
Systemd script to start 41 iPerf3 server (port 9200 to port 9240).
sudo adduser iperf —disabled-login —gecos iperf
sudo nano /etc/systemd/system/iperf3-server@.service

The «Restart = always» allows to restart iperf3 after one hour (RuntimeMaxSec = 3600) to limit the cases of no response or when the iperf3 server has ended abruptly.

sudo systemctl daemon-reload
To activate iperf3 when the server starts up:
for p in $(seq 9200 9240); do sudo systemctl enable iperf3-server@$p ; done

sudo reboot

To view the status and logs of iPerf3 :sudo systemctl status iperf3-server@*
sudo journalctl -u iperf3-server@*

To disable iperf3 when starting the server :for p in $(seq 9200 9240); do sudo systemctl disable iperf3-server@$p ; done

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

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

Adblock
detector