Функционал SR-IOV в OpenStack¶
Данная документация написана для версии OpenStack Train.
SR-IOV - функционал, позволяющий виртуализировать PCIe Ethernet устройство, представив его в виде множества PCIe устройств. При этом каждое виртуальное PCIe устройство может быть напрямую подключено к виртуальной машине, запущенной в Openstack. Данный подход позволяет достигать низких задержек трафика и приближает скорость виртуального интерфейса к физическому.
Важно
Для возможности работы с SR-IOV необходимо, чтобы данный функцинал поддерживался оборудованием.
Примечание
В данном описании используется физический интерфейс eth1
. Имя данного интерфейса может отличаться в зависимости от настраиваемого окружения.
Настройка виртуальных устройств (выполняется на гипервизоре):¶
Убедитесь, что функционал SR-IOV и VT-d включены в BIOS.
Включите IOMMU, добавив параметр “intel_iommu=on” к параметрам ядра в файле
/etc/default/grub
. Пример с включенным параметром:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1 iommu=pt"
На всех гипервизорах создайте виртуальные интерфейсы:
echo '8' > /sys/class/net/eth1/device/sriov_numvfs
Проверьте максимальное количество виртуальных интерфейсов поддерживаемых в вашей системе:
# cat /sys/class/net/eth3/device/sriov_totalvfs
Убедитесь, что виртуальные интерфейсы созданы и находятся в состоянии UP:
ip link show eth3
Добавьте возможность создания виртуальных интерфейсов после перезагрузки:
# echo "echo '7' > /sys/class/net/eth1/device/sriov_numvfs" >> /etc/rc.local
Настройка работы с PCI устройствами в nova-compute (выполняется на гипервизоре):¶
В файл
nova.conf
добавьте информацию а том, какие PCI устройства nova-compute сможет использовать:[pci] passthrough_whitelist = { "devname": "eth1", "physical_network": "physnet1"}
Перезапустите службы nova-compute.
Настройка neutron-server (выполняется на контроллере):¶
Добавьте
sriovnicswitch
к используемым драйверам. Для этого отредактируйте файлml2_conf.ini
на каждом контроллере:[ml2] mechanism_drivers = openvswitch,sriovnicswitch
Убедитесь, что ваша физическая сеть указана в настройках файла
ml2_conf.ini
:[ml2_type_vlan] network_vlan_ranges = physnet1
Перезапустите neutron-server.
Настройка nova-scheduler (выполняется на контроллере):¶
На всех контроллерах с запущенной службой nova-scheduler добавьте новый фильтр
PciPassthroughFilter
, для этого в nova.conf добавьте следующее:[filter_scheduler] enabled_filters = AvailabilityZoneFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter, PciPassthroughFilter available_filters = nova.scheduler.filters.all_filters
Перезапустите службу nova-scheduler.
Настройка агента sr-iov (выполняется на гипервизоре):¶
Отредактируйте файл
sriov_agent.ini
согласно настройкам вашего облака:[securitygroup] firewall_driver = neutron.agent.firewall.NoopFirewallDriver [sriov_nic] physical_device_mappings = physnet1:eth1 exclude_devices =
Установите агента sr-iov для neutron и запустите его:
apt install neutron-sriov-agent systemctl enable neutron-sriov-agent systemctl start neutron-sriov-agent
Запуск виртуальной машины с портами SR-IOV¶
Создайте внешнюю сеть и подсеть с нужными параметрами:
openstack network create --provider-physical-network physnet1 \ --provider-network-type sriov-net openstack subnet create --network sriov-net \ --subnet-pool shared-default-subnetpool-v4 \ sriov-subnet
Получите id созданной сети:
net_id=$(openstack network show sriov-net -c id -f value)
Создайте порт в сети с типом direct и получите его id:
openstack port create --network $net_id --vnic-type direct \ sriov-port port_id=$(openstack port show sriov-port -c id -f value)
Запустите виртуальную машину:
openstack server create --flavor m1.large --image ubuntu_18.04 \ --nic port-id=$port_id \ test-sriov