Ограничение скорости сети vm

Материал из ISPWiki
Перейти к: навигация, поиск

Иерархия: VMmanager KVM -> Виртуальные машины
VMmanager Cloud -> Виртуальные машины

Использование ограничения в VMmanager

Для ограничения скорости передачи данных по сети для виртуальных машин VMmanager использует возможности libvirt.

Установить или изменить ограничения можно при создании или редактировании виртуальной машины.

Ограничения трафика виртуальных машин

Использование libvirt

VMmanager добавляет в XML-описание виртуальной машины следующие строки:

<domain type='kvm'>
 <devices>
   <interface type='network'>
     <bandwidth>
       <inbound average='12000'/>   Входящий трафик в KiB\s
       <outbound average='12000'/>  Исходящий трафик в KiB\s
     </bandwidth>
   </interface>
 </devices>
</domain>

Ограничение можно установить самостоятельно в XML-описании виртуальной машины с помощью команды:

virsh edit <имя vds>

После редактирования XML-описания необходимо перезагрузить виртуальную машину для применения изменений:

virsh destroy <имя vm> && virsh start <имя vm>

Обратите внимание, что при следующем изменении виртуальной машины в VMmanager, панель изменит XML на свою и изменения, внесенные вручную, будут перезаписаны.

Использование tc

libvirt использует пакет tc из состава iproute2 для ограничения пропускной способности

Подробная информация об использовании есть в статье LARTC

Компоненты системы управления трафиком Linux

Очереди (qdisc). Очереди это основные блоки, из которых строится управление трафиком в Linux. Очереди, которая потенциально может иметь дочерние объекты, назначается основной номер, называемый "handle" и использует дополнительный номер для нумерации классов, например: "10:"

Классы (class). Классы - это очень гибкие структуры, которые всегда могут содержать либо несколько подклассов, либо дисциплину обработки очереди. Идентификатор класса наследует основной номер родительской очереди и имеет дополнительный номер, обозначающий класс ('classid'). Идентификатор не имеет отношения к родительским классам, только к родительской очереди

Фильтры (filter). В простейшем случае фильтр используется для классификации пакетов. Фильтры подключаются либо к классовым дисциплинам обработки очередей, либо к классам, однако в любом случае пакет, проходящий через интерфейс, всегда проходит корневую дисциплину и лишь после этого может быть классифицирован и направлен в подкласс. Фильтры имеют идентификатор, состоящий из трех частей, который необходим для поиска в иерархии фильтров

Все ограничения накладываются на интерфейс виртуальной машины. Для примера возьмем vnet3

Ограничение на входящий трафик

Ниже приведены команды, которые использует libvirt, для ограничения входящего трафика

Очередь

root@vm:~# tc qdisc add dev vnet3 root handle 1: htb default 1

Очередь HTB является более понятной и интуитивной заменой очереди CBQ в Linux. И CBQ и HTB помогают контролировать полосу пропускания исходящего трафика. Оба позволяют разделить физическую полосу на несколько полос. В обоих случаях вы указываете как распределить трафик по полосам и определить, из какой полосы пакет будет отправлен на физическое устройство. В отличие от CBQ, HTB распределяет трафик по алгоритму иерархического буфера токенов (Token Bucket Filter), который не зависит от характеристик сетевого интерфейса и канала.

default 1 - означает, что не отфильтрованные пакеты далее попадут в класс 1:1

Класc

root@vm:~# tc class add dev vnet3 parent 1: classid 1:1 htb rate 96000Kbit

класс 1:1 - устанавливает ограничение в 96000Kbit\s

Фильтр

root@vm:~# tc filter add dev vnet3 parent 1: handle 1 protocol ip fw flowid 1:1

libvirt устанавливает фильтр для трафика с меткой 1 для перенаправления его в класс 1:1. Метку можно установить в iptables примерно так:

iptables -A PREROUTING -t mangle -i vnet3 -j MARK --set-mark 1

В данном случае метка не нужна, так как весь трафик по умолчанию попадет в class 1:1

Ограничение на исходящий трафик

Ниже приведены команды, которые использует libvirt, для ограничения исходящего трафика

Очередь

root@vm:~# tc qdisc add dev vnet3 ingress

ingress - является бесклассовой очередью, поэтому для нее используется только фильтр

Фильтр

root@vm:~# tc filter add dev vnet3 parent ffff: protocol ip u32 match ip src 0.0.0.0/0 police rate 12mbps burst 12m mtu 64kb drop flowid :1

В старых версиях libvirt ( 0.9.8) была ошибка. Mtu указывался равным burst, что приводило к сильным потерям пакетов и реальная скорость передачи данных отличалась от заданной. Проблема исправлена в версии libvirt 1.0.2