Linux QOS:Тестирование различных вариантов управленя траффиком: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
| Строка 35: | Строка 35: | ||
Для генерации трафика я буду использовать iperf с переменным числом потоков, для сбора статистики - скрипт на питоне. Для визуализации - GnuPlot |
Для генерации трафика я буду использовать iperf с переменным числом потоков, для сбора статистики - скрипт на питоне. Для визуализации - GnuPlot |
||
| + | ===Как тестируем=== |
||
| + | Тест проходит следующим образом: |
||
| + | * на node-1 запущены множество экземпляров iperf в режиме сервера |
||
| + | <PRE> |
||
| + | BASE_PORT=5000 |
||
| + | |||
| + | for I in `seq 2 100` |
||
| + | do |
||
| + | let PORT=BASE_PORT+I |
||
| + | echo ${PORT} |
||
| + | iperf -s -l 32k -w 512k -u -p ${PORT} -D |
||
| + | iperf -s -l 32k -w 512k -p ${PORT} -D |
||
| + | done |
||
| + | </PRE> |
||
| + | * на node-2 запускается iperf в 30 потоков, каждый - на другой порт и на другой IP, для того что бы в дальнейших тестах проверять классы трафика и |
||
| + | для более равномерного распределения. sleep 30 - нужен для того что бы успеть запустить счетчики на ноде 1 |
||
| + | <PRE> |
||
| + | #!/bin/bash |
||
| + | |||
| + | sleep 30 |
||
| + | |||
| + | BASE_PORT=5000 |
||
| + | for I in `seq 2 ${1}` |
||
| + | do |
||
| + | . |
||
| + | IP=192.168.1.${I} |
||
| + | let PORT=BASE_PORT+I |
||
| + | #echo iperf -c ${IP} -b 100000M -i 1 -l 60K -t 120 -p ${PORT} -D |
||
| + | iperf -c ${IP} -b 100000M -i 1 -l 60K -t 120 -p ${PORT} -D |
||
| + | done |
||
| + | </PRE> |
||
| + | * В процессе работы собираем траффик наколенном скриптом на питоне и складываем в лог, потом рисуем график используя GnuPLOT |
||
| + | <PRE> |
||
| + | import time |
||
| + | import datetime as dt |
||
| + | import sys |
||
| + | |||
| + | stop_time=time.time()+300 |
||
| + | iface='eth0' |
||
| + | sleep_time=0.5 |
||
| + | |||
| + | tx_data_file = open('/sys/class/net/'+iface+'/statistics/tx_bytes', 'r') |
||
| + | rx_data_file = open('/sys/class/net/'+iface+'/statistics/rx_bytes', 'r') |
||
| + | res_file = open(str(sys.argv[1]),'w') |
||
| + | |||
| + | for l in rx_data_file: |
||
| + | in_bytes_prev=int(l) |
||
| + | |||
| + | for l in tx_data_file: |
||
| + | out_bytes_prev=int(l) |
||
| + | |||
| + | while True: |
||
| + | try: |
||
| + | rx_data_file.seek(0) |
||
| + | tx_data_file.seek(0) |
||
| + | |||
| + | for l in rx_data_file: |
||
| + | in_bytes=int(l) |
||
| + | for l in tx_data_file: |
||
| + | out_bytes=int(l) |
||
| + | |||
| + | |||
| + | in_bytes_diff=in_bytes-in_bytes_prev |
||
| + | out_bytes_diff=out_bytes-out_bytes_prev |
||
| + | |||
| + | in_bytes_prev=in_bytes |
||
| + | out_bytes_prev=out_bytes |
||
| + | time.sleep(sleep_time) |
||
| + | |||
| + | res_file.write(str(time.time())+" "+str((in_bytes_diff)*8/sleep_time)+" "+str((out_bytes_diff)*8/sleep_time)+"\n") |
||
| + | print str(time.time())+" "+str(in_bytes_prev)+" "+str(in_bytes)+" "+str((in_bytes_diff)*8)+" "+str(out_bytes_prev)+" "+str(out_bytes)+" "+str(out_bytes_diff)+" IN="+str((in_bytes_diff)*8/1024/1024/sleep_time)+" OUT="+str((out_bytes_diff)*8/1024/1024/sleep_time) |
||
| + | |||
| + | if time.time()>stop_time: |
||
| + | break |
||
| + | except: |
||
| + | break |
||
| + | res_file.close() |
||
| + | </PRE> |
||
| + | Скрипт для GnuPlot - заготовка из кототорой на лету формируем awk то что надо - подставляя входной файл, имя графика и т.д. |
||
| + | <PRE> |
||
| + | #!/usr/bin/gnuplot -persist |
||
| + | |||
| + | set terminal png size 1400,600 |
||
| + | # Размер и формат графика. |
||
| + | |||
| + | set output "/root/no_shaper.png" |
||
| + | |||
| + | set title "no_shaper" |
||
| + | # Заголовок |
||
| + | |||
| + | set nokey |
||
| + | # не знаю. Уточнить. |
||
| + | set key top left |
||
| + | # Расположение подписи |
||
| + | set key box |
||
| + | # Оформление (в рамке) подписи к графикам |
||
| + | |||
| + | |||
| + | set xlabel "Date" |
||
| + | # Метка по оси Х |
||
| + | |||
| + | set xdata time |
||
| + | # Описать что по оси Х время (формат ниже) |
||
| + | set timefmt "%s" |
||
| + | # Формат даты соответвует формату gnu date |
||
| + | # В моем случае был удобен такой формат. |
||
| + | |||
| + | set ylabel "Traffic" |
||
| + | #set format y '%.0s%cB' |
||
| + | set format y '%s' |
||
| + | |||
| + | plot \ |
||
| + | "/root/no_shaper.log" using 1:2 with lines title "IN, bit/s" smooth bezier, \ |
||
| + | "/root/no_shaper.log" using 1:2 with lines title "IN, bit/s" , \ |
||
| + | "/root/no_shaper.log" using 1:3 with lines title "OUT, bit/s" smooth bezier, \ |
||
| + | "/root/no_shaper.log" using 1:3 with lines title "OUT, bit/s" |
||
| + | [root@node-1 ~]# cat plot.sh |
||
| + | #!/usr/bin/gnuplot -persist |
||
| + | |||
| + | set terminal png size 1400,600 |
||
| + | # Размер и формат графика. |
||
| + | |||
| + | set output "___OUTPUT_FILE___" |
||
| + | |||
| + | set title "___TITLE_OF_PLOT___" |
||
| + | # Заголовок |
||
| + | |||
| + | set nokey |
||
| + | # не знаю. Уточнить. |
||
| + | set key top left |
||
| + | # Расположение подписи |
||
| + | set key box |
||
| + | # Оформление (в рамке) подписи к графикам |
||
| + | |||
| + | |||
| + | set xlabel "Date" |
||
| + | # Метка по оси Х |
||
| + | |||
| + | set xdata time |
||
| + | # Описать что по оси Х время (формат ниже) |
||
| + | set timefmt "%s" |
||
| + | # Формат даты соответвует формату gnu date |
||
| + | # В моем случае был удобен такой формат. |
||
| + | |||
| + | set ylabel "Traffic" |
||
| + | #set format y '%.0s%cB' |
||
| + | set format y '%s' |
||
| + | |||
| + | plot \ |
||
| + | "___INPUT_FILE___" using 1:2 with lines title "IN, bit/s" smooth bezier, \ |
||
| + | "___INPUT_FILE___" using 1:2 with lines title "IN, bit/s" , \ |
||
| + | "___INPUT_FILE___" using 1:3 with lines title "OUT, bit/s" smooth bezier, \ |
||
| + | "___INPUT_FILE___" using 1:3 with lines title "OUT, bit/s" |
||
| + | </PRE> |
||
===Точка отсчета - без шейпера=== |
===Точка отсчета - без шейпера=== |
||
[[Изображение:No_shaper.png|500px|thumb|left|Тест без шейперов]] |
[[Изображение:No_shaper.png|500px|thumb|left|Тест без шейперов]] |
||
Версия 12:56, 17 июня 2015
Linux Shaper
Эта тема всегда вызывала у меня некоторые затруднения и потому я решил систематизировать свои знания.
Описание лаборатории
Для тестирования я использую лабу из 3 виртуальных машин, виртуалбокс. Базовая ОС - Мак Ос
|-------| |--------| |-------|
|node-1 |-eth0-----eth1-|router0 |-eth2-----eth0-|node-2 |
|-------| |--------| |-------|
|
eth0
|
HOST
node-1
- 192.168.1.2
- Алиасами добавлены адреса 192.168.1.3-100
node-1
- 192.168.2.2
- Алиасами добавлены адреса 192.168.2.3-100
Router0
- eth1: 192.168.1.1
- eth2: 192.168.2.1
eth0 - служит для доступа к лабе и никак в тестах не участвует.
Все политики клсассы и прочее - только на транзитных интерфейсах eth1 и eth2
Базовое тестирование-ограничение скорости
Так как планируется большое число тестов и большое число данных, то первым делом нужно подготовить автоматизацию. Для генерации трафика я буду использовать iperf с переменным числом потоков, для сбора статистики - скрипт на питоне. Для визуализации - GnuPlot
Как тестируем
Тест проходит следующим образом:
- на node-1 запущены множество экземпляров iperf в режиме сервера
BASE_PORT=5000
for I in `seq 2 100`
do
let PORT=BASE_PORT+I
echo ${PORT}
iperf -s -l 32k -w 512k -u -p ${PORT} -D
iperf -s -l 32k -w 512k -p ${PORT} -D
done
- на node-2 запускается iperf в 30 потоков, каждый - на другой порт и на другой IP, для того что бы в дальнейших тестах проверять классы трафика и
для более равномерного распределения. sleep 30 - нужен для того что бы успеть запустить счетчики на ноде 1
#!/bin/bash
sleep 30
BASE_PORT=5000
for I in `seq 2 ${1}`
do
.
IP=192.168.1.${I}
let PORT=BASE_PORT+I
#echo iperf -c ${IP} -b 100000M -i 1 -l 60K -t 120 -p ${PORT} -D
iperf -c ${IP} -b 100000M -i 1 -l 60K -t 120 -p ${PORT} -D
done
- В процессе работы собираем траффик наколенном скриптом на питоне и складываем в лог, потом рисуем график используя GnuPLOT
import time
import datetime as dt
import sys
stop_time=time.time()+300
iface='eth0'
sleep_time=0.5
tx_data_file = open('/sys/class/net/'+iface+'/statistics/tx_bytes', 'r')
rx_data_file = open('/sys/class/net/'+iface+'/statistics/rx_bytes', 'r')
res_file = open(str(sys.argv[1]),'w')
for l in rx_data_file:
in_bytes_prev=int(l)
for l in tx_data_file:
out_bytes_prev=int(l)
while True:
try:
rx_data_file.seek(0)
tx_data_file.seek(0)
for l in rx_data_file:
in_bytes=int(l)
for l in tx_data_file:
out_bytes=int(l)
in_bytes_diff=in_bytes-in_bytes_prev
out_bytes_diff=out_bytes-out_bytes_prev
in_bytes_prev=in_bytes
out_bytes_prev=out_bytes
time.sleep(sleep_time)
res_file.write(str(time.time())+" "+str((in_bytes_diff)*8/sleep_time)+" "+str((out_bytes_diff)*8/sleep_time)+"\n")
print str(time.time())+" "+str(in_bytes_prev)+" "+str(in_bytes)+" "+str((in_bytes_diff)*8)+" "+str(out_bytes_prev)+" "+str(out_bytes)+" "+str(out_bytes_diff)+" IN="+str((in_bytes_diff)*8/1024/1024/sleep_time)+" OUT="+str((out_bytes_diff)*8/1024/1024/sleep_time)
if time.time()>stop_time:
break
except:
break
res_file.close()
Скрипт для GnuPlot - заготовка из кототорой на лету формируем awk то что надо - подставляя входной файл, имя графика и т.д.
#!/usr/bin/gnuplot -persist set terminal png size 1400,600 # Размер и формат графика. set output "/root/no_shaper.png" set title "no_shaper" # Заголовок set nokey # не знаю. Уточнить. set key top left # Расположение подписи set key box # Оформление (в рамке) подписи к графикам set xlabel "Date" # Метка по оси Х set xdata time # Описать что по оси Х время (формат ниже) set timefmt "%s" # Формат даты соответвует формату gnu date # В моем случае был удобен такой формат. set ylabel "Traffic" #set format y '%.0s%cB' set format y '%s' plot \ "/root/no_shaper.log" using 1:2 with lines title "IN, bit/s" smooth bezier, \ "/root/no_shaper.log" using 1:2 with lines title "IN, bit/s" , \ "/root/no_shaper.log" using 1:3 with lines title "OUT, bit/s" smooth bezier, \ "/root/no_shaper.log" using 1:3 with lines title "OUT, bit/s" [root@node-1 ~]# cat plot.sh #!/usr/bin/gnuplot -persist set terminal png size 1400,600 # Размер и формат графика. set output "___OUTPUT_FILE___" set title "___TITLE_OF_PLOT___" # Заголовок set nokey # не знаю. Уточнить. set key top left # Расположение подписи set key box # Оформление (в рамке) подписи к графикам set xlabel "Date" # Метка по оси Х set xdata time # Описать что по оси Х время (формат ниже) set timefmt "%s" # Формат даты соответвует формату gnu date # В моем случае был удобен такой формат. set ylabel "Traffic" #set format y '%.0s%cB' set format y '%s' plot \ "___INPUT_FILE___" using 1:2 with lines title "IN, bit/s" smooth bezier, \ "___INPUT_FILE___" using 1:2 with lines title "IN, bit/s" , \ "___INPUT_FILE___" using 1:3 with lines title "OUT, bit/s" smooth bezier, \ "___INPUT_FILE___" using 1:3 with lines title "OUT, bit/s"
Точка отсчета - без шейпера
Для того что бы получить некоторую точку отсчета (учитывая что лаба - это ВМки) делаю первый прогон без ограничения траффика.
Источники