Принцип работы ускоренной сети в виртуальных машинах Linux и FreeBSD

При создании виртуальной машины в Azure создается искусственный сетевой интерфейс для каждой виртуальной сетевой карты в конфигурации. Искусственный интерфейс — это устройство VMbus и использует драйвер netvsc. Сетевые пакеты, использующие этот искусственный интерфейс, проходят через виртуальный коммутатор в узле Azure и в физическую сеть центра обработки данных.

Если виртуальная машина настроена с помощью ускорения сети, для каждой виртуальной сетевой карты, настроенной, создается второй сетевой интерфейс. Второй интерфейс — это виртуальная функция SR-IOV, предлагаемая сетевым адаптером физической сети в узле Azure. Интерфейс VF отображается в гостевой системе Linux в качестве устройства PCI. Он использует драйвер Mellanox mlx4 или mlx5 в Linux, так как узлы Azure используют физические сетевые адаптеры из Mellanox.

Большинство сетевых пакетов передаются непосредственно между гостевой сетью Linux и физическими сетевыми платами без перенаправления через виртуальный коммутатор или другое программное обеспечение, работающее на узле. Из-за прямого доступа к оборудованию задержка сети снижается и меньше времени ЦП используется для обработки сетевых пакетов по сравнению с искусственным интерфейсом.

Разные узлы Azure используют различные модели физического сетевого адаптера Mellanox. Linux автоматически определяет, следует ли использовать драйвер mlx4 или mlx5. Инфраструктура Azure управляет размещением виртуальной машины на узле Azure. Без возможности клиента указать, какой физический сетевой адаптер использует развертывание виртуальной машины, виртуальные машины должны включать оба драйвера. Если виртуальная машина остановлена или освобождена, а затем перезапущена, она может быть повторно развернута на оборудовании с другой моделью физической сетевой карты Mellanox. Таким образом, она может использовать другой драйвер Mellanox.

Если образ виртуальной машины не включает драйвер физической сетевой карты Mellanox, сетевые возможности продолжают работать на более медленных скоростях виртуальной сетевой карты. На портале, Azure CLI и Azure PowerShell отображаются функции ускорения сети, как включено.

FreeBSD обеспечивает ту же поддержку ускорения сети, что и Linux при работе в Azure. В оставшейся части этой статьи описывается Linux и используются примеры для Linux, но те же функциональные возможности доступны в FreeBSD.

Примечание.

Эта статья содержит упоминания термина slave (ведомый) . Корпорация Майкрософт больше не использует его. Когда этот термин будет удален из программного обеспечения, мы удалим его из этой статьи.

Соединение

Искусственный сетевой интерфейс и интерфейс VF автоматически объединяются и действуют как единый интерфейс в большинстве аспектов, используемых приложениями. Драйвер netvsc выполняет связывание. В зависимости от дистрибутива Linux правила и скрипты udev могут помочь в именовании интерфейса VF и настройке сети.

Если виртуальная машина настроена с несколькими виртуальными сетевыми платами, то узел Azure предоставляет уникальный серийный номер для каждой из них. Он позволяет Linux выполнять правильную связывание синтетических и виртуальных сетевых интерфейсов для каждого виртуального сетевого адаптера.

Искусственные и виртуальные интерфейсы имеют один и тот же MAC-адрес. Вместе они представляют собой единый сетевой адаптер с точки зрения других сетевых сущностей, которые обменивают пакеты с виртуальным сетевым адаптером на виртуальной машине. Другие сущности не предпринимают никаких специальных действий в отношении существования искусственного интерфейса и интерфейса VF.

Оба интерфейса видны с помощью ifconfig или ip addr команды в Linux. Ниже приведен пример ifconfig выходных данных:

U1804:~$ ifconfig
enP53091s1np0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
ether 00:0d:3a:f5:76:bd  txqueuelen 1000  (Ethernet)
RX packets 365849  bytes 413711297 (413.7 MB)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 9447684  bytes 2206536829 (2.2 GB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 10.1.19.4  netmask 255.255.255.0  broadcast 10.1.19.255
inet6 fe80::20d:3aff:fef5:76bd  prefixlen 64  scopeid 0x20<link>
ether 00:0d:3a:f5:76:bd  txqueuelen 1000  (Ethernet)
RX packets 8714212  bytes 4954919874 (4.9 GB)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 9103233  bytes 2183731687 (2.1 GB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Искусственный интерфейс всегда имеет имя в форме eth\<n\>. В зависимости от дистрибутива Linux интерфейс VF может иметь имя в форме eth\<n\>. Или оно может иметь другое имя в виде enP\<n\> правила udev, которое выполняет переименование.

Вы можете определить, является ли определенный интерфейс искусственным интерфейсом или интерфейсом VF с помощью командной строки оболочки, в которой показан драйвер устройства, который использует интерфейс:

$ ethtool -i <interface name> | grep driver

Если драйвер есть hv_netvsc, это искусственный интерфейс. Интерфейс VF имеет имя драйвера, содержащее mlx. Интерфейс VF также можно определить, так как его flags поле включает SLAVE. Этот флаг указывает на то, что он находится под управлением искусственного интерфейса с таким же MAC-адресом.

IP-адреса назначаются только искусственному интерфейсу. Выходные данные ifconfig или ip addr также показывают это различие.

Использование приложений

Приложения должны взаимодействовать только с искусственным интерфейсом, как и в любой другой сетевой среде. Исходящие сетевые пакеты передаются от драйвера netvsc к драйверу VF, а затем передаются через интерфейс VF.

Входящие пакеты поступают в интерфейс VF и обрабатываются в нем, прежде чем они будут переданы в искусственный интерфейс. Исключения представляют собой входящие пакеты TCP SYN и широковещательные или многоадресные пакеты, обработанные только искусственным интерфейсом.

Вы можете убедиться, что пакеты передаются по интерфейсу VF из выходных ethtool -S eth\<n\>данных. Выходные строки, содержащие vf трафик через интерфейс VF. Например:

U1804:~# ethtool -S eth0 | grep ' vf_'
 vf_rx_packets: 111180
 vf_rx_bytes: 395460237
 vf_tx_packets: 9107646
 vf_tx_bytes: 2184786508
 vf_tx_dropped: 0

Если эти счетчики увеличиваются при последовательном выполнении ethtool команды, сетевой трафик передается через интерфейс VF.

Вы можете проверить существование интерфейса VF в качестве устройства PCI с помощью lspci команды. Например, на виртуальной машине поколения 1 вы можете получить выходные данные, аналогичные следующим выходным данным. (Виртуальные машины поколения 2 не имеют устаревших устройств PCI.)

U1804:~# lspci
0000:00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled) (rev 03)
0000:00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 01)
0000:00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
0000:00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 02)
0000:00:08.0 VGA compatible controller: Microsoft Corporation Hyper-V virtual VGA
cf63:00:02.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function] (rev 80)

В этом примере последняя строка выходных данных указывает на VF с физической сетевой платы Mellanox-4.

Команда ethtool -l или ethtool -L команда (для получения и задания количества очередей передачи и получения) является исключением из руководства для взаимодействия с интерфейсом eth<n> . Эту команду можно использовать непосредственно в интерфейсе VF для управления количеством очередей для интерфейса VF. Число очередей для интерфейса VF не зависит от количества очередей для искусственного интерфейса.

Интерпретация сообщений о запуске

Во время запуска Linux отображает множество сообщений, связанных с инициализацией и конфигурацией интерфейса VF. В нем также показаны сведения о связывании с искусственным интерфейсом. Понимание этих сообщений может оказаться полезным при выявлении каких-либо проблем в процессе.

Ниже приведен пример выходных данных из dmesg команды, обрезанный только в строках, относящихся к интерфейсу VF. В зависимости от версии ядра Linux и распространения на виртуальной машине сообщения могут немного отличаться, но общий поток совпадает.

[    2.327663] hv_vmbus: registering driver hv_netvsc
[    3.918902] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 added

Драйвер netvsc для eth0 зарегистрирован.

[    6.944883] hv_vmbus: registering driver hv_pci

Зарегистрирован виртуальный драйвер PCI VMbus. Этот драйвер предоставляет основные службы PCI на виртуальной машине Linux в Azure. Перед обнаружением и настройкой интерфейса VF его необходимо зарегистрировать.

[    6.945132] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI VMBus probing: Using version 0x10002
[    6.947953] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI host bridge to bus cf63:00
[    6.947955] pci_bus cf63:00: root bus resource [mem 0xfe0000000-0xfe00fffff window]
[    6.948805] pci cf63:00:02.0: [15b3:1016] type 00 class 0x020000
[    6.957487] pci cf63:00:02.0: reg 0x10: [mem 0xfe0000000-0xfe00fffff 64bit pref]
[    7.035464] pci cf63:00:02.0: enabling Extended Tags
[    7.040811] pci cf63:00:02.0: 0.000 Gb/s available PCIe bandwidth, limited by Unknown x0 link at cf63:00:02.0 (capable of 63.008 Gb/s with 8.0 GT/s PCIe x8 link)
[    7.041264] pci cf63:00:02.0: BAR 0: assigned [mem 0xfe0000000-0xfe00fffff 64bit pref]

Обнаружено устройство PCI с указанным идентификатором GUID (назначен узлом Azure). Устройству назначается идентификатор домена PCI (в данном случае это 0xcf63), основанный на идентификаторе GUID. Идентификатор домена PCI должен быть уникальным на всех устройствах PCI, доступных на виртуальной машине. Это требование уникальности охватывает другие интерфейсы VF Mellanox, графические процессоры, устройства NVMe и другие устройства, которые могут присутствовать на виртуальной машине.

[    7.128515] mlx5_core cf63:00:02.0: firmware version: 14.25.8362
[    7.139925] mlx5_core cf63:00:02.0: handle_hca_cap:524:(pid 12): log_max_qp value in current profile is 18, changing it to HCA capability limit (12)
[    7.342391] mlx5_core cf63:00:02.0: MLX5E: StrdRq(0) RqSz(1024) StrdSz(256) RxCqeCmprss(0)

ОбнаруженА виртуальная машина Mellanox, использующая драйвер mlx5. Драйвер mlx5 начинает инициализацию устройства.

[    7.465085] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF registering: eth1
[    7.465119] mlx5_core cf63:00:02.0 eth1: joined to eth0

Соответствующий искусственный интерфейс, использующий драйвер netvsc, обнаружил соответствующий VF. Драйвер mlx5 распознает, что он связан с искусственным интерфейсом.

[    7.466064] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[    7.480575] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[    7.480651] mlx5_core cf63:00:02.0 enP53091s1np0: renamed from eth1

Ядро Linux изначально назвало интерфейс eth1VF. Правило udev переименовывает его, чтобы избежать путаницы с именами, заданными синтетическим интерфейсам.

[    8.087962] mlx5_core cf63:00:02.0 enP53091s1np0: Link up

Интерфейс Mellanox VF теперь запущен и активен.

[    8.090127] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
[    9.654979] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0

Эти сообщения указывают на то, что путь к данным для соединенной пары переключен на использование интерфейса VF. Примерно через 1,6 секунды он переключается обратно на искусственный интерфейс. Такие коммутаторы могут возникать два или три раза во время запуска и являются нормальным поведением по мере инициализации конфигурации.

[    9.909128] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
[    9.910595] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
[   11.411194] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0
[   11.532147] mlx5_core cf63:00:02.0 enP53091s1np0: Disabling LRO, not supported in legacy RQ
[   11.731892] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
[   11.733216] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0

В последнем сообщении указывается, что путь к данным переключен на использование интерфейса VF. Это и ожидается при нормальной работе виртуальной машины.

Обслуживание узла Azure

Во время обслуживания узла Azure все интерфейсы VF могут быть временно удалены из виртуальной машины. После завершения обслуживания интерфейсы VF добавляются обратно на виртуальную машину. Обычная операция продолжается. Если виртуальная машина работает без интерфейсов VF, сетевой трафик продолжает направляться через искусственный интерфейс без каких-либо нарушений в работе приложений.

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

Автоматическое переключение между интерфейсом VF и искусственным интерфейсом гарантирует, что события обслуживания не беспокоят рабочие нагрузки, если приложения взаимодействуют только с искусственным интерфейсом. Задержки и загрузка ЦП могут быть выше в эти периоды из-за использования искусственного интерфейса. Продолжительность таких периодов обычно составляет около 30 секунд, но иногда может занять несколько минут.

Удаление и чтение интерфейса VF во время события обслуживания отображается в dmesg выходных данных виртуальной машины. Вот типичный пример выходных данных:

[   8160.911509] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0
[   8160.912120] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF unregistering: enP53091s1np0
[   8162.020138] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 removed

Путь к данным был переключен с использования интерфейса VF, и была отменена регистрация интерфейса VF. На этом этапе в Linux удалены все данные об интерфейсе VF и система работает так, как если бы ускорение сети не было включено.

[   8225.557263] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 added
[   8225.557867] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI VMBus probing: Using version 0x10002
[   8225.566794] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI host bridge to bus cf63:00
[   8225.566797] pci_bus cf63:00: root bus resource [mem 0xfe0000000-0xfe00fffff window]
[   8225.571556] pci cf63:00:02.0: [15b3:1016] type 00 class 0x020000
[   8225.584903] pci cf63:00:02.0: reg 0x10: [mem 0xfe0000000-0xfe00fffff 64bit pref]
[   8225.662860] pci cf63:00:02.0: enabling Extended Tags
[   8225.667831] pci cf63:00:02.0: 0.000 Gb/s available PCIe bandwidth, limited by Unknown x0 link at cf63:00:02.0 (capable of 63.008 Gb/s with 8.0 GT/s PCIe x8 link)
[   8225.667978] pci cf63:00:02.0: BAR 0: assigned [mem 0xfe0000000-0xfe00fffff 64bit pref]

Когда интерфейс VF считывается после завершения обслуживания, обнаруживается новое устройство PCI с указанным GUID. Ему назначается тот же идентификатор домена PCI (0xcf63), что и раньше. Обработка прочитанного интерфейса VF похожа на обработку во время начального запуска.

[   8225.679672] mlx5_core cf63:00:02.0: firmware version: 14.25.8362
[   8225.888476] mlx5_core cf63:00:02.0: MLX5E: StrdRq(0) RqSz(1024) StrdSz(256) RxCqeCmprss(0)
[   8226.021016] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF registering: eth1
[   8226.021058] mlx5_core cf63:00:02.0 eth1: joined to eth0
[   8226.021968] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[   8226.026631] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[   8226.026699] mlx5_core cf63:00:02.0 enP53091s1np0: renamed from eth1
[   8226.265256] mlx5_core cf63:00:02.0 enP53091s1np0: Link up

Драйвер mlx5 инициализирует интерфейс VF, и интерфейс теперь работает. Выходные данные аналогичны выходным данным во время начального запуска.

[   8226.267380] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0

Путь к данным был переключен обратно на использованием интерфейса VF.

Отключение или включение ускорения сети в нерабоспособной виртуальной машине

Вы можете отключить или включить ускоренную сеть в виртуальной сетевой сети в виртуальной виртуальной машине, отличной от запуска, с помощью Azure CLI. Например:

$ az network nic update --name u1804895 --resource-group testrg --accelerated-network false

Отключение ускоренной сети, которая включена в гостевой виртуальной машине, создает выходные dmesg данные. как и при удалении интерфейса VF для обслуживания узла Azure. Включение ускорения сети создает те же dmesg выходные данные, что и при чтении интерфейса VF после обслуживания узла Azure.

Эти команды Azure CLI можно использовать для имитации обслуживания узла Azure. Затем можно убедиться, что приложения не зависят от прямого взаимодействия с интерфейсом VF.

Следующие шаги