Поиск по этому блогу

09.07.2010

Памятка про iperf

Iperf - программа для тестирования пропускной способности каналов передачи данных.
Для windows можно скачать отсюда.
Для linux или freebsd можно установить из пакетов.

iperf может тестировать полосы, загружая их tcp или udp-пакетами. Тестирование tcp-пакетами по-умолчанию.
Пусть стоит задача проверить максимально доступную полосу на данный момент. Запускается на одной стороне сервер:
$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------

На другой стороне запускается та же программа, но в режиме клиента:
c:\iperf -c 10.0.0.1
------------------------------------------------------------
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 8.00 KByte (default)
------------------------------------------------------------
[1904] local 10.0.0.2 port 1175 connected with 10.0.0.1 port 5001
[ ID] Interval Transfer Bandwidth
[1904] 0.0-10.0 sec 275 MBytes 230 Mbits/sec

На сервере отображается информация о тестировании:
4] local 10.0.0.1 port 5001 connected with 10.0.0.2 port 1175
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 275 MBytes 232 Mbits/sec

Наиболее интересное и используемое тестирование - тестирование udp-пакетами, которое позволяет посылать данные с определенной скоростью и в итоге получить информацию о потерях, джиттере.
Запускается сервер:
$ iperf -u -s
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size: 112 KByte (default)
------------------------------------------------------------
Определяемся с параметрами тестирования:
время тестирования - 300 секунд ( -t 300 );
полоса тестирования - 1Мбит/с ( -b 1M );
тест провести в обоих направлениях ( -d ).
Запускается клиент:
c:\iperf -u -c 10.0.0.1 -b 1M -d -t 300
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size: 8.00 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 10.0.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 8.00 KByte (default)
------------------------------------------------------------
[1860] local 10.0.0.2 port 1772 connected with 10.0.0.1 port 5001
[1904] local 10.0.0.2 port 5001 connected with 10.0.0.1 port 48582
[ ID] Interval Transfer Bandwidth
[1860] 0.0-300.0 sec 35.8 MBytes 1000 Kbits/sec
[1860] Server Report:
[1860] 0.0-300.0 sec 35.8 MBytes 1000 Kbits/sec 0.905 ms 0/25511 (0%)
[1860] Sent 25511 datagrams
[1904] 0.0-300.0 sec 35.8 MBytes 1000 Kbits/sec 2.830 ms 8/25510 (0.031%)
[1904] 0.0-300.0 sec 1 datagrams received out-of-order
Если время тестирование очень длительное, то можно выводить промежуточные результаты каждые 30 секунд, например. ( -i 30 )
Вывод на сервере. Видно, что сервер в ответ инициирует отправку пакетов в сторону клиента на 5001 порт:
------------------------------------------------------------
Client connecting to 10.0.0.2, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 112 KByte (default)
------------------------------------------------------------
[ 3] local 10.0.0.1 port 48582 connected with 10.0.0.2 port 5001
[ 4] local 10.0.0.1 port 5001 connected with 10.0.0.2 port 1772
[ 4] 0.0-300.0 sec 35.8 MBytes 1000 Kbits/sec 0.906 ms 0/25511 (0%)
[ 3] 0.0-300.0 sec 35.8 MBytes 1000 Kbits/sec
[ 3] Sent 25511 datagrams
[ 3] Server Report:
[ 3] 0.0-300.0 sec 35.8 MBytes 1000 Kbits/sec 2.830 ms 9/25510 (0.035%)
[ 3] 0.0-300.0 sec 1 datagrams received out-of-order

Чтобы не возникла путаница, каждый тест характеризуется собственным уникальным идентификатором (ID). Анализируя вывод на сервере можно отметить, что сервером ([ 4] local 10.0.0.1 port 5001) было получено [ 4] без ошибок (0%) 25511 пакетов. В то же время сервер отправил на [ 3] 10.0.0.2 port 5001 25510 пакетов и 0.035% из них было потеряно.
Если такой вывод сложен для восприятия, то можно применить опцию ( -r ) вместо ( -d ), чтобы каждое направление было протестировано последовательно.
$ iperf -u -c 10.0.0.1 -t 300 -r
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size: 107 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 10.0.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 107 KByte (default)
------------------------------------------------------------
[ 4] local 10.0.0.2 port 45817 connected with 10.0.0.1 port 5001
[ 4] 0.0-300.0 sec 37.5 MBytes 1.05 Mbits/sec
[ 4] Sent 26751 datagrams
[ 4] Server Report:
[ 4] 0.0-300.0 sec 37.5 MBytes 1.05 Mbits/sec 0.011 ms 3/26751 (0.011%)
[ 3] local 10.0.0.2 port 5001 connected with 10.0.0.1 port 44086
[ 3] 0.0-300.0 sec 37.4 MBytes 1.05 Mbits/sec 0.920 ms 66/26751 (0.25%)

Подобное тестирование удобно проводить при симметричных каналах. Если прямой и обратный канал отличаются, то необходимо поочередно запускать iperf в режиме сервера/клиента на каждой стороне, не используя опцию ( -d ).

Если сервер удаленный и работает на операционной системе *nix, то запускать iperf удобнее в эмуляторе терминала screen. В таком случае можно будет безболезненно отключиться от удаленной рабочей станции, где запускается сервер iperf, если период тестирования длительный.
$ screen iperf -u -s
Чтобы отключиться необходимо воспользоваться комбинацией клавиш Ctrl+a d. Посмотреть список доступных терминалов:
$ screen -list
There is a screen on:
1970.pts-2.host-laptop (15.07.2010 08:34:19) (Detached)
1 Socket in /var/run/screen/S-host.
Подключиться к работающему терминалу:
$ screen -r 1970.pts-2.host-laptop