Измерение пропускной способности Ethernet канала

в 8:10, , рубрики: ethernet, iperf, python3, Сетевые технологии

Возникла задача измерить пропускную способность Ethernet канала и предоставить отчет, причем измерения нужно проводить 24 часа. Какими способами это можно сделать?

Чем

  • Сервис speedtest.net — измеряет ширину канала Интернет до некого сервера. Нам не подходит так как данный сервис меряет не конкретный канал связи, а всю линию до определенного сервера, так же измеряемый канал связи не имеет выхода в Интернет;
  • Скачать объемный файл из одного конца канала в другой. Не совсем подходит так как отсутствует необходимая точность измерения;
  • Iperf — клиент-серверная утилита, позволяющая проводить измерения заданное время с предоставлением простенького отчета. С ней мы сейчас и поработаем.

Как

Применение инструмента iperf очень простое: с одной стороны канала на компьютере запускается сервер, который ждет соединения от клиента:

d@i:~$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------

С другой стороны канала на другом компьютере запускается клиент с указанием ip сервера:

d@i:~$ iperf -c 172.28.0.103
------------------------------------------------------------
Client connecting to 172.28.0.103, TCP port 5001
TCP window size: 2.50 MByte (default)
------------------------------------------------------------
[  3] local 172.28.0.103 port 56868 connected with 172.28.0.103 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  32.9 GBytes  28.2 Gbits/sec

Как видим из отчета пропускная способность измерялась 10 секунд и составила 28.2 Гбит/с (скорость такая большая потому что и сервер и клиент запускались на одном компьютере). Отлично, но нам нужно измерять скорость целые сутки. Смотрим параметры iperf --help и находим там кучу полезной информации. В итоге у меня получилось примерно так:

d@i:~$ iperf -c 172.28.0.103 -t 86400 -i 15
------------------------------------------------------------
Client connecting to 172.28.0.103, TCP port 5001
TCP window size: 2.50 MByte (default)
------------------------------------------------------------
[  3] local 172.28.0.103 port 56965 connected with 172.28.0.103 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-15.0 sec  58.0 GBytes  33.2 Gbits/sec
[  3] 15.0-30.0 sec  50.4 GBytes  28.9 Gbits/sec
[  3] 30.0-45.0 sec  47.4 GBytes  27.2 Gbits/sec
[  3] 45.0-60.0 sec  51.8 GBytes  29.7 Gbits/sec
[  3] 60.0-75.0 sec  45.5 GBytes  26.1 Gbits/sec
[  3] 75.0-90.0 sec  43.2 GBytes  24.7 Gbits/sec
[  3] 90.0-105.0 sec  54.6 GBytes  31.3 Gbits/sec

Параметр -t 86400 задает время измерения в секундах, а параметр -i 15 говорит выдавать результат каждые 15 секунд. Уже лучше, но не совсем удобно просматривать такой отчет за целые сутки (в таком отчете будет 86400/15=5760 строк). Смотрим help дальше и видим что iperf умеет предоставлять отчет в виде:

-y, --reportstyle C      report as a Comma-Separated Values

Проверяем:

d@i:~$ iperf -c 172.28.0.103 -t 86400 -i 15 -y C
20141130132436,172.28.0.103,56976,172.28.0.103,5001,3,0.0-15.0,59595292672,31784156091
20141130132451,172.28.0.103,56976,172.28.0.103,5001,3,15.0-30.0,49530142720,26416076117
20141130132506,172.28.0.103,56976,172.28.0.103,5001,3,30.0-45.0,57119866880,30463929002

Отлично! То, что нужно! Теперь iperf выдает статистику удобную для обработки. Параметры в отчете разделены запятыми. Первая колонка — дата и время, потом видны ip адреса и порты клиента и сервера, в конце пропускная способность в битах/с. Перенаправим этот отчет в файл:

d@i:~$ iperf -c 172.28.0.103 -t 86400 -i 15 -y C > stat.txt

Поcле окончания суточного теста в файле stat.txt аккуратно сложены результаты, которые нужно визуализировать в удобном виде для анализа.

И что теперь с этим делать?

Итак, в файле stat.txt собраны результаты тестов пропускной способности канала за нужное время с заданным интервалом. Просматривать глазами каждую из нескольких тысяч строк и делать анализ конечно можно, но когда-то люди придумали компьютеры в первую очередь для облегчения себе труда, а не для просмотра котиков в вконтактиках и мы воспользуется этим изобретением.

В файле отчета лежат данные необходимые и не очень. Избавимся от лишних. Нас интересует дата/время измерения и скорость в эту дату/время. Это первый и последний параметр в каждой строке файла stat.txt.

Я обработал этот файл наспех написанным скриптом на python3, прошу не судить за кривость кода — я ненастоящий сварщик, я маску на стройке нашел.

#!/usr/bin/env python3

import datetime

st = open('stat.txt', 'r')
res = open('est.txt', 'w')

for line in st:
    w = line.split(',')
    ti = datetime.time(int(w[0][-6:][0:2]), int(w[0][-6:][2:4]), int(w[0][-6:][4:6]))
    da = datetime.date(int(w[0][0:8][0:4]), int(w[0][0:8][4:6]), int(w[0][0:8][6:9]))
    print("{0} {1} {2}".format(da, ti, int(w[7])/(1024**2)), file=res)

res.close()

Этот скрипт читает строки из файла stat.txt и записывает результаты в файл est.txt. В файле est.txt получается:

 d@i:~/project/iperf_graph$ cat est.txt
2014-11-30 13:35:07 4521.25
2014-11-30 13:35:08 3682.875
2014-11-30 13:35:09 2974.75
2014-11-30 13:35:10 2974.625
2014-11-30 13:35:11 2976.375
2014-11-30 13:35:12 2976.25
2014-11-30 13:35:13 2977.0
2014-11-30 13:35:14 2969.75

Уже удобнее. Показана дата, время результат измерения в Мбит/с. Для этого примера взяты результаты измерения за 10 минут с отчетом каждую секунду.

Но всё еще результат в виде текстового файла не сильно удобного для анализа. Надо нарисовать график!

Для рисования графиков есть специальные и крутые программы. Я советую gnuplot за ее супергибкость, бесплатность, кучу примеров в интернете.

После получаса копаний в результатах запроса к гуглу «gnuplot example» у меня родился следующий скрипт:

#! /usr/bin/gnuplot -persist
set term png size 1024,768
#set terminal postscript eps enhanced color size 1024, 768
set output "graph.png"
set grid
set yrange[0:]
set xdata time
set xlabel "Time"
set ylabel "Mbit/s"
set timefmt "%Y-%m-%d %H:%M:%S"
set format x "%Y-%m-%d %H:%M:%S"
set xrange [] noreverse nowriteback
set xtics rotate
plot "est.txt" using 1:3 title "Bandwith"  with filledcurve x1 lt 1 lc 2

Этот скрипт читает файл est.txt, который получился после обработки stat.txt и рисует график в файл graph.png. Запускаем и появляется файл graph.png.

Результат

image

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

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

Автор: Irvy

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js