Linux QOS:Тестирование различных вариантов управленя траффиком: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 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|Тест без шейперов]]

Версия 13: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"

Точка отсчета - без шейпера

Тест без шейперов

Для того что бы получить некоторую точку отсчета (учитывая что лаба - это ВМки) делаю первый прогон без ограничения траффика.

Источники