Возникла задача измерить пропускную способность Ethernet канала и предоставить отчет, причем измерения нужно проводить 24 часа. Какими способами это можно сделать?
Применение инструмента iperf очень простое: с одной стороны канала на компьютере запускается сервер, который ждет соединения от клиента:
С другой стороны канала на другом компьютере запускается клиент с указанием ip сервера:
Как видим из отчета пропускная способность измерялась 10 секунд и составила 28.2 Гбит/с (скорость такая большая потому что и сервер и клиент запускались на одном компьютере). Отлично, но нам нужно измерять скорость целые сутки. Смотрим параметры iperf --help и находим там кучу полезной информации. В итоге у меня получилось примерно так:
Параметр -t 86400 задает время измерения в секундах, а параметр -i 15 говорит выдавать результат каждые 15 секунд. Уже лучше, но не совсем удобно просматривать такой отчет за целые сутки (в таком отчете будет 86400/15=5760 строк). Смотрим help дальше и видим что iperf умеет предоставлять отчет в виде:
Проверяем:
Отлично! То, что нужно! Теперь iperf выдает статистику удобную для обработки. Параметры в отчете разделены запятыми. Первая колонка — дата и время, потом видны ip адреса и порты клиента и сервера, в конце пропускная способность в битах/с. Перенаправим этот отчет в файл:
Поcле окончания суточного теста в файле stat.txt аккуратно сложены результаты, которые нужно визуализировать в удобном виде для анализа.
Итак, в файле stat.txt собраны результаты тестов пропускной способности канала за нужное время с заданным интервалом. Просматривать глазами каждую из нескольких тысяч строк и делать анализ конечно можно, но когда-то люди придумали компьютеры в первую очередь для облегчения себе труда, а не для просмотра котиков в вконтактиках и мы воспользуется этим изобретением.
В файле отчета лежат данные необходимые и не очень. Избавимся от лишних. Нас интересует дата/время измерения и скорость в эту дату/время. Это первый и последний параметр в каждой строке файла stat.txt.
Я обработал этот файл наспех написанным скриптом на python3, прошу не судить за кривость кода — я ненастоящий сварщик, я маску на стройке нашел.
Этот скрипт читает строки из файла stat.txt и записывает результаты в файл est.txt. В файле est.txt получается:
Уже удобнее. Показана дата, время результат измерения в Мбит/с. Для этого примера взяты результаты измерения за 10 минут с отчетом каждую секунду.
Но всё еще результат в виде текстового файла не сильно удобного для анализа. Надо нарисовать график!
Для рисования графиков есть специальные и крутые программы. Я советую gnuplot за ее супергибкость, бесплатность, кучу примеров в интернете.
После получаса копаний в результатах запроса к гуглу «gnuplot example» у меня родился следующий скрипт:
Этот скрипт читает файл est.txt, который получился после обработки stat.txt и рисует график в файл graph.png. Запускаем и появляется файл graph.png.
![image](https://habrastorage.org/r/w1560/files/8a2/532/180/8a2532180ba6417d8a8c7486ad889ee7.png)
В результате появилась простая методика измерения пропускной способности канала с визуально удобным отчетом и два скрипта обработки данных.
В эти скрипты можно напихать кучу всего другого для гибкости вроде: отчет за заданный интервал времени, более подробную детализацию графика для более пристального расматривания, прикрутить анализ по времени отклика ping, параллельно с сбором суточных даных снимать с каналообразующего оборудования по SNMP другие данные типа уровней сигнала на радиоканале и показателей BER, но это уже другая история.
Чем
- Сервис 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[8])/(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](https://habrastorage.org/files/8a2/532/180/8a2532180ba6417d8a8c7486ad889ee7.png)
В результате появилась простая методика измерения пропускной способности канала с визуально удобным отчетом и два скрипта обработки данных.
В эти скрипты можно напихать кучу всего другого для гибкости вроде: отчет за заданный интервал времени, более подробную детализацию графика для более пристального расматривания, прикрутить анализ по времени отклика ping, параллельно с сбором суточных даных снимать с каналообразующего оборудования по SNMP другие данные типа уровней сигнала на радиоканале и показателей BER, но это уже другая история.